如何告诉Solr返回每个文档的命中搜索条件?

tbm*_*msu 14 solr term-document-matrix

我对Solr中的查询有疑问.当我使用多个搜索术语执行查询时,所有搜索术语都通过OR逻辑链接(例如q=content:(foo OR bar OR foobar)),而Solr则返回所有符合这些术语的文档列表.但Solr 没有回复的是哪个文件被哪些术语击中.所以在上面的例子中,我想知道的是我的结果列表中的哪些文档包含术语foo等.根据这些信息,我将能够创建一个术语 - 文档矩阵.

所以我的问题是:我怎么能告诉Solr给我那些丢失的信息呢?我确定它在某个地方,否则搜索作为一个整体是行不通的.但是我错过了什么?谢谢你的帮助.

PS:作为一种解决方法,我正在为所有搜索词执行单个Solr查询.但是你可以想象它在性能问题上是一个灾难,因为搜索条件的数量可以超过50 :(

Mat*_*ndh 15

这取决于您的要求,但据我所知,在Solr中没有具体的支持.但是,您可以通过其他几种方式将它们组合在一起.不确定你对这些产品的性能有什么期望,...

使用突出显示

如果使用突出显示,则可以为突出显示的文本的开始/结束标记解析返回的突出显示的片段.这将是与查询中的内容匹配的术语.

使用debugQuery信息

您可以debugQuery=true通过查看termWeight(iirc)来解析查询返回的信息,以确定术语与结果相关联.这可能是您原始术语的过滤版本(如果您对该字段有活动等).

使用字段折叠

通过使用group.query,您可以构建匹配每个术语的文档列表,而不是发出多个请求.如果需要"包含任何一个"的列表,您还可以构建具有OR-ed的多个术语的查询.对于大量的领域可能没有效果.

自己解析返回的文档

获取文档,然后自己提取条款.需要一些模糊匹配,因为您还必须处理Solr端的文本处理.

使用函数查询

您可以使用FunctionQuery中的每个术语获取每个文档的元值,该术语查找该文档中术语的出现次数.对于大量术语需要相当多的函数查询,但可能很快.

..两种选择都不是完美的,但可能适用于手头的问题.

  • 非常感谢您的快速回复和有趣的建议。我现在使用函数查询,似乎性能不是问题:) 对于那些感兴趣的人:我正在使用 `exists` 函数并为每个搜索词添加一个伪字段,如下所示:`fl=exists(query ({!v='content:(foo)'})),exists(query({!v='content:(bar)'}))`。从响应中,我使用正则表达式解析搜索词。 (2认同)

tbm*_*msu 8

我的评论作为答案:

我使用函数查询,似乎性能不是问题:)对于那些感兴趣的人:我正在使用该exists函数并为每个搜索项添加一个伪字段,如下所示:fl=exists(query({!v='content:(foo)'})),exists(query({!v='content:(bar)'})).从响应中我用正则表达式解析搜索词.

正如保罗在上面所说,你可以为伪字段设置别名以避免正则表达式解析,例如 fl=foo:exists(query({!v='content:(foo)'}))