【问题标题】:Solr: how to mark the query conditions matched in the resultSolr:如何在结果中标记匹配的查询条件
【发布时间】:2014-10-27 18:50:28
【问题描述】:

我的 solr 实现有这样的查询

q=(field1:ipod and field2:black) OR (field3:'苹果电脑') OR (field4:working)

这里基本上有 3 个条件,用“或”分隔。当我运行这个查询时,我得到了结果。在结果中,我想看看满足了三个条件中的哪一个。例如,除了返回的数据(自定义字段)之外的结果中,我特别希望每个返回的文档都有 cond1=true、cond2=true、cond3=false。

假设不对这些字段(1 到 4)进行分析。所有字段都是字符串。索尔 4.6.1。分布式。

尝试过的解决方案(但没有令人满意的结果):

  1. debugquery=true 似乎提供了太多冗长的信息(请解释 字段),我不感兴趣,我正在寻找简单的字段 要添加。我可以得到这些调试 xml-ized 进行解析,但是 复杂的正常处理。
  2. group by (group.query) 选项将通过在 group.query 中提供条件来帮助我们按条件分组,这对我来说不是最佳选择,但只是尝试过。但它似乎不适用于分布式模式 (SOLR-5046)
  3. 添加字段函数查询,不能像 _cond1_:if(field1=='ipod' and field2=='black') 那样对字符串进行简单的字段相等性检查。我猜在函数查询中没有这样的相等性检查。

这里还有其他选项解决方案吗?我应该在这里写自定义相似度还是自定义 Doc 转换器?

【问题讨论】:

标签: solr lucene solr4


【解决方案1】:

https://cwiki.apache.org/confluence/display/solr/Function+Queries得到提示

您可以在查询中使用以下 fl 参数:

fl=*,firstmatch:if(and(termfreq(field1,'ipod'),termfreq(field2,'black')),1,0),
secondmatch:if(termfreq(field3,'apple computer')),1,0),
thirdmatch:if(termfreq(field4,'working'),1,0)

(新行仅是为了清楚起见)

这应该为您提供三个字段,其中 1 或 0 进行匹配。

基本思想是您可以在fl 字段中使用函数查询来获取特定值。 firstmatchsecondmatchthirdmatch 名称只是别名。

顺便说一句,由于您提到所有字段都是字符串,因此您需要在任何地方进行完全匹配。

【讨论】:

  • 您知道在termfreq fq 中使用通配符的方法吗?所以你可以使用termfreq(text, manage*) 来匹配“Manager”、“Manage”和“Management”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2012-01-18
  • 2013-04-27
  • 2011-11-26
  • 2016-10-08
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多