あなたの問題が「バー」の同義語を間違って定義したことが原因であるかどうかはわかりません。あなたがかなり新しいと言ったように、私はあなたに似た例を挙げます。Elasticsearch が検索時とインデックス時にシノニムをどのように処理するかを示したいと思います。それが役に立てば幸い。
まず、シノニム ファイルを作成します。
foo => foo bar, baz
次に、テストしようとしている特定の設定でインデックスを作成します。
curl -XPUT 'http://localhost:9200/test/' -d '{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "synonyms.txt"
}
}
}
}
},
"mappings": {
"test" : {
"properties" : {
"text_1" : {
"type" : "string",
"analyzer" : "synonym"
},
"text_2" : {
"search_analyzer" : "standard",
"index_analyzer" : "standard",
"type" : "string"
},
"text_3" : {
"type" : "string",
"search_analyzer" : "synonym",
"index_analyzer" : "standard"
}
}
}
}
}'
synonyms.txt は構成ファイルと同じディレクトリにある必要があることに注意してください。これは、そのパスが構成ディレクトリに対して相対的であるためです。
ドキュメントのインデックスを作成します。
curl -XPUT 'http://localhost:9200/test/test/1' -d '{
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}'
今検索
フィールド text_1 での検索
curl -XGET 'http://localhost:9200/test/_search?q=text_1:baz'
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.15342641,
"_source": {
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}
}
]
}
}
baz は foo のシノニムであり、インデックス時に foo がそのシノニムで展開されるため、ドキュメントを取得します
フィールド text_2 での検索
curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz'
結果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
索引作成時に同義語を展開しなかったため、ヒットしません (標準アナライザー)。また、baz を検索していて、テキストに baz が含まれていないため、結果が得られません。
フィールド text_3 での検索
curl -XGET 'http://localhost:9200/test/_search?q=text_3:foo'
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.15342641,
"_source": {
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}
}
]
}
}
注: text_3 は「baz dog cat」です。
text_3 は同義語を展開しないインデックスでした。同義語の 1 つとして「baz」を持つ foo を検索していると、結果が得られます。
デバッグしたい場合は_analyze
、たとえば次のようにエンドポイントを使用できます。
curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true'
結果:
{
"tokens": [
{
"token": "foo",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 1
},
{
"token": "baz",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 1
},
{
"token": "bar",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 2
}
]
}