1.利用bool查询实现地理位置的查询
首选外面要知道bool查询有几种逻辑关系?
must:必须匹配的条件,可以理解为“与”(参与算分)
should:选择性匹配的条件,可以理解为“或”(参与算分)
must_not:必须不匹配的条件,不参与打分
filter:必须匹配的条件,不参与打分
实例:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "如家"
}
}
],
"must_not": [
{
"range": {
"price": {
"gt": 400
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}
}
]
}
}
}
2.sort排序查询
实例1:利用sort对所有酒店进行排序(先按评分进行降序,如果有相同评分,就按价格升序来排序),自己自定义来排序的话,之前默认的按score(分数)来排序就无效了,也就是排序查询的结果中_score的值为null
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": "desc"
},
{
"price": "asc"
}
]
}
实例2:找到121.612282,31.034661周围的酒店,按距离升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 31.034661,
"lon": 121.612268
},
"order": "asc",
"unit": "km"
}
}
]
}
3.分页查询
es提供的分页查询有三种,其中两种最为常用,另外一种已经被官方不推荐使用,下面介绍一下最为常用的两种分页查询的方式吧~
方式一: from + size:
优点:支持随机翻页
缺点:深度分页问题,默认查询上限(from + size)是10000
场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
方式二:after search:
优点:没有查询上限(单次查询的size不超过10000)
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
下面就以from+size的方式作为实例:
分页查询(form:这一页开始的值 size:这一页的大小),这里是查询第30条到50条的数据
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": "asc"
}
],
"from": 30,
"size": 20
}
4.高亮查询
默认情况下,es搜索字段必须与高亮字段一致,想要不一致就要改require_field_match的值为false
实例:查询以all为字段集合包含“如家”的数据,并且在name字段里面对“如家”进行高亮处理,注意这里的all包含了多个字段,不单单只有name这个字段
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false"
}
}
}
}
至此,ElasticSearch文档数据的地理位置查询、sort排序查询、分页查询以及高亮查询的介绍和实例完成就到此结束啦~