介绍
Spring boot整合elastic search 7.9.1实现全文检索。主要包含以下特性:
- 全文检索的实现主要包括构建索引、高级搜索、聚集统计、数据建模四个模块;
- 使用 elasticsearch-rest-high-level-client 来操作elasticsearch,构建索引时,根据实际情况考虑哪些字段需要分词,哪些不需要分词,这会影响搜索结果。使用IK分词器虽然能解决一些中文分词的问题,但是由于分词的粒度不够细,导致很多词语可能搜不到。例如ik分词器在构建索引“三国无双”时,会把“三国”“无双”存起来建索引,但是搜索“国无”时,搜不出来,因此,我们采用把文本拆分到最细粒度来进行分词,从而最大限度地搜索到相关结果。详情参考:如何手动控制分词粒度提高搜索的准确性
- 高级搜索实现了以下几种:多字段搜索,指定多个字段进行搜索:query_string,支持高亮显示经纬度搜索:distanceQuery范围过滤,对搜索结果进一步按照范围进行条件过滤:rangeQuery
- 搜索结果的展示提供了普通分页和滚动分页两种实现。普通分页只适合数据量较小的场景,在数据量非常大的情况下,start+size普通分页会把全部记录加载到内存中,这样做不但运行速度特别慢,而且容易让es出现内存不足而挂掉。滚动分页需要得到一个scrollid,以后每次使用scrollid去获取下一页的内容,缺点是不能跳页。
- 聚集统计包含词条聚集、日期直方图聚集、范围聚集,并使用chart.js进行可视化
- 数据建模部分实现了嵌套对象的使用,查询时无需join性能较好,但是在建索引时就要把关联数据join好嵌套进去。
- swagger入口:http://localhost:8080/swagger-ui.html
- 新增数据库数据导入es的工具,编程实现比logstash灵活。使用请切换分支到master。db-import-elastic_search
- 通用的多条件查询结构模板是布尔查询,其中must部分放入带分词的搜索例如match、querystring等;filter部分放入过滤条件例如term、range等查询。因为filter部分利用缓存、跳过相关度打分提高性能:
// 通用查询结构模板
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
构建索引
搜狗日志列表
经纬度搜索
数据统计分析
各国家城市列表
has parent搜索
has child搜索
源代码地址:Spring-elastic_search: Spring boot整合Elasticsearch实现全文检索和大数据分析