操作版本基于7.0
涉及的查询关键字预览
- sort
- includes、excludes
- stored_fields
- script_fields
- _count
- term,terms,terms_set
- range
- exits
- prefix
- wildcard
- regexp
- match
- multi_match
- match_phrase,match_phrase_prefix
- query_string
1、分页查询
索引项有一个 index.max_result_window的配置项,默认为10000,如果分页查询的是10000条以后的数据需要修改这个配置项的值。实际中没有必要查询这么靠后的数据,可以增加检索条件获取有价值的信息。
GET students/_search
{
"from":100,
"size":20,
"query":{
"term":{
"age":5
}
}
}
2、sort 查询结果排序
POST /students/_search
{
"sort":[
"name",
{ "address":"asc"}
]
}
3、_source 查询原始文档中包含字段的数据
//查询包含tom的数据
POST /students/_search
{
"_source":"tom",
"query":{
"match_all":{}
}
}
//查询包含jiayi和17的数据
POST /students/_search
{
"_source":["jiayi",17],
}
//通配符匹配
POST /students/_search
{
"_source":"*jerry"
}
4、includes、excludes 查询包含和不包含
POST /students/_search
{
"_source":{
"includes":["tom.*","*.jerry"],
"excludes":"beijing.*"
}
5、stored_fields 查询字段显示在结果中
前提是name和address必须设置了 “store”:true
POST /students/_search
{
“store_fields”:["name","address"]
}
6、script_fields 查询结果添加运算后的字段
计算每天平均费用
POST /order/_search
{
"script_fields":{
"price_per_day":{
"script":{
"source":doc['price'].value/doc['day'].value
}
}
}
7、_count 查询符合条件的文档数量
POST /students/_count
{
"query":{
"match":{
"address":"Beijing"
}
}
}
8、term 查询
精确匹配,相当于SQL语句中的 where
POST /students/_search
{
"query":{
"term":{
"age":18
}
}
}
9、terms查询
范围匹配,类型SQL语句的 in 操作符
POST /students/_search
{
"query":{
"terms":{
"address":["Beijing","Hongkong"]
}
}
}
10、terms 多索引联查
相当于SQL中的多表联查.
查询ID为1的学生提交的所有家庭作业
POST /homework/_search
{
"query":{
"terms":{
"_id":{
"_index":"students",
"id":1,
"path":"homework"
}
}
}
}
11、terms_set 字段数组查询
只要查询结果包含所指定的词项即可,minimum_should_match_script设置了最小包含词项的数量
POST /students/_search
{
"query":{
"terms_set":{
"tags":{
"terms":["Beijing","HongKong","WuHan"],
"minimum_should_match_script":{
"source":2
}
}
}
}
}
12、range 范围查询
年龄介于 100到200之间的
POST /students/_search
{
"query":{
"range":{
"age":{
"gte":100,
"lte":200
}
}
}
}
//
gte 大于等于
gt 大于
lte 小于等于
lt 小于
13、exits 检索字段值不为空
查询地址不为空的学生
POST /students/_search
{
"query":{
"exits":{
"fields":"address"
}
}
}
14、prefix 检索包含指定前缀的文档
查询所有姓“张”的学生
POST /students/_search
{
"query":{
"prefix":{
"name":"张"
}
}
}
15、wildcard 通配符查询
wildcard允许使用 *
和 ?
。*
代表多个字符, ?
代表单个字符。例如f*f?x
匹配firefox,将检索所有已f开头并以f?x结尾的词项
POST /order/_search
{
"query":{
"wildcard":{
"message":"f*f?x"
}
}
}
16、regexp 正则查询
15的案例可以这样写。regexp正则使用的是Lucence表达式,所以不支持JAVA预定义的 \w、\d
POST /order/_search
{
"query":{
"wildcard":{
"message":"f*f.x"
}
}
}
17、match、operator 查询
查询message字段都包含firefox和chrome的记录。operator可选值有 or
或 and
(默认为or)。匹配个数可以通过 minimum_should_match
来修改
POST /order/_search
{
"query":{
"match":{
"message":{
"query":"firefox chrome",
"operator":"and"
}
}
}
}
18、multi_match 查询
在订单表的message或title字段里查询包含“口罩”的记录
POST /order/_search
{
"query":{
"multi_match":{
"query":"口罩",
"fields":["message","title"]
}
}
}
19、match_phrase 短语匹配
ES会把“西安市雁塔区”拆解成“西安市”和“雁塔区”两个词项,然后在message字段检索这两个的组合,当出现的前后顺序差值为1才符合条件。
POST /order/_search
{
"query":{
"match_phrase":{
"message":"西安市雁塔区"
}
}
}
20、match_phrase_prefix 前缀匹配
当我们在京东输入Iphone时,会自动显示出“Iphone11”、“Iphone11 Pro”、“Iphone 12”…没错,这个方法可以实现
POST /order/_search
{
"query":{
"match_phrase":{
"name":"Iphone"
}
}
}
21、query_string 查询字符串
1、default_field默认查询全部字段
2、query里的OR
必须大写,不然会被识别成词项。也可使用AND
POST /order/_search
{
"query":{
"query_string":{
"default_field":"message",
"query":"(Iphone11)OR(XIAOMI10)"
}
}
}
21、simple_query_string
针对20用例做了简化,取消了default_field
字段
常用简化操作符如下:
操作符 | flags | 说明 |
---|---|---|
+ | AND | 逻辑与 |
I | OR | 逻辑或 |
- | NOT | 逻辑非,用在某个词项前表示不包含这个项 |
" | PHRASE | 短语查询 |
* | PREFIX | 前缀查询,用在词项后面 |
POST /order/_search
{
"query":{
"simple_query_string":{
"field":["message"],
"query":"(Iphone11) | (XIAOMI10)"
}
}
}