ElasticSearch7.x入门教程之全文搜索(五)
文章目录
- 前言
- 一、全文查询:match query
- 二、词项查询:term query
- 三、范围查询:range query
- 四、ids集合查询
- 总结
前言
搜索是 ElasticSearch 最为丰富有趣的功能,也是平常在工作当中用得最多的地方。
我相信,基本上也只是用到ES的搜索,比如全文查询、词项查询、复合查询、嵌套查询、位置查询、特殊查询等等。
案例用的数据,是自己通过SpringData导入的,后面再来记录结合Java使用。
索引building_info
(建筑地址索引)的mapping
如下:
"mappings" : {"properties" : {"_class" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"address" : { # 搜索的全名地址"type" : "text","analyzer" : "ik_smart"},"city_code" : { # 市"type" : "keyword"},"county" : {"type" : "keyword"},"create_time" : {"type" : "date"},"floor" : { # 楼层"type" : "keyword"},"id" : {"type" : "long"},"name" : { # 简称地址"type" : "text","analyzer" : "ik_smart"},"town_office" : { # 街道办事处"type" : "text","analyzer" : "ik_smart"},"type" : { # 房屋类型(城市住宅等)"type" : "keyword"}}}
一、全文查询:match query
- 1、简单搜索,不写查询条件,查询所有,默认查询 前10 条记录。
GET /building_info/_search
{"query": {"match_all": {}}
}# 或者
GET /building_info/_search
- 2、分页查询,只写分页参数,es 中也可以像关系型数据库一样,给一个分页参数,指定
from参数和size参数
。但是es中,默认最大跨度为10000条;查询到越是后面的数据,会出现深度分页问题,官方推荐就不能这样查询了,后面再来记录官网推荐的,解决深度分页问题
。
GET /building_info/_search
{"query": {"match_all": {}},"from": 0, "size": 20
}
- 3、查询结果过滤返回字段
GET /building_info/_search
{"query": {"match_all": {}},"_source": ["name","address","city_code"]
}
- 4、文档数的最小评分,有的文档得分特别低,说明这个文档和我们查询的关键字相关度很低。我们可以设置一个最低分,只有得分超过最低分的文档才会被返回。
GET /building_info/_search
{"query": {"match_all": {}},"min_score": 1.25
}
- 5、根据关键字查询
GET /building_info/_search
{"query": {"match": {"address": "草堂北路"}}
}
先对草堂北路
进行ik_smart
分词,分解成草堂
和北路
,分词之后,再去查询。
只要文档中包含一个分词结果,就回返回文档。换句话说,默认词项之间是 or
的关系,如果想要修改,也可以改为and
。
GET /building_info/_search
{"query": {"match": {"address": {"query": "草堂北路","operator": "and"}}}
}
此时就回要求文档
中必须同时
包含草堂
和北路
两个词。
- 6、查询关键字高亮
默认是<em>
标签,可以修改。
"highlight": {"fields": {"address": {"pre_tags": "<bold>","post_tags": "</bold>"}}}
有的时候,虽然我们是在 address字段中搜索的,但是我们希望 town_office字段中,相关的关键字也能高亮:
GET /building_info/_search
{"query": {"match": {"address": "草堂街道办事处"}},"highlight": {"require_field_match": "false", "fields": {"address": {},"town_office": {}} }
}
结果如下:
- 7、查询结果排序
排序很简单,默认是按照查询文档的相关度来排序的,即(_score 字段):
GET /building_info/_search# 等价于
GET /building_info/_search
{"sort": [{"_score": {"order": "desc"}}]
}
然后,match_all
查询只是返回所有文档,不评分,默认按照添加顺序返回,可以通过 _doc 字段对其进行排序:
GET /building_info/_search
{"query": {"match_all": {}}, "sort": [{"_score": {"order": "desc"}}],"size": 5
}
es 同时也支持多字段排序:
GET /building_info/_search
{"query": {"match_all": {}}, "sort": [{"_score": {"order": "desc"}}, {"create_time": {"order": "desc"}}],"size": 5
}
二、词项查询:term query
- 1、单个词项查询
就是根据词去查询,查询指定字段中包含给定单词的文档,term 查询不被分词,只有搜索的词和文档中的词精确匹配
,才会返回文档。应用场景如:人名、地名等等。
比如:查询 type
等于城市住宅
的文档:
GET /building_info/_search
{"query": {"term": {"type": "城市住宅"}}
}
结果如下:
词项term
可以添加的参数和全文match查询
添加的参数大致一样,我这边就不测试了。
- 2、多个关键词查询
GET /building_info/_search
{"query": {"terms": {"name": ["城市住宅", "城市住宅房", "别墅"]}}
}
三、范围查询:range query
范围查询,可以按照日期范围、数字范围等查询。
range query 中的参数主要有四个:gt
、lt
、gte
、lte
案例:
# 楼层为大于20层,小于25层
GET /building_info/_search
{"query": {"range": {"floor": {"gte": 20,"lte": 25}}}
}
四、ids集合查询
这种情况下,可以传递一个id集合
,优化查询。
GET /building_info/_search
{"query": {"ids": {"values": [36636, 36637, 36638]}}
}
总结
记录在工作当中会用到的情形,如果有新遇到的会再次添加。