web-dev-qa-db-ja.com

ElasticSearchのファジークエリ

私はElasticSearchを初めて使用し、現在その機能を調査しています。私が興味を持っているものの1つは、Fuzzy Queryです。これは、テスト中で使用に問題があります。これはおそらくダミーの質問なので、すでにこの機能を使用している人ならすぐに答えが見つかると思います。少なくとも私は願っています。 :)

ところで、ElasticSearchだけでなく、Luceneにも直接関係しているのではないかと感じています。

「firstindex」という名前の新しいインデックスから始めましょう。このインデックスには、値「americanfootball」のオブジェクト「label」が格納されています。これは私が使用するクエリです。

bash-3.2$ curl -XPOST 'http://localhost:9200/firstindex/node/?pretty=true' -d '{
  "node" : {
    "label" : "american football"
  }
}
'

これが私が得た結果です。

{
  "ok" : true,
  "_index" : "firstindex",
  "_type" : "node",
  "_id" : "6TXNrLSESYepXPpFWjpl1A",
  "_version" : 1
}

これまでのところ、ファジークエリを使用してこのエントリを見つけたいと思います。これは私が送るものです:

bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d '{
  "query" : {
    "fuzzy" : {
      "label" : {
        "value" : "american football",
        "boost" : 1.0,
        "min_similarity" : 0.0,
        "prefix_length" : 0
      }                       
    }    
   }   
}
'

そしてこれが私が得た結果です

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

ご覧のとおり、ヒットはありません。しかし、今、クエリの値を「american football "」から「american footb」に少し縮小すると、次のようになります。

bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d ' {
  "query" : {
    "fuzzy" : {
      "label" : {
        "value" : "american footb",
        "boost" : 1.0,
        "min_similarity" : 0.0,
        "prefix_length" : 0
      }
    }
  }
}
'

次に、エントリで正しいヒットが得られるため、結果は次のようになります。

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.19178301,
    "hits" : [ {
      "_index" : "firstindex",
      "_type" : "node",
      "_id" : "6TXNrLSESYepXPpFWjpl1A",
      "_score" : 0.19178301, "_source" : {
        "node" : {
          "label" : "american football"
        }
      }
    } ]
  }
}

したがって、このテストに関連するいくつかの質問があります。

  1. 値を使用してクエリを実行しても結果が得られなかった理由は、私の唯一のエントリ「american football "」と完全に同じです。

  2. それは私が複数の単語の価値を持っているという事実に関連していますか?

  3. クエリ結果の「類似性」スコアを取得して、ファジークエリの適切なしきい値を見つける方法をよりよく理解できるようにする方法はありますか?

  4. ElasticSearch Webサイトにファジークエリ専用のページがありますが、ファジークエリに使用できるすべての潜在的なパラメータがリストされているかどうかはわかりません。私はそのような網羅的なリストを見つけることができましたか?

  5. 実際には他のクエリについても同じ質問です。

  6. ファジーマッチングを取得するためにlucene構文を使用するファジークエリクエリ文字列クエリの間に違いはありますか?

21
A_dit_rien

1.1。

ファジークエリは用語に基づいて動作します。テキストを分析しないため、フレーズを処理できません。したがって、あなたの例では、elasticsearchは「アメリカンフットボール」という用語をアメリカンという用語およびフットボールという用語に一致させようとします。用語間の一致は レーベンシュタイン距離 に基づいており、これは 類似度スコアの計算 に使用されます。 min_similarity = 0.0であるため、編集距離が最小の用語のサイズよりも小さい限り、どの用語も任意の用語と一致する必要があります。あなたの場合、「アメリカンフットボール」という用語のサイズは17で、「アメリカン」という用語のサイズは8です。これら2つの用語間の距離は9であり、最小の用語8のサイズよりも大きくなります。用語は拒否されています。 「americanfootb」と「american」の間の編集距離は6です。これは基本的に「american」という用語で、最後に6つ追加されています。それが結果を生み出す理由です。 min_similarity = 0.0の場合、編集距離が7以下のほとんどすべてが一致します。たとえば、「aqqqqqq」を検索しているときにも結果が得られます。

2.2。

はい、上で説明したように、それはマルチワード値にいくらか関連しています。複数の用語を検索する場合は、 Fuzzy Like This Query および Text Query のあいまいさパラメータを確認してください。

4&5。

通常、elasticsearch.orgに次ぐ最良の情報源はelasticsearchソースコードです。

45
imotov