0

問題:

2 つの異なるクエリが実際には同じであることを認識しようとしています。

例えば:

field1:[1 TO 3] OR field1:5

実際には次と同じクエリです。

field1:5 OR field1:1 OR field1:3 OR field1:2

アイデア:

正規化された後、単純な文字列比較でうまくいくように、クエリを何らかの正規形式に正規化する方法はありますか?

たとえば、上記の例では、両方のクエリが次のようになります。

field1:1 OR field1:2 OR field1:3 OR field1:5

そして、単純に比較して、それらが等しいかどうかを判断できます。

あるいは、2 つのクエリが等しいかどうかを判断できる何らかのサービスが実際に存在する可能性もあります。何も見つかりませんでした。

助けてくれてありがとう。

4

1 に答える 1

1

主な問題は、それらが実際には同一ではないことです。

field1:[1 TO 3]は範囲クエリであり、フィールドの辞書式範囲を表している場合は に一致field1:2abcdeするか、浮動小数点フィールドの数値範囲を表している場合は に一致しfield1:1.234ます。もう 1 つのクエリ はfield1:1 field1:2 field1:3、指定された 3 つの値にしか一致しないため、これらの 2 つの例はいずれも一致しません。

field1:1 field1:2 field1:3また、フィールドは多値である可能性があるため、同じドキュメント内で複数のフィールドが一致する可能性があり、それぞれのスコアリングが異なります。

ただし、より単純なケースを検討するために、次のように、合理的に同一であると確信できる 2 つのクエリはどうでしょうか。

  • field2:this field1:that
  • field1:that field2:this

これらは、少なくともStandardQueryParser!とは確かに同一です。

クエリ パーサーを使用してクエリを実行すると、Query. 最終的なクエリを文字列に変換することは、うまく機能しない傾向があります。これは、クエリ パーサーの構文がどのような種類のクエリ オブジェクトも表現できないQuery.toString()ためです (実際にはデバッグに使用するのが最適です)。

したがって、オブジェクトを比較する必要がありQueryます。

の出力がQuery.rewrite()最も比較しやすいと思います。これにより、掘り下げるための一連の基本的なクエリが提供されます。これにより、範囲クエリに必要な TermQueries が提供されるため、フィールドの内容がわからない最初のクエリに関連する問題を回避できます。

クエリ間の直接比較の形式Queryも実装もしていません。IndexReader私の知る限り、コンパレータを提供する必要があります。これには、任意に複雑なネストされたプリミティブ クエリのセットの比較が含まれます (プリミティブ クエリにはBooleanQueryConstantScoreQueryCustomScoreQueryDisjunctionMaxQueryFilteredQueryMatchAllDocsQueryMultiPhraseQueryMultiTermQueryPhraseQuerySpanQueryが含まTermQueryれますValueSourceQuery) 。


本当に問題は、クエリ自体が本質的に同一であるかどうかではなく、そうではないことを証明しました。より意味のある質問は、インデックス内のデータに関してそれらが同一であるかどうかです。そのことを念頭に置いて、各クエリで検索し、各結果セットのドキュメント番号 (および場合によってはスコア?) を比較するのが、はるかに簡単な実装です ( TopDocs)。

于 2013-07-18T15:49:07.080 に答える