您可以查询Solr来比较字段值和函数的结果吗?

时间:2017-11-09 20:04:21

标签: solr lucene

我有一个用例,我想搜索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}}在文件上。

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,则仅返回0termfreq > 0