Elasticsearchの完全一致クエリ(ファジーではない)

Nov 24 2020

文字列フィールドに対して次のクエリがあります。

const query = {
        "query": {
          "match_phrase": {
            name:  "ron"
          }
        },
        "from": 0,
        "size": 10
      };

これらは私がデータベースに持っている名前です

1. "ron"
2. "ron martin"
3. "ron ron"
4. "ron howard"

このクエリの結果は非常にあいまいで、行番号1のみではなく、すべての行が返されます。「等しい」ではなく「含む」を実行しているようなものです。

ありがとう

回答

1 ESCoder Nov 24 2020 at 15:08

あなたの場合、すべてのドキュメントが含まれているため、すべてのドキュメントが返さronれます。

正確なフィールドのみが一致するようにしたい場合はkeywordnameフィールドにサブフィールドを追加する必要があります。これは、標準アナライザーの代わりにキーワードアナライザーを使用します(".keyword「後」nameフィールドに注意してください)。以下のクエリを試してください-

インデックスマッピング:

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

インデックスデータ:

{
    "name":"ron"
}
{
    "name":"ron martin"
}
{
    "name":"ron ron"
}
{
    "name":"ron howard"
}
{
    "name": "john howard"
}

検索クエリ:

{
  "query": {
    "match_phrase": {
      "name.keyword": "ron"
    }
  },
  "from": 0,
  "size": 10
}

検索結果:

"hits": [
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.2039728,
        "_source": {
          "name": "ron"
        }
      }
    ]

アップデート1:

以下のコメントに基づいて、完全一致とあいまい一致の両方を(要件に応じて)検索する場合は、multi_matchクエリを使用できます。

検索クエリ:

{
  "query": {
    "multi_match": {
      "query": "howard",
      "fields": [
        "name",
        "name.keyword"
      ],
      "type": "phrase"
    }
  }
}

検索結果:

"hits": [
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.83740485,
        "_source": {
          "name": "ron howard"
        }
      },
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "5",
        "_score": 0.83740485,
        "_source": {
          "name": "john howard"
        }
      }
    ]