结论
先说结论: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‘。
版权归原作者 大尾巴 所有, 如有侵权,请联系我们删除。