web-dev-qa-db-ja.com

Elasticsearchクエリが完全に一致しない

以下の一致クエリを使用してelasticsearchを検索していますが、完全一致ではなく、さらに重要でない一致も表示されます。

elasticsearch6.2.3を使用しています

以下の私の質問を見つけてください

get items/_search
{
   "query" : {
      "match" : {
         "code" : "7000-8900"
      }
   }
}

matchクエリから取得している応答を見つけてください

7000-8900
7000-8002-WK
7000-8002-W
4
Karthikeyan

ドキュメントで説明されているように、matchの代わりに term クエリを使用する必要があります。

用語クエリは、転置インデックスで指定された正確な用語を含むドキュメントを検索します

したがって、クエリを次のように変更する必要があります。

get items/_search
{
   "query" : {
      "term" : {
         "code.keyword" : "7000-8900"
      }
   }
}

結果が得られない場合は、次の2つの可能性があります。

  • 検索された用語は、実際に考えているものではありません(たとえば、トリミングされていません)
  • インデックスには明示的なマッピングがなく、自動マッピングはフィールドコードを文字列として認識しませんでした。

注:マッピングが正しく、コードが用語フィールドである場合は、「コード」を使用できます。マッピングが自動であり、マッピングがそれをテキストとして認識する場合は、「code.keyword」を使用する必要があります

このメソッドを試すことができます。このクエリは完全一致レコードを返します。

import json
from elasticsearch import Elasticsearch

es = Elasticsearch('http://localhost:9200')
res = es.search(index="test_index", doc_type="test_doc", body=json.dumps({"query": {"match_phrase": {"name": "Jhon"}}})))
0
waruna k

試合でも同じ問題があったので、用語を使ってみました。しかし、それは悪い習慣です。 ESによると、文字列照合に用語を使用するべきではありません。

フィールドをキーワードとして指定した場合、一致はとにかく完全一致を行います。

フィールドをキーワードとして定義していない場合でも、次のようにクエリを実行できます。

get items/_search
{
   "query" : {
      "match" : {
         "code.keyword" : "7000-8900"
      }
   }
}
0
Sándor Tóth