16

我对 Solr 中的查询有疑问。当我使用多个搜索词执行查询时,这些搜索词都由 OR(例如q=content:(foo OR bar OR foobar))在逻辑上链接,Solr 会返回一个与这些词中的任何一个匹配的文档列表。但是 Solr没有返回的是哪些文档受到了哪些术语的影响。所以在上面的例子中,我想知道我的结果列表中的哪些文档包含术语foo等。有了这些信息,我将能够创建一个术语文档矩阵。

所以我的问题是:我怎样才能告诉 Solr 给我那条缺失的信息?我确定它在某个地方,否则整个搜索将无法正常工作。但我错过了什么?谢谢你的帮助。

PS:作为一种解决方法,我正在对所有搜索词执行单个 Solr 查询。但正如您可以想象的那样,由于搜索词的数量可能超过 50 个,这在性能方面是一场灾难 :(

4

3 回答 3

16

有点取决于您的要求,但据我所知,Solr 对此没有具体的支持。但是,您可以通过其他几种方式将其组合在一起。不知道你对这些性能的期望是什么,虽然..

使用突出显示

如果您使用突出显示,则可以解析返回的突出显示片段以获取突出显示文本的开始/结束标签。这将是与您的查询中的某些内容相匹配的术语。

使用调试查询信息

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

使用字段折叠

通过使用 group.query,您可以构建与每个术语匹配的文档列表,而不是发出多个请求。如果您需要“包含任何一个”的列表,您还可以构建将多个术语 OR-ed 组合在一起的查询。可能对大量字段无效。

自己解析返回的文档

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

使用函数查询

您可以从 FunctionQuery 中获取每个文档的每个术语的元值,该函数查询查找该文档中某个术语的出现次数。将需要对大量术语进行相当多的函数查询,但可能很快。

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

于 2014-07-30T13:39:49.383 回答
10

我的评论作为答案:

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

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

于 2014-10-02T15:11:42.240 回答
0

就我而言solr6.6,查询fl=foo:exists(query({!v='content:(foo)'}))似乎不起作用,它总是返回0个文档,而foo我的文档中有,所以我需要将此查询更改为?q=*:*&fl=foo:exists(query({!v='content:(foo)'}))并开始为我工作。

于 2018-10-05T05:25:32.917 回答