【问题标题】:How do I find exactly which query clauses matched for each solr hit?如何准确找到与每个 solr 匹配的查询子句?
【发布时间】:2017-02-28 20:52:20
【问题描述】:

假设我有一个由许多子句组成的复杂查询。

查询子句可以分为“严格”子句和“一般搜索”,次要子句。

我想知道,在不依赖相关性分数的情况下,哪些文档与严格部分完全匹配,即哪个文档满足所有确切要求,哪些文档由于一般搜索而被视为命中。

查询的“严格”部分示例 -

+((+field1.subf1:val1 ConstantScore(field1.subf2.subf3.subf4:"[* TO *]" field1.subf2.subf5:true))^10.0) ((title:"Lorem ipsum dolor sit amet")^0.05) (#((+field1.subf1:val1 ConstantScore(field1.subf2.subf3.subf4:"[* TO *]" field1.subf2.subf5:true))~100^10.0))

在 Elasticsearch 中,named queries 允许我标记严格的子句,然后为每个命中验证满足哪个子句。

如何在 Solr 中完成此操作?

非常感谢, 罗恩

{p.s. - 我正在使用 solr 5.3.1 和 solrj}

【问题讨论】:

标签: elasticsearch solr solrj


【解决方案1】:

我目前的解决方案(希望得到反馈和完整性检查)

要确定每个命中是否“严格”,我执行以下操作:

  1. 按原样执行完整查询

  2. 并行执行相同的查询,添加一个包含严格条款 (fq=${strict_cluases}) 的过滤器字段,仅检索文档 ID (fl=" id")

  3. 对于来自查询 1 的每个命中 id,如果它出现在查询 2 id 中,我将命中标记为“严格”

运行两个不同的查询并比较它们会带来两个结果集太不相交的风险(因此使比较没有意义),但我相信它们具有相同的分数、开始和行参数可以减轻这种风险。

【讨论】:

    【解决方案2】:

    罗恩,

    使用 Solr 管理控制台。您将找到查询窗口。提供您的查询字符串并检查调试查询。在响应中,您将准确找到匹配的文档以及最佳匹配的最高分数。您需要查看最高分数的解释,这将告诉您查询匹配的部分。严格或正常!

    【讨论】:

      【解决方案3】:

      最佳选择:

      1. 将 &debugQuery=true 添加到您的
      2. 获取响应的 debug.explain 元素
      3. 并解析它

      这是 Solr 的一个已知问题,如果您环顾四周,您会发现已经执行此解析的工具(尽管可能不适合您的语言等):

      编辑:让我提出一种您可以尝试的完全不同的方法:

      根本不要使用 debugQuery,对于您需要处理的少数顶级文档,请执行以下操作:

      1. 为您的严格条款创建单独的 Lucene 查询,将它们保存在内存中
      2. 获取文档,并从中创建一个 MemoryIndex
      3. 在文档上运行所有查询,您会发现文档是否匹配所有严格查询

      也许这比使用 debugQuery 更快...

      【讨论】:

      • 听起来不错,谢谢!你知道这有多适合生产吗?知道这样做的开销是多少吗?
      • 开销应该取决于行参数,所以如果你得到一个小数字不应该是一个大问题,如果你得到数千个结果......
      • 经过一些测试,即使对于最少的行 (10),debugQuery 标志也会导致延迟增加 5 倍,因此不适合我的用例 :(
      • 哎哟...我用另一种方法编辑了你可能会尝试,也许值得一试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多