Ich habe vor kurzem angefangen, ElasticSearch zu verwenden, und ich kann es scheinbar nicht schaffen, nach einem Teil eines Wortes zu suchen.
Beispiel: Ich habe drei Dokumente aus meiner Couchdb in ElasticSearch indiziert:
{
"_id" : "1",
"name" : "John Doeman",
"function" : "Janitor"
}
{
"_id" : "2",
"name" : "Jane Doewoman",
"function" : "Teacher"
}
{
"_id" : "3",
"name" : "Jimmy Jackal",
"function" : "Student"
}
Jetzt möchte ich nach allen Dokumenten suchen, die "Doe" enthalten.
curl http://localhost:9200/my_idx/my_type/_search?q=Doe
Das gibt keine Treffer zurück. Aber wenn ich suche
curl http://localhost:9200/my_idx/my_type/_search?q=Doeman
Es wird ein Dokument zurückgegeben (John Doeman).
Ich habe versucht, verschiedene Analysatoren und verschiedene Filter als Eigenschaften meines Index festzulegen. Ich habe auch versucht, eine vollständige Abfrage zu verwenden (zum Beispiel:
{
"query": {
"term": {
"name": "Doe"
}
}
}
) Aber nichts scheint zu funktionieren.
Wie kann ich ElasticSearch dazu bringen, sowohl John Doeman als auch Jane Doewoman zu finden, wenn ich nach "Doe" suche?
AKTUALISIEREN
Ich habe versucht, den nGram-Tokenizer und -Filter wie von Igor vorgeschlagen zu verwenden:
{
"index": {
"index": "my_idx",
"type": "my_type",
"bulk_size": "100",
"bulk_timeout": "10ms",
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "my_ngram_tokenizer",
"filter": [
"my_ngram_filter"
]
}
},
"filter": {
"my_ngram_filter": {
"type": "nGram",
"min_gram": 1,
"max_gram": 1
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": 1,
"max_gram": 1
}
}
}
}
}
Das Problem, das ich jetzt habe, ist, dass jede einzelne Abfrage ALLE Dokumente zurückgibt. Irgendwelche Hinweise? Die ElasticSearch-Dokumentation zur Verwendung von nGram ist nicht großartig ...