ES query_string match的区别之一

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

curl -XGET ‘http://localhost:9200/*/offer/_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/alias-offer/offer/_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/*/offer/_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();
  }

因为符号- 被转译了。

原文地址:http://blog.51cto.com/12597095/2108498

时间: 2024-10-11 06:37:21

ES query_string match的区别之一的相关文章

转转转---js正则表达exec与match的区别说明

正则表达式对象有两个定义方式:: 1.第一种定义: new RegExp(pattern, attributes);如var reg = new RegExp("abc","g") 其中pattern为表示表达式内容,如上表示匹配abc attributes:g,全局匹配,i不区分大小写,m执行多行匹配,用最多的为g和i 2.第二种定义:/pattern/attributes. 如:var reg = /abc/g; 正则表达的规则一些规则在此不再说明,只记录exe

javascript正则表达式exec()与match()的区别说明

本篇文章主要是对js正则表达exec与match的区别进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 正则表达的规则一些规则在此不再说明,只记录exec和match的区别: 1.exec是正则表达式的方法,而不是字符串的方法,它的参数才是字符串,如下所示: 如上定义 var reg = new RegExp("abc") ; var str = "3abc4,5abc6";reg.exec(str ); 2.match是字符串执行匹配正则表达式规则的方法

详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

http://blog.sina.com.cn/s/blog_686999de0100jgda.html 实例: 1,http://localhost/aaa/ (打开aaa中的index.php)结果:$_SERVER['QUERY_STRING'] = "";$_SERVER['REQUEST_URI']  = "/aaa/";$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";$_SERVER['PHP_

聊聊MySQL、HBase、ES的特点和区别

互联网时代各种存储框架层出不穷,眼花缭乱,比如传统的关系型数据库:Oracle.MySQL:新兴的NoSQL:HBase.Cassandra.Redis:全文检索框架:ES.Solr等.如何为自己的业务选取合适的存储方案,相信大家都思考过这个问题,本文简单聊聊我对MySQL.HBase.ES的理解,希望能和大家一起探讨进步,有不对的地方还请指出. MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持SQL,支持主从.group replication架构模型(本文全部以Inn

elasticsearch term match multi_match区别

转自:http://www.cnblogs.com/yjf512/p/4897294.html match 最简单的一个match例子: 查询和"我的宝马多少马力"这个查询语句匹配的文档. { "query": { "match": { "content" : { "query" : "我的宝马多少马力" } } } } 上面的查询匹配就会进行分词,比如"宝马多少马力"

js正则函数中test和match的区别

test是RegExp的方法,参数是字符串,返回值是boolean类型. match是String的方法,参数是正则表达式,返回值是数组. 1 <script type="text/javascript"> 2 var str="javascript is good,java"; 3 console.log(str.match(/java/gi)); //返回时数组 4 </script> var str="javascript i

JavaScript中正则表达式test()、exec()、match() 方法区别

1)test()方法 var str = "wzltestreg"; var reg = new RegExp("wzl", ""); alert(reg.test(str)); // true test 返回 Boolean,查找对应的字符串中是否存在模式. 2)RegExp类的方法exec(string) http://www.cnblogs.com/xiehuiqi220/archive/2008/12/01/1327487.html 3)

【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

实例: 1,http://localhost/aaa/ (打开aaa中的index.php)结果:$_SERVER['QUERY_STRING'] = "";$_SERVER['REQUEST_URI']  = "/aaa/";$_SERVER['SCRIPT_NAME']  = "/aaa/index.php";$_SERVER['PHP_SELF']     = "/aaa/index.php"; 2,http://loc

Python里面search()和match()的区别

match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None import re print(re.match("func", "function")) # 打印结果 <_sre.SRE_Match object; span=(0, 4), match='func'> print(re.match("func", "function").span()) # 打印结果 (0, 4) prin