Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Solr返回每个文档的热门搜索词?_Solr_Term Document Matrix - Fatal编程技术网

如何让Solr返回每个文档的热门搜索词?

如何让Solr返回每个文档的热门搜索词?,solr,term-document-matrix,Solr,Term Document Matrix,我对Solr中的查询有一个问题。当我对多个搜索词执行查询时,如果这些搜索词在逻辑上都由OR链接(例如,q=content:(foo或bar或foobar)),Solr将返回一个文档列表,其中所有文档都与这些词中的任何一个匹配。但Solr不返回的是哪些文档被哪个术语击中。因此,在上面的例子中,我想知道的是我的结果列表中的哪些文档包含术语foo等。根据这些信息,我将能够创建一个术语文档矩阵 所以我的问题是:我怎样才能告诉Solr给我丢失的信息?我肯定它在某个地方,否则整个搜索将无法工作。但我错过了什

我对Solr中的查询有一个问题。当我对多个搜索词执行查询时,如果这些搜索词在逻辑上都由OR链接(例如,
q=content:(foo或bar或foobar)
),Solr将返回一个文档列表,其中所有文档都与这些词中的任何一个匹配。但Solr不返回的是哪些文档被哪个术语击中。因此,在上面的例子中,我想知道的是我的结果列表中的哪些文档包含术语foo等。根据这些信息,我将能够创建一个术语文档矩阵

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


PS:作为一种解决方法,我对所有搜索词执行一个Solr查询。但是,正如你所想象的,它在性能方面是一个desaster,因为搜索词的数量可能超过50:(

某种程度上取决于你的要求,但据我所知,Solr中没有对此的具体支持。不过,你可以用其他几种方法将其组合起来。不过,不确定你对这些搜索词的性能有何期望,尽管

使用Highlightning

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

使用调试查询信息

您可以使用
debugQuery=true
解析查询返回的信息,通过查看
termWeight
(iirc)来确定某个术语是否与结果关联。这可能是原始术语的过滤版本(如果字段中有词干分析等活动)

使用字段折叠

通过使用group.query,您可以生成与每个术语相匹配的文档列表,而不是发出多个请求。您还可以生成具有多个术语的查询,或者如果您需要“包含其中一个”的列表,则可以将其合并在一起。对于大量字段,可能无效

自己解析返回的文档

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

使用函数查询

您可以通过FunctionQuery为每个文档和每个术语获取元值,FunctionQuery可查找该文档中术语的出现次数。对于大量术语,需要进行大量函数查询,但可能会很快


…这两个选项都不是完美的,但可能对手头的问题有效。

我的评论作为答案:

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


如上所述,您可以别名伪字段以避免正则表达式解析,例如
fl=foo:exists(查询({!v='content:(foo)}))
在我的例子中
solr6.6
查询
fl=foo:exists(查询({!v='content:(foo)}))
似乎不起作用,它总是返回0文档,我的文档中有
foo
,因此我需要将此查询更改为
?q=*:*&fl=foo:exists(query({v='content:(foo)}))
并且我开始为我工作。

非常感谢您的快速回复和有趣的建议。我现在使用函数查询,似乎性能不是问题:)对于那些感兴趣的人来说:我正在使用
exists
函数,并为每个搜索项添加一个伪字段,如下所示:
fl=exists(query({v='content:(foo)})),exists(query({v='content:(bar)}))
。从响应中,我用正则表达式解析搜索词。@tbmsu您介意将其作为答案发布吗?我认为这有助于完成这篇文章。还请注意,您可以别名伪字段以避免正则表达式解析,例如,
fl=foo:exists(query({!v='content:'foo)}))
是否有任何解决方案可以列出给定文档字段的所有索引?@Shih EnChou注释不是提出新问题的地方-为此创建一个问题。要查看文档的原始标记,请使用LukeRequestHandler在Solr中获取它,或者使用Luke工具检查Solr之外的索引文件。这对我很有用,谢谢。您能告诉我如何将多个条件添加到此本地参数吗?我尝试了'fl=foo:exists(查询({!v='content:(foo)和content2:(foo2)}))。我也尝试了一些变化,但似乎不起作用。有什么想法吗?抱歉,发布得有点太早了,猜测,
必须是大写的,才能让它生效。否则它将被视为字符串,我想原因是您没有包含查询
fl
不是一个查询,它只是一条指令,告诉Solr应该返回哪些字段。您必须在发现时包含一个查询,其中
q=*:*
将返回集合中的所有文档。