我有一个用例,我想搜索Solr索引并查找字段中所有术语都在查询中的所有文档。
查询可能包含更多不在字段中的字词。我只关注查询与字段中所有字词匹配的文档。
所以,我要说我有以下文件:
[{
field: term1 term2 term3
},
{
field: term3 term4 term5
}
{
field: term2 term3
}]
当我用
查询Solr时field: (term2 term3 term4)
我只想要第3份文件。如果我用
查询field: (term2 term3 term4 term5)
我想要第二个和第三个文件。
到目前为止,我已尝试在每个文档的索引中添加另一个字段,这只是术语的计数,然后执行看起来像的过滤查询:
fieldTermCount:{!func v="sum(termfreq(field, 'term2'),
termfreq(field, 'term3'),
termfreq(field, 'term4'))"
}
但它似乎没有对结果集做任何事情。
当我将sum
函数添加到字段列表时,它会按预期正确计算匹配项的数量,但我似乎无法弄清楚如何将该计算值与{{{ 1}}在文件上。
答案 0 :(得分:1)
我发现了我的问题。
我将filterQuery
修改为以下内容:
{!frange u=0 l=0}
sub(fieldCount,
sum(termfreq(field, 'term2'),
termfreq(field, 'term3'),
termfreq(field, 'term4')
)
)
这里发生的是我正在使用fieldCount
并从中减去匹配条件的数量。然后执行范围查询以仅从该操作中恢复具有0
的文档(即没有匹配的条款)。
另请注意,这仅适用,因为我的文档中的术语从不重复。如果您的文档中的术语重复,则可能必须执行if
函数调用,如果1
,则仅返回0
或termfreq > 0
。