私はelasticsearchを使用していて、完全一致を実現するのに時間の悪魔がいます。 match、query_stringなどのさまざまな組み合わせを試しましたが、何も得られないか、悪い結果が得られました。クエリは次のようになります。
{
"filter": {
"term": {
"term": "dog",
"type": "main"
}
},
"query": {
"match_phrase": {
"term": "Dog"
}
},
"sort": [
"_score"
]
}
ソートされた結果
10.102211 {u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506}
10.102211 {u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664}
10.102211 {u'term': u'Dog', u'type': u'main', u'conceptid': 144}
7.147442 {u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'}
もちろん、「The Dog」、「That Dog」、「Dog」のスコアはすべて同じですが、正確に一致する「Dog」のスコアを上げる方法を理解する必要があります。
私も試しました
{
"sort": [
"_score"
],
"query": {
"bool": {
"must": [
{
"match": {
"term": "Dog"
}
},
{
"match_phrase": {
"term": {
"query": "Dog",
"boost": 5
}
}
}
]
}
},
"filter": {
"term": {
"term": "dog",
"type": "main"
}
}
}
しかし、それでも私に
11.887239 {u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506}
11.887239 {u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664}
11.887239 {u'term': u'Dog', u'type': u'main', u'conceptid': 144}
8.410372 {u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'}
デフォルトでは、フィールドは標準アナライザーで分析されます。完全一致を確認したい場合は、分析されていないフィールドを保存することもできます。例:
"dog":{
"type":"multi_field",
"fields":{
"dog":{
"include_in_all":false,
"type":"string",
"index":"not_analyzed",
"store":"no"
},
"_tokenized":{
"include_in_all":false,
"type":"string",
"index":"analyzed",
"store":"no"
}
}
}
次に、完全一致についてdog-fieldにクエリを実行し、分析されたクエリ(フルテキストなど)に対してdog._tokenizedをクエリできます。
検索する必要のある2つの値をハッシュキーにハッシュしてから検索します。
あなたの問題は、フィールドterm
が標準アナライザーで分析され(マッピングを確認)、the
やthat
などのストップワードをフィルタリングしていることだと思います。そのため、Dog
とThe Dog
で同じスコアが得られます。したがって、カスタムアナライザーを構成することで問題を解決できるかもしれません=> ドキュメントページ