千家信息网

ES query_string match的区别之一

发表于:2024-10-26 作者:千家信息网编辑
千家信息网最后更新 2024年10月26日,今天线上发现一个问题,从而引出对query_string 和 match 的区别的思考。curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d
千家信息网最后更新 2024年10月26日ES query_string match的区别之一

今天线上发现一个问题,从而引出对query_string 和 match 的区别的思考。

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{"from" : 0,"size" : 10,"fields" : ["title"],"query": {"query_string" : {"query" : "100CrMo7 +圆钢","fields" : ["title"]}               }}' | grep "100CrMo7"

在这个例子中,在title中查找包含100CrMo7,并且包含圆钢的数据。

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{  "from" : 0,  "size" : 10,  "fields" : ["title"],  "query": {"query_string" : {"query" : "100CrMo7 -圆钢","fields" : ["title"]}                 }}' | grep "100CrMo7"

在这个例子中,在title中查找包含100CrMo7,但是不 包含圆钢的数据。

注:替换为simple_query_string 结果好像不尽人意。有一两条数据 没有被过滤出。

而看下面的例子

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{   "size" : 10,   "fields" : ["title"],      "query" : {        "bool" : {          "must" : {            "match" : {              "_all" : {                "query" : "100CrMo7 -圆钢",                "type" : "boolean",                "operator" : "AND",                "boost" : 1.0              }            }          }        }      }}' | grep "100CrMo7"

无论是100CrMo7 -圆钢 还是 100CrMo7 +圆钢 结果没有发生变化。

看文档解释如下:
The match family of queries does not go through a "query parsing" process. It does not support field name prefixes, wildcard characters, or other "advanced" features.

已就是说后者没有经过查询分析的这个过程。
所以如果你使用后者时加入了如下代码:QueryParser.escape(keyword.trim()) 时,如果关键字里有"-" 这么一个特殊符号,比如 100CrMo7-3 , 那么你的查询结果可能就是空。 所以在使用QueryParser.escape(keyword.trim()) 要分情况。

我们看一下它的源代码:

public static String escape(String s) {    StringBuilder sb = new StringBuilder();    for (int i = 0; i < s.length(); i++) {      char c = s.charAt(i);      // These characters are part of the query syntax and must be escaped      if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'        || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'        || c == '*' || c == '?' || c == '|' || c == '&' || c == '/') {        sb.append('\\');      }      sb.append(c);    }    return sb.toString();  }

因为符号- 被转译了。

先看QueryStringQueryParser的解析过程。

再看MatchQueryParser类

后者没有转译特殊字符,就解释了使用QueryParser.escape(keyword.trim()) 查不到结果。
继续查看matchQuery.parse

它只是调用查询分析器(mapping里设置的)去解析各个字段。

点击parseContext.queryParser

看到有很多的解析包括 < >等符号。

圆钢 结果 例子 数据 符号 查询 特殊 就是 过程 分析 解释 转译 不尽人意 人意 代码 关键 关键字 分析器 只是 天线 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 sql中数据库逻辑设计在哪看 贵州软件开发外包业务 旧笔记本电脑主机改造成小服务器 嵌入式软件开发商防水眼线 计算机网络技术基础徐红答案 网络安全职业生涯规划路线选择 转换数据库的日期 行唐智能软件开发服务诚信推荐 加佳网络技术有限公司 存储过程数据库规范 哪里有好的重庆电信服务器托管 网络安全知识三年级手抄报 wind数据库怎么找公司年报 大庆华创软件开发电话 合肥网络技术服务价格信息 本地数据库管理 天津名优网络技术服务哪个正规 呼叫中心建立数据库的原因 虚拟mfa软件开发 网站服务器白名单 长沙岐黄软件开发 网络安全必火培训 青岛定制软件开发公司 山西服务器电源种类 网络安全中被动攻击的意义 数据库中属性可以再分割吗 数据库er图的画法步骤 数据库系统分析的核心 视频巡检服务器价格 服务器10pcIe插槽
0