1

そのため、nGram マッチングを ElasticSearch インデックスに追加しようとしましたが、次の問題が発生しています。

標準の文字列クエリを実行すると、完全一致のみが返されます。特定のテストフィールドで一致クエリを実行すると、期待どおりの nGram 一致が生成されます。

これら(1) の例(2)に基づいて、フィールドに nGram フィルターとアナライザーをセットアップします。マッピング コードは次のとおりです。

tire.settings :number_of_shards => 1,
      :number_of_replicas => 1,
      :analysis => {
        :analyzer => {
          "str_search_analyzer" => {
            "tokenizer" => "keyword",
            "filter" => "lowercase"
          },
          "str_index_analyzer" => {
            "tokenizer" => "keyword",
            "filter" => ["lowercase","substring"]
          }
        },
        :filter => {
          :substring => {
            "type" => "nGram",
            "min_gram" => 1,
            "max_gram" => 10
          }
        }
      } do
      mapping do
        indexes :test, :type=>'string',
                :search_analyzer => :str_search_analyzer,
                :index_analyzer=>:str_index_analyzer
      end
    end

  def to_indexed_json
    #adding known word plus random string for testing
    { 
      :test => "pizza" + (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
    }.to_json
  end

エラスティックサーチ クエリ

結果を生成するクエリ:

curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"text":{"test":{"query":"piz"}}}}'

結果を生成しないクエリ:

curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"query_string":{"query":"pizz"}}}'

特定の列でテキスト/一致検索を実行するのではなく、一般的な query_string 検索ですべてのインデックス付きフィールドを調べて ngram と一致させる方法はありますか?

4

1 に答える 1

4

これは予期される動作です。デフォルトでは、「_all」フィールドに対して「query_string」クエリが実行されます。また、このフィールドは StandardAnalyzer を使用してインデックス付けされるため、そのインデックス付けされたトークンは、「テスト」フィールド (nGram アナライザーを使用するように構成したもの) のトークンとは異なります。

この動作を変更するには、いくつかの方法があります。

  1. インデックス設定のマッピングを変更し、「_all」フィールドの nGram アナライザーを構成します
  2. ドキュメントの一部として「_analyzer」フィールドを送信します (明示的なアナライザーが構成されていないすべてのフィールドに対して選択され、使用されます)
  3. 「fields」属性を使用して、「query_string」を実行するフィールドを指定します

上記の 3 つのオプションすべてから、#3 が最も推奨されます。フィールドを明示的に指定すると、データをより詳細に制御できます (データのインデックス付けとクエリの方法)。

于 2012-08-24T19:09:17.453 に答える