web-dev-qa-db-ja.com

ElasticSearchの完全一致

私は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'}
14
Josh Harrison

デフォルトでは、フィールドは標準アナライザーで分析されます。完全一致を確認したい場合は、分析されていないフィールドを保存することもできます。例:

"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をクエリできます。

13
runarM

検索する必要のある2つの値をハッシュキーにハッシュしてから検索します。

0
Danny Yang

あなたの問題は、フィールドtermが標準アナライザーで分析され(マッピングを確認)、thethatなどのストップワードをフィルタリングしていることだと思います。そのため、DogThe Dogで同じスコアが得られます。したがって、カスタムアナライザーを構成することで問題を解決できるかもしれません=> ドキュメントページ

0
moliware