如何找到每个solr命中匹配的查询子句?

时间:2017-02-28 20:52:21

标签: elasticsearch solr solrj

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

查询子句可以分为" strict"条款和"一般搜索",不太重要的条款。

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

一个例子"严格"查询的一部分 -

+((+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允许我标记strict子句,然后验证每个命中符合哪个子句。

如何在Solr中完成此操作?

非常感谢, 罗恩

{P.S。 - 我使用solr 5.3.1和solrj}

3 个答案:

答案 0 :(得分:2)

我当前的解决方案(希望获得反馈和理智检查)

如果是“严格”,要决定每次点击,我会执行以下操作:

  1. 按原样执行完整查询

  2. 同时,使用包含strict子句( fq = $ {strict_cluases} )的已添加过滤器字段执行相同的查询,仅检索文档ID( fl =“ ID“

  3. 对于查询1中的每个匹配ID,如果它出现在查询2 ID中,我将匹配标记为“严格”
  4. 运行两个不同的查询并比较它们会导致两个结果集过于分离的风险(从而使得比较没有实际意义),但我相信它们可以通过具有相同分数,开始和放大来减轻它们。行参数。

答案 1 :(得分:0)

最佳选择:

  1. 将& debugQuery = true添加到您的
  2. 获取响应的debug.explain元素
  3. 并解析它
  4. 这是一个已知的Solr问题,如果你环顾四周,你会发现已经进行过这种解析的工具(虽然可能不适合你的语言等):

    编辑:让我提出一个你可能尝试的完全不同的方法:

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

    1. 为您的strict子句创建单独的Lucene查询,将其保留在内存中
    2. 获取文档,并从中创建一个MemoryIndex
    3. 在文档上运行所有查询,您会发现文档是否与所有严格查询匹配
    4. 也许这比使用debugQuery更快......

答案 2 :(得分:0)

罗恩,

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

enter image description here