# Spring-elastic_search **Repository Path**: nijialudaye/Spring-elastic_search ## Basic Information - **Project Name**: Spring-elastic_search - **Description**: Spring boot整合Elastic search实现全文检索 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 325 - **Created**: 2020-03-25 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring-elastic_search ### 介绍 Spring boot整合elastic search 6.8.1实现全文检索。主要包含以下特性: 1. 全文检索的实现主要包括构建索引、高级搜索、文本分词三个模块; 2. 索引的构建有增量更新和全量更新,一般第一次全量更新,以后增量更新; 3. 使用 **spring-boot-starter-data-elasticsearch** 来操作elasticsearch,构建索引时,根据实际情况考虑哪些字段需要分词,哪些不需要分词,这会影响搜索结果。当构建索引和搜索时,都需要经过“分析”,而分词是分析的一个环节。 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0805/082846_8cf33cda_1110335.png "微信截图_20190805082826.png") 4. 高级搜索实现了以下几种: - 普通查询,先分词再精准搜索:matchQuery - 精准查询,不分词直接搜索:termQuery - 模糊查询,搜索字符串接近的词:fuzzyQuery - 布尔查询,使用布尔运算组合多个查询条件:boolQuery - 范围查询:rangeQuery - 前缀查询:prefixQuery - 通配符查询:wildcardQuery - 多字段搜索,指定多个字符串字段进行搜索,非字符类型搜不到:multi_match 。可指定不同的搜索策略:多字段搜索的best fields策略,是指某个字段匹配的关键字最多得分最高,而不是匹配的字段数目最多得分最高。most fields策略则相反,是指匹配查询最多的优先而不是某个查询的相关性。cross_fields策略,允许搜索关键词跨越多个字段出现,通常需要指定operator为and才能搜的比较准确,因为这要求每个关键词都要能匹配到才能出现在搜索结果中。dis_max语法,就是忽略掉多字段搜索中匹配的字段数目,只取匹配分数最大的那一个字段的搜索作为最后得分,用来实现best fields策略。 - 全字段搜索,es自带的全字段搜索:query_string 。 - 经纬度搜索:distanceQuery - 日期分面搜索,使用聚集实现,统计每个区间文档的数目:dateHistogramAggregation 5. 文本分词使用了IK分词器:https://github.com/medcl/elasticsearch-analysis-ik 6. 原始数据提交到倒排索引中以前,es可以对原始数据进行一系列的转换操作,这个过程叫做分析。一个完整的分析过程,要经过大于等于0个字符过滤器,一个分词器,大于等于0个分词过滤器组成。在搜索的时候,根据搜索方法的不同也可以选择是否进行经过分析过程。通常match搜索要经过分析,term搜索则不用。 7. swagger入口:http://localhost:8080/swagger-ui.html ### 文档间的关系 - 使用对象存储文档间的关系,仅适用于一对一的场景。因为存储一对多的时候,搜索会出现跨对象的匹配,影响结果的准确性。 - 嵌套类型可以存储一对多的文档关系,但是把所有子表的数据塞到父表中,会降低系统的性能。子文档的更新需要重建整个索引。 - 定义父子关系用于处理一对多的文档关系,在子文档中添加一个_parent字段指向父文档,相当于一个外键。父子文档会被路由到 同一个分片,查询时需要将文档进行连接,效率低于嵌套,但是修改文档时索引不用重建。 - 反规范化通过复制数据来避免表连接,但是需要更多空间。反规范化是唯一能用于解决多对多的表关系,可以将多对多转化为多个 一对多。由于数据被复制,导致聚集和查询计算结果拥有重复数据导致结果不准确。 ### 集群搭建 我们在centos7搭建一个三台机器的elastic search集群,ip分别为172.16.3.151,172.16.3.152,172.16.3.153. 1. 关闭防火墙和selinux 2. 下载rpm包,运行rpm -ivh elasticsearch-6.8.1 3. 修改每个节点的elasticsearch.yml,在/etc/elasticsearch目录下 ``` cluster.name: wsz # 节点名,根据节点的不同给与不同名字 node.name: hadoop1 # 根据节点的实际ip填写 network.host: 172.16.3.151 # 节点的ip列表 discovery.zen.ping.unicast.hosts: ["172.16.3.151", "172.16.3.152", "172.16.3.153"] # 控制集群在达到多少个节点之后才会开始复制分片,一般为集群节点数目 gateway.recover_after_nodes: 3 ``` 4. 每个节点运行systemctl start elasticsearch.service 5. 查看集群状态,访问http://172.16.3.151:9200/_cluster/state ,显示有三个节点,搭建成功。 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0814/152002_3517b712_1110335.png "微信截图_20190814151942.png") ### 效果图 ![输入图片说明](https://images.gitee.com/uploads/images/2019/0812/114854_6715f7c0_1110335.png "QQ截图20190812114810.png") ![输入图片说明](https://images.gitee.com/uploads/images/2019/0812/114903_bf22e6dd_1110335.png "QQ截图20190812114831.png")