ES中的查询分为URI Search、Request Body Search,DSL语句就是基于Request Body Search查询类型的。
- URI Search - 在URL中使用查询参数。
- Request Body Search - 使用JSON格式的入参作为查询条件。
查询索引相关的用法
- /_search 搜索
- /_count 统计数量
- /index1/_search index1索引
- /index1,index2/_search index1和index2索引
- /index*/_search 以index开头的索引
基础语法
// 搜索
GET /indexName/_search
{
"query": {
"查询类型": {
"查询条件": "条件值"
}
}
}
// 统计数量
GET /indexName/_count
{
"query": {
"match_all": {}
}
}
模糊匹配
match查询:全文检索的一种,会对用户输入的内容分词,然后去倒排索引库检索
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
精确查询
- term:根据词条精确值查询
- range:根据值的范围查询
// term查询
GET /indexName/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
// range查询
GET /indexName/_search
{
"query": {
"range": {
"FIELD": {
//大于等于
"gte": 10,
//小于等于
"lte": 20
}
}
}
}
布尔查询
布尔查询是一个或者多个查询子句的组合
- must:必须匹配每个子查询,类似“与”,
- should:选择性匹配子查询,类似“或”,
- must_not:必须不匹配,类似“非”不参与算分
- fiter:必须不匹配,不参与算分
#布尔查询
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "如家"
}
}
],
"must_not": [
{
"range": {
"price": {
"gt": 400
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": "31.21,121.51"
}
}
]
}
}
}
聚合查询
聚合必须的三要素:聚合名称、聚合类型、聚合字段
聚合类型分为:
- avg:求平均值
- max:求最大值
- min:求最小值
- sum:求和
- stats:同时求max、min、avg、sum等
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
},
"aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
"score_stats": { // 聚合名称
"stats": { // 聚合类型,这里stats可以计算min、max、avg等
"field": "score" // 聚合字段,这里是score
}
}
}
}
}
}
查询中的排序、分页、高亮显示
分页查询建议不能查询超过10000条,因为从ES从各个分片取数据,分页的数据查询量就越大,性能指数级下降,当然也可以通过设置索引的max_result_window来解除限制。
#通过评分和价格排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": {
"order": "desc"
},
"price": {
"order": "asc"
}
}
]
}
#分页
GET /hotel/_search
{
"query": {
"match_all": {}
},
//起始记录数
"from": 0,
//获取文档总数
"size": 20
}
#高亮显示
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
//开始标签
"pre_tags": "<em>",
//结束标签
"post_tags": "</em>",
//是否字段匹配,默认情况下搜索字段需要与高亮字段匹配
"require_field_match": "false",
//高亮字段
"fields": {
"name": {},
"brand": {}
}
}
}
Elasticsearch 应用案例
- GitHub: 2013年初,抛弃了Solr,采取Elasticsearch 来做PB级的搜索。“GitHub使用Elasticsearch搜索20TB的数据,包括13亿文件和1300亿行代码”。
- 维基百科:启动以Elasticsearch为基础的核心搜索架构
- SoundCloud:“SoundCloud使用Elasticsearch为1.8亿用户提供即时而精准的音乐搜索服务”。
- 百度:目前广泛使用Elasticsearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。
- 新浪:使用Elasticsearch分析处理32亿条实时日志
- 阿里:使用Elasticsearch构建日志采集和分析体系。
- Stack Overflow:解决Bug问题的网站,全英文,编程人员交流的网站。