2014-01-16 16 views
6

私の弾性検索インデックスには、同じ位置に複数のトークンを持つドキュメントがあります。弾性検索:すべての位置に一度だけ一致します

すべての位置で少なくとも1つのトークンが一致したときにドキュメントを取得したいと考えています。 トークンの順序は重要ではありません。 これをどのように達成できますか?私はElasticsearch 0.90.5を使用します。

例:

Iインデックス、このような文書。

{ 
    "field":"red car" 
} 

私は、元のトークンと同じ位置に同義語を追加する同義語トークンフィルタを使用します。

  • ポジション1:
  • "赤" のポジション2: "車"、 "自動車"

今の私のソリューション: は、だから今分野では、2箇所があります

すべての位置が確実に一致するように、私は最大位置もインデックス化します。

{ 
    "field":"red car", 
    "max_position": 2 
} 

IはDefaultSimilarityから延び、(1つのTFを返すカスタム類似性を有する)、IDF()とlengthNorm()。得られたスコアは、フィールド内の一致する用語の数です。

問合せ:私の解決策と

{ 
    "custom_score": { 
     "query": { 
      "match": { 
       "field": "a car is an automobile" 
      } 
     }, 
     "_script": "_score*100/doc[\"max_position\"]+_score" 
    }, 
    "min_score":"100" 
} 

問題:クエリ文字列にはトークン「赤」が存在しないため

上記の検索では、ドキュメントにマッチしてはなりません。しかし、Elasticsearchは車と自動車の試合を2試合でカウントし、スコアが2になるため、102のスクリプトスコアが得られ、「min_score」を満たしているため一致します。

答えて

0

クエリの用語との一致が100%一致するようにする必要がある場合は、を使用してください。これはより一般的なケースです。


残念ながら、あなたのケースでは、あなたはインデックス付き用語の100%のマッチを提供したいです。これを行うには、クエリーDSLに公開されていない低レベルのインデックス情報にアクセスする必要があるため、Luceneレベルにドロップしてカスタム(java-here's boilerplate you can fork)類似性クラスを作成する必要があります。

に一致分析の用語

  • 番号(オーバーラップは、それがDefaultSimilarityクラスのCOORD()メソッドが使用され、Luceneの用語である)の
  • 番号:クエリ得点にスキャンした文書/フィールド当たりフィールド内の分析された用語の合計:このスレッドを見てくださいこの情報を取得するためのerentの方法:How to count the number of terms for each document in lucene index?

その後、カスタムの類似性は、(あなたはおそらくDefaultSimilarityを拡張することができます)用語は < 総用語にマッチしたクエリを検出し、ゼロで自分のスコアを乗算する必要があります。

このレベルのスコアリングではクエリとインデックス時間の分析が既に行われているため、インデックス用語の総数はクエリの用語と同様に同義語を含めるように既に拡張されていますので、偽陽性を避けて"自動車 "上記の問題。

関連する問題