# spring-data-elasticsearch2 **Repository Path**: mythosguo/spring-data-elasticsearch2 ## Basic Information - **Project Name**: spring-data-elasticsearch2 - **Description**: ES查询 repository方法查询 和ElasticsearchRestTemplate增删改查 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2021-04-27 - **Last Updated**: 2021-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-data-elasticsearch2 #### 介绍 ES查询 repository方法查询 和ElasticsearchRestTemplate增删改查 #### 软件架构 软件架构说明: 本项目使用springboot构建 **elasticsearch每个索引能存多大数据 ** ``` 每个shard大小是按照经验值30G到50G,因为在这个范围内查询和写入性能较好。 个索引有50tb,1000个shard,每个shard大小是按照经验值30G到50G,因为在这个范围内查询和写入性能较好。 //新增索引的同时添加分片,不使用默认分片,分片的数量 //一般以(节点数*1.5或3倍)来计算,比如有4个节点,分片数量一般是6个到12个,每个分片一般分配一个副本 PUT /testindex { "settings" : { "number_of_shards" : 12, "number_of_replicas" : 1 } } ``` **一、深度分页另类方案,修改最大展示数量,max_result_window** https://blog.csdn.net/weixin_34082854/article/details/88015907 **1.解决方案** 在上述后台错误信息中可以清楚的看到错误原因: Result window is too large, from + size must be less than or equal to: [10000] but was [19530]:意思为查询的结果总数太大为19530,大于了10000的限制。 See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting:提供了解决方案,意思为查看scroll的方法解决大数据量请求,也可以通过修改index.max_result_window参数改变限制的大小。 本文主要通过修改index.max_result_window参数快速解决问题。 **2.说干就干** 在elasticsearch系列的博客中提到,es分页是通过将from+size数量的数据加载到内存中,即我点击1953页,每页展示10条,es就会将19530条数据放入内存。弊端清晰可见,如果数据量过大将会十分占用内存,因此es默认限制了分页查询的最大数量为10000条。 如何修改分页查询最大数即index.max_result_window参数? 其实非常简单,在setting中配置即可。(可以在创建索引时设置,也可以在索引建立完毕之后设置) ``` PUT /索引名称/_settings { "index" : { "max_result_window" : 10000000}} ``` 复制代码 操作上述脚本,将最大展示数量改为1000W条。 **二、游标深度分页** https://blog.csdn.net/weixin_42641909/article/details/99678791 3. scroll深分页 对于上面介绍的浅分页,当Elasticsearch响应请求时,它必须确定docs的顺序,排列响应结果。 如果请求的页数较少(假设每页20个docs), Elasticsearch不会有什么问题,但是如果页数较大时,比如请求第20页,Elasticsearch不得不取出第1页到第20页的所有docs,再去除第1页到第19页的docs,得到第20页的docs。 解决的方式就是使用scroll,scroll就是维护了当前索引段的一份快照信息–缓存(这个快照信息是你执行这个scroll查询时的快照)。 可以把 scroll 分为初始化和遍历两步: 1、初始化时将所有符合搜索条件的搜索结果缓存起来,可以想象成快照; 2、遍历时,从这个快照里取数据; ``` 1-初始化的时候就像是普通的search一样 2-其中的scroll=3m代表当前查询的数据缓存3分钟 3-Size:3 代表当前查询3条数据 GET us/_search?scroll=3m { "query": {"match_all": {}}, "size": 3 } ``` ``` GET /_search/scroll { "scroll" : "1m", "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAPXFk0xN1BmSnlVUldhYThEdWVzZ19xbkEAAAAAAAAAIxZuQWVJU0VSZ1JzcVZtMGVYZ3RDaFlBAAAAAAAAA9oWTVZOdHJ2cXBSOU9wN3c1dk5vcWd4QQAAAAAAAAPYFk0xN1BmSnlVUldhYThEdWVzZ19xbkEAAAAAAAAAIhZuQWVJU0VSZ1JzcVZtMGVYZ3RDaFlB" } ``` #### 安装教程 1. 安装Elasticsearch 2. 安装kibana 3. 安装logstash 注意:安装的三个软件版本须一致; #### 使用说明 1. ES搜索引擎为倒排索引的搜索方式,可以进行全文索引,需要安装ik中文分词器,对中文词语分词,便于搜索的准确性; 2. kibana作为ES的可视化工具,可以实时监测ES集群状态(如果master挂掉,重新从slave子节点选举),编写ES查询语句(实质是通过接口传参的方式查询); 3. logstash作为ES搜索引擎和数据库的中介,定时从数据库更新查询到的数据到ES; #### 具体内容 有关于使用spring-data-Elasticsearch,封装的Repository方法Test实例;该方法通过一个接口继承ElasticsearchRepository接口,然后从spring容器取出对象,根据自定义方法名来查询,通过常规的delete方法删除,save方法添加/修改; 使用ElasticsearchRestTemplate对象来自定义查询方法,save添加/修改,delete删除,update修改指定字段,单字段查询,多字段查询,bool查询,match匹配查询,range范围查询, 分页查询,排序查询,高亮查询等,具体有一套通用的方法来实现;