在公司里目前拿Solr作为主要的搜索引擎,在日常使用中也发现一些坑,现在记录一下
查询的时候注意 NOT OR 连用
Solr版本 5.5.2
((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)
例如上面的查询语句, 如果前置条件不被命中,那么按照正常的逻辑来说命中 OR 后面的条件也可以出来结果。 对的,一开始我也是这么认为,并且完全不以为然,也并不觉得这是一个不合理的地方。但当实际运行的时候却发现,当 OR 前面的逻辑没有被命中之后,完全不会去执行 OR 后面的条件,就和短路一样。
当我去网上搜索的时候,发现有和我遇到一样问题的
里面有一种比较简单通俗易懂的解决方案
Instead of "NOT [condition]" use "(*:* NOT [condition])"
简单来说就是不要拿 OR 和 NOT直接连用,而是添加一个全局匹配语句
*:* 这个查询语句类似于 select *
这就非常因吹斯汀了,为什么 OR 和 NOT 连用会带来短路现象,这里刚好也有一位朋友解答了这个问题。
简单翻译下:Solr当前检查为一个纯否定的语句,需要插入 全匹配语句*:* 。他也表示Solr只检查顶级查询是否为纯否定查询,当遇到bar OR (-foo)这样的查询不会改变,因为纯否定查询是在顶级查询的子句中。你需要自己转换这个查询到bar或(: -foo)
评论区