Elasticsearch中ElasticsearchRepository的searchSimilar使用的坑
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‘。
更多推荐
所有评论(0)