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

然后可以简单地比较以确定它们是否相等。

或者,也许实际上存在某种能够确定两个查询是否相等的服务。我找不到任何东西。

感谢您的帮助。

4

1 回答 1

1

主要问题是那些真的不一样。

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)。

于 2013-07-18T15:49:07.080 回答