结论

先说结论: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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐