《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(14) https://developer.aliyun.com/article/1229925
4.6 query string
Query string 查询是一种便捷的语法查询方式,解析器根据提供的查询字符串进行严格的语法解析,最后返回相应的文档。
主要有这些特点:
1、严格的语法解析,对查询内容的正确性要求较高。也因此 ES 官方不建议在搜索框使用 query_string 查询。
2、操作符的使用使得查询语句更加简洁,且逻辑更加清晰。
3、允许使用通配符、正则表达式等方法。
4、基本覆盖了全文搜索的绝大数功能。
使用方法:
GET /_search { "query": { "query_string": { "query": "(new york city) OR (big apple)", "default_field": "content" } } }
这个查询等同于下面的查询:
GET my-index-000002/_search { "query": { "bool": { "should": [ { "match": { "content": "new york city" } }, { "match": { "content": "big apple" } } ] } } }
query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。
我们主要看一下 query_string 的语法运用规则:
1、字段查询:默认的查询方式是status:active这样的方式。可以在字段中添加操作符,比如
title:(quick OR brown);也可以对字段使用匹配,book.\*:(quick OR brown),注意转义符的使用;对被查询的文档是使用英文双引号可以达到 match_phrase 的效果,author:"John Smith"; exists 方法的使用则是这样 _exists_:title
2、wildcards方法:匹配符的方法也是 ? 代表一个字符, * 代表多个字符。
3、正则表达式:正则表达式模式可以嵌入到查询字符串中,方法是将用斜杠/括起来,比如:name:/joh?n(ath[oa]n)/
4、模糊查询:模糊查询的符号是 ~,比如:quikc~ brwn~ foks~;可以在 ~ 后面添加编辑距离参数,比如:quikc~2。注意,模糊查询是针对 term 查询时词项的模糊匹配。
5、相似查询(proximity search):与模糊查询的方式操作符号一样也是~ ,但是是对 match_phrase 查询的两个词项间的距离编辑,比如:"fox quick"~5
6、范围查询:中阔号是两边范围包含,比如count:[1 TO 5]是 count 大于等于 1 小于等于 5 ;花括号是两边范围不包含,比如count:{1 TO 5}是 count 大于 1 小于 5 ;如果是单纯的大于或者小于则用 * 号代表无范围限制,比如count:[1 TO *] 代表 count 大于等于 1,
count:{* TO 5}代表小于5;当然两个符号也可以组合,比如count:{1 TO 5]代表大于 1 小于等于 5。
7、加权:加权主要使用的符号是^,比如quick^2 fox代表命中 quick 的文档算分是 fox 的 2 倍。
8、布尔运算:默认空格是或查询+号是 must ,-号是 must not。比如quick brown +fox -news是查询必须有 fox ,不包含 news ,包含 quick brown 其中一项的文档。同时布尔运算符包含 AND OR NOT 和 && || ! 两种形式的表达式。
9、分组:括号用于表示分组,比如 (quick OR brown) AND fox 或者 status:(active OR pending) title:(full text search)^2
10、多字段查询:多字段查询的字段间关系默认是 OR 的关系.比如下面的查询:
GET /_search { "query": { "query_string": { "fields": [ "content", "name" ], "query": "this AND that" } } }
等同于:
GET /_search { "query": { "query_string": { "query": "(content:this OR name:this) AND (content:that OR name:that)" } } }
同时,multi_match 中的各种查询类型也可以通过 type 参数实现。
注意:
1、在 query_string 中避免查询 nested 的文档。
2、query_string 查询可以在内部转换为 prefix 查询,如果 ES 禁用 prefix 查询,query_string 将不会执行查询并抛出异常。
3、关于转义符,在 json 中转义符是 "\",比如 "query" : "kimchy\\!"
4、在多字段查询中,由于字段和词项之间的布尔运算规则的交叉,会导致运算逻辑相对晦涩不明。因此如果有多字段查询最佳的方式是通过分组将其查询逻辑清晰化,避免查询失败。
4.7 simple_query_string
simple_query_string 是一种相对简化的查询语法,虽然比起 query_string 的完善功能 simple_query_string 的使用有诸多限制,但是 simple_query_string 查询不会因无效语法返回错误。相反,它会忽略查询字符串中任何无效的部分。
使用方法:
GET /_search { "query": { "simple_query_string" : { "query": "\"fried eggs\" +(eggplant | potato) -frittata", "fields": ["title^5", "body"], "default_operator": "and" } } }
simple_query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。
使用语法
语法操作符主要作用于查询词项,有以下这些:
1、+ 代表 and 关系, | 代表 or ,-代表 not。
2、"" 英文双引号使用 match_phrase。
3、* 是通配符。
4、() 是分组。
5、~N 是模糊查询或者相似查询的字符或者词项编辑距离。
limit operators在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。比如:
limit operators
limit operators 在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。
比如:
GET /_search { "query": { "simple_query_string": { "query": "foo | bar + baz*", "flags": "OR|AND|PREFIX" } } }
这个查询中,限定了 OR AND PREFIX 三种语法,其余的语法运算符都会被限制掉。
flag 的参数值:ALL(默认))/AND/ESCAPE/FUZZY/NEAR/NONE/NOT/OR/PHRASE/PRECEDENCE/PREFIX/SLOP/WHITESPACE
字段通配符和加权
在查询字段上,也可以使用通配符*,比如:
GET /_search { "query": { "simple_query_string" : { "query": "Will Smith", "fields": [ "title", "*_name" ] } } }
同时也可以对字段进行加权,使用符号^:
GET /_search { "query": { "simple_query_string" : { "query" : "this is a test", "fields" : [ "subject^3", "message" ] } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(16) https://developer.aliyun.com/article/1229923