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 - Fatal编程技术网

Solr,多值字段:如果字段中的所有值都包含在一个集合中,如何返回文档?

Solr,多值字段:如果字段中的所有值都包含在一个集合中,如何返回文档?,solr,Solr,例如,如果我有以下两个文档: id: 1 multifield: 2, 5 id: 2 multifield: 2, 5, 9 然后假设我有一个我正在查询的集合,它是{2,5,7}。我希望返回文档1,因为2和5都包含在集合中。但不应返回文档2,因为9不在集合中 多值字段和我的集合都是任意长度的。希望这是有意义的。刻面可能是你想要的 我根据清晰的想象链接改编了这篇文章 选择值为2、5或7的所有文档: http://localhost:8983/solr/select?q=* &am

例如,如果我有以下两个文档:

id: 1
multifield: 2, 5

id: 2
multifield: 2, 5, 9
然后假设我有一个我正在查询的集合,它是{2,5,7}。我希望返回文档1,因为2和5都包含在集合中。但不应返回文档2,因为9不在集合中


多值字段和我的集合都是任意长度的。希望这是有意义的。

刻面可能是你想要的


我根据清晰的想象链接改编了这篇文章

选择值为2、5或7的所有文档:

http://localhost:8983/solr/select?q=*
  &facet=on
  &facet.field=multifield
  &fq=multifield:2
  &fq=multifield:5
  &fq=multifield:7

不完整:我不知道有什么选项可以排除所有其他值。

解决了这个问题。是灵感,特别是建议使用的答案

使用问题中的相同数据,我将向文档中添加一个计算字段,其中包含多值字段中的值数

id: 1
multifield: 2, 5
nummultifield: 2

id: 2
multifield: 2, 5, 9
nummultifield: 3
然后,我将使用frange进行一些函数查询。对于集合中的每个项目,我将使用termfreq函数,该函数将返回1或0。然后我将总结所有这些值。最后,如果该总和等于计算字段nummultifield,那么我知道对于该文档,文档中的每个值都存在于集合中。请记住,我的集合是2,5,7,因此我的函数查询将如下所示:

fq={!frange l=0 u=0}sub( nummultifield, sum( termfreq(multifield,2), termfreq(multifield,5), termfreq(multifield,7)))
Document 1:  sub( 2, sum( 1,1,0 ) ) = 0  ' in my range of {0,0} so Doc 1 is returned
Document 2:  sub( 3, sum( 1,1,0 ) ) = 1  ' not in the range of {0,0} so not returned
如果我们填写文档1和文档2的值,它将如下所示:

fq={!frange l=0 u=0}sub( nummultifield, sum( termfreq(multifield,2), termfreq(multifield,5), termfreq(multifield,7)))
Document 1:  sub( 2, sum( 1,1,0 ) ) = 0  ' in my range of {0,0} so Doc 1 is returned
Document 2:  sub( 3, sum( 1,1,0 ) ) = 1  ' not in the range of {0,0} so not returned

我已经测试过了,效果很好。您需要确保不在多字段中复制任何值,否则会得到奇怪的结果。顺便说一句,只要您想从一个或多个函数查询中伪造布尔结果,就可以使用frange这个技巧

我认为这行不通。fq=multifield:7会导致文档1被筛选,因为所有fq都被删除,您是否尝试过?我离开我的办公室电脑有一段时间了,但我很确定这意味着set union,“返回多字段取值为2、5或7的所有行”,这是一个or操作。如果我错了,请纠正我。我非常确定fq的所有内容都在一起。我向Solr提交了一个特性请求(请随意投票!),以提供更多选项:然后查看我在回答中提到的布尔过滤器的第三个链接——我自己从未尝试过。我希望我的代码能再次检查我的方法。我很感谢你的努力,但我不认为这会有什么帮助。记住,我在这里真的做了一个“反向查询”,文档中的所有值都必须出现在我用来搜索的集合中。请看下面我的答案,我认为应该可以。如何让动态字段返回多值字段中的值数?不是动态字段,它是手动维护的。丑陋但有效这就是我最终要做的。它工作得很好,所以一切都很好:)