我该如何告诉Solr返回每个文档的命中搜索词?

16
我有一个关于Solr查询的问题。当我使用多个搜索项并且它们全部逻辑上由OR链接(例如q=content:(foo OR bar OR foobar))来执行查询时,Solr会返回一个所有匹配这些任意项的文档列表。但Solr没有返回哪些文档被哪个或哪些词条所命中的信息。因此,在以上示例中,我想知道我的结果列表中包含哪些文档包含了术语“foo”等。如果得到这些信息,我就可以创建一个术语-文档矩阵。
我的问题是:我该如何告诉Solr提供这个缺失的信息?我相信它肯定存在,否则整个搜索就无法工作。但我错过了什么?谢谢你的帮助。
PS:作为解决方法,我正在为所有搜索项执行单个Solr查询。但是,由于搜索项的数量可能超过50,这对性能来说是一场灾难 :(
3个回答

16

这有点取决于您的要求,但据我所知,在Solr中没有针对此特定功能的支持。不过,您可以通过其他几种方式将其组合在一起。不确定对于这些选项,您可以期望什么性能。

使用高亮显示

如果您使用高亮显示,可以解析返回的高亮片段以获取高亮文本的开始/结束标记。这将是与查询匹配的术语。

使用debugQuery信息

您可以解析使用debugQuery=true查询返回的信息,通过查看(我记得) termWeight 来确定术语与结果相关联。这可能是您原始术语的筛选版本(如果您为该字段启用了词干处理等等)。

使用字段折叠

通过使用group.query,您可以构建每个术语匹配的文档列表,而不是发出多个请求。如果您需要“包含任意一个”的列表,则还可以构建特征多个术语OR在一起的查询。对于大量字段可能不太有效。

自己解析返回的文档

获取文档,然后自行提取术语。需要一些模糊匹配,因为您还必须处理Solr端的文本处理。

使用函数查询

您可以通过FunctionQuery获取每个术语在该文档中的出现次数的元值。对于大量术语,可能需要相当多的函数查询,但速度可能会很快。

.. 以上选项都不完美,但可能适用于手头的问题。


2
非常感谢您的快速回复和有趣的建议。我现在正在使用函数查询,而且似乎性能不是问题 :) 对于那些感兴趣的人:我正在使用 exists 函数,并为每个搜索词添加一个伪字段,例如:fl=exists(query({!v='content:(foo)'})),exists(query({!v='content:(bar)'}))。从响应中,我使用正则表达式解析搜索词。 - tbmsu
1
@tbmsu,您介意将其发布为答案吗?我认为这有助于完善帖子。还请注意,您可以使用别名伪字段来避免正则表达式解析,例如 fl=foo:exists(query({!v='content:(foo)'})) - Paul Bellora
有没有办法可以列出给定文档的某个字段的所有索引? - Shih-En Chou
@Shih-EnChou 评论区不适合提出新问题,请创建一个问题进行提问。要查看文档的原始标记,请使用LukeRequestHandler在Solr中获取它,或使用Luke工具检查Solr之外的索引文件。 - MatsLindh

10

我的回答评论:

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

如Paul上面所述,您可以给伪字段取别名以避免使用正则表达式解析,例如:fl=foo:exists(query({!v='content:(foo)'}))


这对我很有用,谢谢。您能告诉我如何将多个条件添加到此本地参数中吗?我尝试了 fl=foo:exists(query({!v='content:(foo) and content2:(foo2)'}))。我也尝试了一些变化,但似乎不起作用。有什么想法吗? - Ganesh
抱歉,我之前发布得有点早了。我猜and必须大写才能使其正常工作。否则它会被视为字符串。 - Ganesh

0
在我的情况下,solr6.6查询fl=foo:exists(query({!v='content:(foo)'}))似乎不起作用,它总是返回0个文档,而我在我的文档中有foo,因此我需要将此查询更改为?q=*:*&fl=foo:exists(query({!v='content:(foo)'})) ,这样我才能开始工作。

1
原因是您没有包含查询。fl不是一个查询,它只是一条指令,告诉Solr应该返回哪些字段。正如您发现的那样,您必须包含一个查询,其中q=*:*将返回集合中的所有文档。 - MatsLindh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接