例如,如果我有这两个文件:
id: 1
multifield: 2, 5
id: 2
multifield: 2, 5, 9
Run Code Online (Sandbox Code Playgroud)
然后说我有一个我正在查询的集合,即{2,5,7}.我想要的是返回文档1,因为2和5都包含在集合中.但是不应该返回文档2,因为9不在集合中.
多值字段和我的集都是任意长度的.希望这是有道理的.
在问题中使用相同的数据,我将在我的文档中添加一个计算字段,其中包含我的多值字段中的值的数量.
id: 1
multifield: 2, 5
nummultifield: 2
id: 2
multifield: 2, 5, 9
nummultifield: 3
Run Code Online (Sandbox Code Playgroud)
然后我将使用带有一些函数查询的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)))
Run Code Online (Sandbox Code Playgroud)
如果我们填写文档1和2的值,它将如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我已经测试过了,效果很好.您需要确保不在多字段中复制任何值,否则您将得到奇怪的结果.顺便说一下,只要你想从一个或多个函数查询伪造一个布尔结果,就可以使用这个使用frange的技巧.