0


Elasticsearch中ElasticsearchRepository的searchSimilar使用的坑

结论

先说结论:ElasticsearchRepository.searchSimilar只能使用ID字段进行查询

分析过程

elasticsearch 4.x提供了ElasticsearchRepository<T, ID>,方便开发人员编写CURD操作。其中提供了一个抽象方法searchSimilar(T,String[],Pageable)。从命名看可以进行模糊查询,但是具体实现中是有问题的。

spring-data-elasticsearch版本号:4.1.3

方法入参中的T,需要提供一个ID字段,若不提供ID字段则会报错“No document id defined for MoreLikeThisQuery“。一开始还在想为什么一定要指定ID字段,后续跟踪发现,searchSimilar默认只能使用ID进行匹配查询。

跟踪方法调用至“rg.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate#search(org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery, java.lang.Class, org.springframework.data.elasticsearch.core.mapping.IndexCoordinates)”这个方法,查看生成的查询语句如下:

{"more_like_this":{"fields":["info_content_"],"like":[{"_index":"data_analysis_","_id":"x1YdKHoBhbMQeLLaXKrn"}],"max_query_terms":25,"min_term_freq":2,"min_doc_freq":5,"max_doc_freq":2147483647,"min_word_length":0,"max_word_length":0,"minimum_should_match":"30%","boost_terms":0.0,"include":false,"fail_on_unsupported_field":true,"boost":1.0}}

从生产的查询条件可以看到,like_texts被like替换了,并且在like中指定了模糊查询的条件是ID字段。

为什么没有like_texts?

继续跟踪代码,发现在“org.springframework.data.elasticsearch.core.RequestFactory#moreLikeThisQueryBuilder”中构建查询语句的时候,like_texts直接赋值了’null‘。
likeTexts=null


本文转载自: https://blog.csdn.net/u011924665/article/details/126901140
版权归原作者 大尾巴 所有, 如有侵权,请联系我们删除。

“Elasticsearch中ElasticsearchRepository的searchSimilar使用的坑”的评论:

还没有评论