私は最近ElasticSearchを使い始めましたが、単語の一部を検索させることができません。
例:ElasticSearchでインデックス付けされたcouchdbからの3つのドキュメントがあります。
{
"_id" : "1",
"name" : "John Doeman",
"function" : "Janitor"
}
{
"_id" : "2",
"name" : "Jane Doewoman",
"function" : "Teacher"
}
{
"_id" : "3",
"name" : "Jimmy Jackal",
"function" : "Student"
}
それでは、「Doe」を含むすべてのドキュメントを検索します
curl http://localhost:9200/my_idx/my_type/_search?q=Doe
それはヒットを返しません。しかし、私が検索した場合
curl http://localhost:9200/my_idx/my_type/_search?q=Doeman
1つのドキュメント(John Doeman)を返します。
インデックスのプロパティとして、さまざまなアナライザーとさまざまなフィルターを設定してみました。また、本格的なクエリを使用してみました(例:
{
"query": {
"term": {
"name": "Doe"
}
}
}
)しかし、何も機能しないようです。
「Doe」を検索するときに、ElasticSearchでJohn DoemanとJane Doewomanの両方を検索するにはどうすればよいですか?
更新
私は、Igorが提案したように、nGramトークナイザーとフィルターを次のように使用しようとしました:
{
"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
}
}
}
}
}
私が今持っている問題は、すべてのクエリがすべてのドキュメントを返すということです。ポインタはありますか?nGramの使用に関するElasticSearchのドキュメントは適切ではありません...