Ich versuche eine Autocomplete-Funktion mit angularjs und elasticsearch für ein bestimmtes Feld zu erstellen, zum Beispiel countryname
. Es kann einfache Namen wie "Frankreich", "Spanien" oder "zusammengesetzte Namen" wie "Sierra Leone" enthalten.elasticsearch mapping tokenizer Schlüsselwort, um Token zu vermeiden und die Verwendung von Wildcard zu ermöglichen
In der Abbildung dieses Feld not_analyzed
zu verhindern elastische zu tokenize „komponierten Namen“
"COUNTRYNAME" : {"type" : "string", "store" : "yes","index": "not_analyzed" }
ich abfragen Elasticsearch müssen, ist:
- filtern das Dokument mit so etwas wie „COUNTRY: Wert "where Wert kann Platzhalter
- enthalten und eine Aggregation für den vom Filter zurückgegebenen Ländernamen vornehmen (ich mache Aggregation, um nur eindeutige Daten zu erhalten, die Zählung ist für mich nutzlos, vielleicht die re eine bessere Lösung) ist
Ich kann nicht Wildcard mit dem „not_analyzed“ Feld verwenden:
diese meine Frage ist aber Platzhalter in „Wert“ Variable funktioniert nicht und es ist Fall empfindlich:
Die Wildcard allein ihre Arbeit:
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
aber das funktioniert nicht (Franken *):
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"query_string": {
"query": "COUNTRYNAME:Franc*"
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
Ich habe auch versucht mit bool must query
aber nicht mit diesem not_analyzed Feld und Wildcard arbeiten:
curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
"fields": [
"COUNTRYNAME"
],
"query": {
"bool": {
"must": [
{
"match": {
"COUNTRYNAME": "Franc*"
}
}
]
}
},
"aggs": {
"general": {
"terms": {
"field": "COUNTRYNAME",
"size": 0
}
}
}
}'
Was mir persönlich fehlt oder falsch? sollte ich das Feld analyzed
im Mapping verlassen und einen anderen Analysator verwenden, der zusammengesetzten Namen nicht in Token spaltet?
Dank @Anainlb für Lösung. Das hat für meinen ähnlichen Fall funktioniert. – hemu
froh, dass es hilft. Fühlen Sie sich frei, jede Verbesserung zu teilen;) – AlainIb
@AlainIb Es war meine Schuld, wie Sie sehen können, das 'ng-Modell' sollte innerhalb '' Tag sein, aber es war innerhalb '