侧边栏壁纸
博主头像
Zhangsnke博主等级

这是Zhangxike的平凡生活!

  • 累计撰写 16 篇文章
  • 累计创建 11 个标签
  • 累计收到 15 条评论

目 录CONTENT

文章目录

Solr 查询遇到的一些坑

Zhangsnke
2022-05-24 / 1 评论 / 1 点赞 / 729 阅读 / 447 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在公司里目前拿Solr作为主要的搜索引擎,在日常使用中也发现一些坑,现在记录一下

查询的时候注意 NOT OR 连用

Solr版本 5.5.2

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

例如上面的查询语句, 如果前置条件不被命中,那么按照正常的逻辑来说命中 OR 后面的条件也可以出来结果。 对的,一开始我也是这么认为,并且完全不以为然,也并不觉得这是一个不合理的地方。但当实际运行的时候却发现,当 OR 前面的逻辑没有被命中之后,完全不会去执行 OR 后面的条件,就和短路一样。

当我去网上搜索的时候,发现有和我遇到一样问题的
image-1653373792941

里面有一种比较简单通俗易懂的解决方案

Instead of "NOT [condition]" use "(*:* NOT [condition])"

简单来说就是不要拿 OR 和 NOT直接连用,而是添加一个全局匹配语句

*:*  这个查询语句类似于 select * 

这就非常因吹斯汀了,为什么 OR 和 NOT 连用会带来短路现象,这里刚好也有一位朋友解答了这个问题。
image-1653374216782

简单翻译下:Solr当前检查为一个纯否定的语句,需要插入 全匹配语句*:* 。他也表示Solr只检查顶级查询是否为纯否定查询,当遇到bar OR (-foo)这样的查询不会改变,因为纯否定查询是在顶级查询的子句中。你需要自己转换这个查询到bar或(: -foo)

Stack Overflow 问题地址,点击跳转

1

评论区