主要问题是那些真的不一样。
field1:[1 TO 3]
是一个范围查询,它可能表示字段上的字典范围,在这种情况下它将匹配field1:2abcde
,或者可能表示浮点字段上的数字范围,在这种情况下它将匹配field1:1.234
。另一个查询field1:1 field1:2 field1:3
只能匹配三个指定的值,因此这两个示例都不会匹配。
此外,由于字段可能是多值的,field1:1 field1:2 field1:3
因此同一文档中可能会有多个匹配项,这会使每个字段的评分不同。
不过,考虑一个更简单的情况,我们可以合理地确定两个查询是相同的,例如:
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
)。