主要问题是它们确实不完全相同。
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、@ 987654343@, SpanQuery, TermQuery, ValueSourceQuery)
真正的问题不在于查询本身是否天生相同,我们已经确定它们不是。我认为,更有意义的问题是它们与索引中的数据是否相同。记住这一点,一个更简单的实现是搜索每个查询,并比较每个结果集中的文档编号(可能还有分数?) (TopDocs)。