【问题标题】:Queries equality in Solr / Lucene在 Solr / Lucene 中查询相等性
【发布时间】:2013-07-18 07:20:52
【问题描述】:

问题:

试图识别出 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

然后可以简单的比较来判断它们是否相等。

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

感谢您的帮助。

【问题讨论】:

    标签: solr lucene normalization solrj


    【解决方案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,因此它解决了与初始查询相关的问题,不知道字段内容。

    QueryIndexReader 都没有在查询之间实现任何形式的直接比较。据我所知,您需要提供比较器。这将涉及比较任意复杂的嵌套原始查询集(原始查询包括:BooleanQueryConstantScoreQueryCustomScoreQueryDisjunctionMaxQueryFilteredQueryMatchAllDocsQueryMultiPhraseQueryMultiTermQuery、@ 987654343@, SpanQuery, TermQuery, ValueSourceQuery)


    真正的问题不在于查询本身是否天生相同,我们已经确定它们不是。我认为,更有意义的问题是它们与索引中的数据是否相同。记住这一点,一个更简单的实现是搜索每个查询,并比较每个结果集中的文档编号(可能还有分数?) (TopDocs)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多