2017-02-28 79 views
0

假设我有一个由许多子句组成的复杂查询。如何准确找到每个solr匹配匹配的查询子句?

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

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

一个例子“严”查询的一部分 -

+((+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中完成这项工作?

非常感谢, 罗恩

{附: - 我使用Solr的5.3.1和solrj}

+1

我写了一个解释Solr查询的Chrome浏览器插件https://chrome.google.com/webstore/detail/solr-query-debugger/gmpkeiamnmccifccnbfljffkcnacmmdl – freedev

回答

0

最好的选择:

  1. 添加& debugQuery =忠于你
  2. 得到响应的debug.explain元素
  3. 和解析它

这是Solr中的一个已知的问题,如果你看看周围,你会发现,已经做到这一点解析(尽管可能不适合你的语言等)工具:

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

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

  1. 为您的stric创建单独的Lucene查询牛逼的条款,保留在内存中
  2. 得到文档,并创建一个MemoryIndex出它的所有查询的文档
  3. 运行,你会发现,如果文档匹配所有严格的查询或不

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

+0

听起来很不错,谢谢! 你知道这适合生产吗?有什么想法会是什么开销? – selotape

+0

开销应该取决于行参数,所以如果你得到一个小数字不应该是一个大问题,如果你得到另一方面的成千上万的结果... – Persimmonium

+0

经过一些测试,即使是最小的行(10) ,debugQuery标志导致延迟时间增加5倍,所以不适合我的用例:( – selotape

0

罗恩,

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

enter image description here

2

我目前的解决方案(在得到的希望反馈和理智核对)

要确定每个命中,如果它是“严”,我做到以下几点:

  1. 按原样执行完整查询

  2. 并行执行相同的q uery与含有严格条款(FQ = $ {strict_cluases})中,仅检索该文档ID添加的过滤器字段(FL = “ID”

  3. 对于每个打ID从查询1,如果它出现在查询2点的ID,我标志着命中为“严格”

运行两个不同的查询,比较它们引入了两个结果集太不相交(从而使比较没有实际意义)的风险,但我相信它是通过它们具有相同的分数减轻,开始&行参数。