主な問題は、それらが実際には同一ではないことです。
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
私の知る限り、コンパレータを提供する必要があります。これには、任意に複雑なネストされたプリミティブ クエリのセットの比較が含まれます (プリミティブ クエリにはBooleanQuery
、ConstantScoreQuery
、CustomScoreQuery
、DisjunctionMaxQuery
、FilteredQuery
、MatchAllDocsQuery
、MultiPhraseQuery
、MultiTermQuery
、PhraseQuery
、SpanQuery
が含まTermQuery
れますValueSourceQuery
) 。
本当に問題は、クエリ自体が本質的に同一であるかどうかではなく、そうではないことを証明しました。より意味のある質問は、インデックス内のデータに関してそれらが同一であるかどうかです。そのことを念頭に置いて、各クエリで検索し、各結果セットのドキュメント番号 (および場合によってはスコア?) を比較するのが、はるかに簡単な実装です ( TopDocs
)。