[ES] ES 7.6ファジー検索(ファジー検索)

ここに写真の説明を挿入

1。概要

転載:https//www.cnblogs.com/sanduzxcvbnm/p/12085219.html

実際の検索では、タイプミスが発生して検索に失敗することがあります。Elasticsearchでは、fuzzy属性を使用してファジークエリを実行し、検索にタイプミスがある状況を実現できます。

一致クエリには「fuziness」属性があります。「0」、「1」、「2」、「auto」のいずれかに設定できます。「自動」は、クエリ用語の長さに基づいて距離を定義する推奨オプションです。

2.ファジークエリ

Levenshteinの編集距離で測定された、検索語に類似した単語を含むドキュメントを返します。

編集距離は、ある用語を別の用語に変換するために必要な文字変更の数です。これらの変更には、次のものが含まれます。

更改字符(box→fox)
删除字符(black→lack)
插入字符(sic→sick)
转置两个相邻字符(act→cat

類似の単語を見つけるために、ファジークエリは、指定された編集距離内で検索語のすべての可能な変更または拡張のセットを作成します。次に、クエリは各展開の完全一致を返します。

3.例

まず、次のドキュメントをfuzzyindexインデックスに入力します。

PUT fuzzyindex/_doc/1
{
    
    
  "content": "I like blue sky"
}

今回は、以下の検索を行います。

GET fuzzyindex/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "content": "ski"
    }
  }
}

「青い空が好き」の参加者の後にスキーという言葉がないため、検索結果が表示されません。

{
    
    
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

このとき、次の検索を使用すると、次のようになります。

GET fuzzyindex/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "content": {
    
    
        "query": "ski",
        "fuzziness": "1"
      }
    }
  }
}

表示される結果は次のとおりです。

{
    
    
  "took" : 18,
  "timed_out" : false,
  "_shards" : {
    
    
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    
    
    "total" : {
    
    
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.19178805,
    "hits" : [
      {
    
    
        "_index" : "fuzzyindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.19178805,
        "_source" : {
    
    
          "content" : "I like blue sky"
        }
      }
    ]
  }
}

明らかに、必要な結果が見つかりました。これは、空とスキーの時間の違いが1文字しかないためです。

同様に、「自動」オプションを選択すると、次のように表示されます。

GET fuzzyindex/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "content": {
    
    
        "query": "ski",
        "fuzziness": "auto"
      }
    }
  }
}

上記と同じ結果を示しています。マッチングすることもできます。

次のように一致する場合:

   GET fuzzyindex/_search
    {
    
    
      "query": {
    
    
        "match": {
    
    
          "content": {
    
    
            "query": "bxxe",
            "fuzziness": "auto"
          }
        }
      }
    }

その場合、どの結果とも一致しませんが、次の検索を実行すると、次のようになります。

GET fuzzyindex/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "content": {
    
    
        "query": "bxxe",
        "fuzziness": "2"
      }
    }
  }
}

次の形式を使用することもできます。

  GET /_search
    {
    
    
        "query": {
    
    
            "fuzzy": {
    
    
                "content": {
    
    
                    "value": "bxxe",
                    "fuzziness": "2"
                }
            }
        }
    }

次に、検索結果を表示できます。これは、2つの編集エラーを許容できるためです。

あいまいさはスペルミスの簡単な解決策ですが、CPUオーバーヘッドが高く、精度が非常に低くなります。

おすすめ

転載: blog.csdn.net/qq_21383435/article/details/108939468