【ElasticSearch】搜索语法

一、搜索语法:

1、query string search

执行GET ucms_documentsAliases/_search直接查

2、query DSL

查所有:
{
“query”: {“match_all”: {}}
}
排序:
{
“query”: {
“match”: {
“title”: “28”
}
},
“sort”: [
{
“createTime”: {
“order”: “desc”
}
}
]
}
分页:
{
“query”: {
“match”: {
“title”: “28”
}
},
“from”: 0,
“size”: 10
}
指定查出id,title,type:
{
“query”: {
“match”: {
“title”: “28”
}
},
“_source”: [“id”,“title”,“type”]
}

3、query filter

过滤,范围查找(bool可使用多条件)
{
“query”: {
“bool”: {
“must”: [{“match”: {
“title”: “28”
}}],
“filter”: {“range”: {
“duration”: {
“gte”: 4,
“lte”: 6
}
}}
}
}
}

4、full-text search

5、phrase精确匹配

【ElasticSearch】搜索语法
搜索yagao producer,会出现四条数据,但是4匹配度最高,max_score最大
如果改为:
“query”: {
“match_phrase”: {
“title”: “yagao producer”
}
}
只会匹配出一条

6、highlight 高亮:

{
“query”: {
“match”: {
“title”: “28”
}
},
“highlight”: {
“fields”: {“title”:{}}
},
“from”: 0,
“size”: 10
}

聚合分析:

1、计算每个type下的文章数量:

{
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”,
“size”: 10
}
}
}
}
加上size:0,搜索结果只展示aggregations:
{
“size”: 0,
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”,
“size”: 2
}
}
}
}

2、对名称中包含28的文章,计算每个type下的文章数量:加个query即可

{
“size”: 0,
“query”: {“match”: {
“title”: “28”
}},
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”,
“size”: 2
}
}
}
}

3、先分组,再算每组的平均值,计算每个type下的文章平均duration时长

{
“size”: 0,
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”
},
“aggs”: {
“avg_duration”: {
“avg”: {
“field”: “duration”
}
}
}
}
}
}

4、计算type下的时长平均值,再按照平均值降序

{
“size”: 0,
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”,
“order”: {
“avg_duration”: “desc”
}
},
“aggs”: {
“avg_duration”: {
“avg”: {
“field”: “duration”
}
}
}
}
}
}

5、按指定时长范围分组,然后再每组内再按照type分组,最后再计算每组的平均时长

{
“size”: 0,
“aggs”: {
“group_by_duration”: {
“range”: {
“field”: “duration”,
“ranges”: [
{
“from”: 50,
“to”: 100
},
{
“from”: 100,
“to”: 200
},
{
“from”: 200,
“to”: 1000
}
]
},
“aggs”: {
“group_by_type”: {
“terms”: {
“field”: “type”
},
“aggs”: {
“avg_duration”: {
“avg”: {
“field”: “duration”
}
}
}
}
}
}
}
}

三、_index,_type,_id,_source元数据:

_index元数据:

1)代表一个document存放在哪个index中
2)类似的数据放在一个索引,非类似的(字段大部分不同)放在一个索引,或者各种数据都放一个大的索引里都是不合理的
3)索引名称必须小写,不能下划线开头,不能包含逗号

很大的一个index,比如包含各种不同数据,product,sales,employee等等,后台数据分析系统负责分析最近一年销售相关的趋势变化,并且计算出各种复杂的数据指标,aggs,跑一条超复杂的聚合分析查询,涉及的数据了很大。
前台主要搜索product数据,需要耗费30s才能完成这次大数据量的批量分析,所有shard都会耗费大量的资源,IO、CPU、内存,去执行这一次大的聚合分析。查product的请求,大量过来,跟正在聚合分析的请求落到同一个shard执行,此时该shard正在执行非常耗时,耗费资源的大型聚合分析操作,可能导致document get请求,大量的性能不好,超时,影响用户体验。

_type元数据:

1)代表document属于index中哪个类别
2)一个索引可划分为多个type,比如商品分为电子商品,生鲜,日化等
3)名称可以大写或小写,但不能下划线开头,不能包含逗号

_id元数据:

1)代表document的唯一标识,与index和type一起,可唯一标识一个document
2)可手动指定document的id(put /index/type/id),也可es自动为我们创建一个id
自动生成的id长度20个字符,url安全,base64编码,GUID, 分布式并行生成id不冲突(es内部处理,put请求不可能在不同shard生成相同的id)

_source元数据:

指定返回几个字段:
put /index/type/1
{
“field1”:“field1”,
“field2”:“field2”
}

或者:定制返回的结果,指定返回哪些field
get /index/type/1?_source=field1,field2

上一篇:python-Scapy嗅探功能无法捕获任何数据包


下一篇:Elasticsearch 聚合查询(aggs),Java性能优化面试题集锦