记录es几个问题,增删改查,索引创建
一,【es版本】
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<elasticsearch.version>7.1.0</elasticsearch.version>
es依赖,版本号
存在版本匹配问题
为什么high level版本是 7.6.2
bulkIndex 底层分批
二,【should must filter matchQuery termQuery 区别联系】
BoolQueryBuilder queryBuilder = buildQueryBuilder()
should must filter 属于BoolQueryBuilder方法,相当于父层级,方法入参:QueryBuilder 。相当于:and or
matchQuery termQuery 属于 QueryBuilders 方法,相当于子层级,作为上面入参:构建条件为上面参数 QueryBuilder 子类,多态实现。相当于:= like,也比较符合sql写法:先and或者or,再写具体条件 是精确匹配还是模糊匹配。
代码示例:
BoolQueryBuilder queryBuilder = buildQueryBuilder();
queryBuilder.should(QueryBuilders.matchQuery(“name”, queryWord))
.should(QueryBuilders.termQuery(“name” + “.keyword”, queryWord))
.should(QueryBuilders.wildcardQuery(“spy”, “” + queryWord + “*“))
.should(QueryBuilders.wildcardQuery(“fpy”, “” + queryWord + “*“)).minimumShouldMatch(1);
参考文档:
https://blog.csdn.net/lom9357bye/article/details/52852533
三,【matchQuery 完全可以满足要求,.keyword什么用】
代码如下
queryBuilder.should(QueryBuilders.matchQuery(“name”, queryWord))
.should(QueryBuilders.termQuery(“name” + “.keyWord”, queryWord))
什么场景用 .keyword,名字查询。
比如现在es中存在数据名字有 杜兰特,莫兰特 兰特 布莱恩特 米兰。现在查询条件“兰特”,
如果只用matchQuery,完全可以查询到所有数据,因为条件 兰特 本身会分词,名字中包含 ‘兰’ 或者 ‘特’。
查询结果如下:杜兰特 兰特 莫兰特 布莱恩特 米兰,但是有一个问题,名字为:’兰特’,为什么不是在第一个被检索到。
这时候 .keyword上场了,可以解决这个问题。
参考这个:
https://blog.csdn.net/tyw15/article/details/111930660
四,【es 增删改查实现方式】
1.RestHighLevelClient
2.ElasticsearchRepository—PagingAndSortingRepository(page)—CrudRepository—Repository。底层到spring repository
ElasticsearchRepository —Page
2.AbstractElasticsearchRepository—ElasticsearchRepository
3.ElasticsearchRestTemplate —AbstractElasticsearchTemplate—ElasticsearchOperations— extends DocumentOperations(bulkIndex), SearchOperations
ElasticsearchRepository 实现原理完全有方法名决定,不需要实现
【ElasticsearchRepository实现原理】
https://blog.csdn.net/u013089490/article/details/84323903
【FuzzyQueryBuilder模糊、WildcardQueryBuilder模糊 区别】
五,【索引自动生成,什么时候,在哪里】
首先需要定义实体类加注解,代码中@Document(indexName = “manager”, shards = 1, replicas = 0, refreshInterval = “10s”, createIndex = true)
1.项目启动时创建_源码——AbstractElasticsearchRepository 判断条件是 1.根据注解属性 createIndex 是否等于true 2.索引是否存在
2.写入es数据时创建
但是经过测试
1.项目启动,自动创建设置为true,并没有创建索引,索引之前也不存在。那原因可能是索引从缓存中获取,缓存中还存在索引
2.写入数据时,确实自动创建了索引,无论createIndex = true or false。
由此推断,两种创建索引原理不同。
方式2创建索引,原理,待补充。
六,【自动创建索引,字段分析】
实体中定义vs mapping
日期类型:自动创建类型是 long
Doulbe:float类型
integer: long
String:默认会生成两种类型 text keyword,无论实体中指定类型是keyword text,并没有效果
七,【手动创建与自动创建 选哪一个】
问题重现:手动创建一个索引,字段是下划线间隔。但是后面发现索引mapping多了几个字段,驼峰形式。
原因:写入es数据时,实体中存在mapping中之前没有的字段,会重现生成(驼峰vs下划线),索引没有重建,只是变更了mapping
解决方案:
1.禁止自动创建,手动创建
2.实体字段与索引字段定义为一样,不新增。不带下划线
3.实体转下划线,用JSONField(a_b),生成mapping字段还是驼峰,非下划线
暂定方式二。
测试手动创建,援引自动创建代码_AbstractElasticsearchRepository,但是结果是严格按照定义的字段创建,且不加filed字段,不产生字段。自动创建格式见上
八,【数据重复写入覆盖,非增量】
把唯一业务字段写入es主键
还没有评论,来说两句吧...