ElasticSearch搜索-URI Search

ES的索引和映射解决了数据的存储问题,类似于关系型数据库,搜索/查询也是ES非常重要的功能之一。搜索方式有2种,一种是通过URI Search的方式;另外一种是POST 请求体的方式,本篇先介绍一下URI Search。

这种方式是通过HTTP GET 的方式进行搜索,多个参数间使用&分隔,如下所示:

GET /my_user/_search?q=jack&df=name&from=0&size=10&sort=birthday:asc
{
  "profile": "true"
}

上面的搜索的意思是:搜索关键字为:jack,指定搜索字段为name,从索引为0的位置取10条数据,根据birthday升序排序。其中,URI Search 的搜索参数字段明细如下所示:


首先我们先初始化一下下面查询所需要的数据

POST _bulk
{"index":{"_index":"my_user","_id":"1"}}
{"age":26,"birthday":"1992/12/03","name":"Jack Ma","username":"Jack Hangzhou"}
{"index":{"_index":"my_user","_id":"2"}}
{"name":"Jacky Chen","age":30,"birthday":"1980/02/03","username":"Jack Hongkong"}
{"index":{"_index":"my_user","_id":"3"}}
{"name":"Jack Xue","age":35,"birthday":"1975/12/03","username":"Jacky Shanghai"}

指定字段查询 VS 范查询

// 指定字段查询, 和df 参数等效
GET /my_user/_search?q=name:jack

// 泛查询 (对所有字段查询)
GET /my_user/_search?q=jack

Term VS Phase

// Term, 等价于 jack OR ma
GET /my_user/_search?q=name:jack ma

// Phase, 等价于 jack AND Ma
GET /my_user/_search?q=name:"jack ma"

分组和引号

// 下面2种查询是等效的
GET /my_user/_search?q=name:"jack ma"

GET /my_user/_search?q=name:(jack AND ma)

布尔操作

// 搜索结果必须包含 jack 和 ma
GET /my_user/_search?q=name:(jack AND ma)

// 搜索结果包含 jack 或 ma
GET /my_user/_search?q=name:(jack OR ma)

分组

// +表示必须包含 -表示必须不包含
GET /my_user/_search?q=name:(+jack -ma)

范围查询

// () 表示开区间
GET /my_user/_search?q=age:(25 TO 30)
// [] 表示闭区间 * 表示 MAX_VALUE
GET /my_user/_search?q=age:[30 TO *]

算数符号

// 查询 age > 30的用户
GET /my_user/_search?q=age:>30
// 查询 age在 30-35之间的用户
GET /my_user/_search?q=age:(>=30 AND <=35)

通配符查询

通配符查询占用内存较大,效率较低,不建议使用。

1、? 表示一个字符, * 表示0个或多个字符。

GET /my_user/_search?q=name:jacky*
GET /my_user/_search?q=name:*ack*

2、模糊匹配

GET /my_user/_search?q=username:Jack~1


参考:《ElasticSearch技术解析与实战》、《极客时间:ElasticSearch核心技术与实战》