【问题标题】:Correct SearchQuery for few parameters - Elasticsearch & Spring Boot为几个参数正确 SearchQuery - Elasticsearch & Spring Boot
【发布时间】:2019-09-10 09:57:46
【问题描述】:

我是 Elasticsearch 的新手。我正在尝试使用 ES 在 Spring Boot 应用程序中创建搜索,但我坚持使用 ES 中的查询。

这就是我的应用的样子。

型号:

@Entity
@Document(indexName = "sport", type = "sport")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sport {

   @Id
   @GeneratedValue
   private Long id;

   @Column(length = 256)
   private String name;

}

服务中的搜索方法:

@GetMapping(value = "/findSportByNameAndId/{name}/{id}")
public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(matchQuery("name", name)
                    .operator(AND)
                    .fuzziness(Fuzziness.TWO)
                    .prefixLength(3))
            .withQuery(matchQuery("id", id)
                    .operator(AND))
            .build();

    List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
    return sports;
}

上面模型的部分ES索引:

"content": [
    {
        "id": 2,
        "name": "Muay Thai"
    },
    {
        "id": 1,
        "name": "Kickboxing"
    },
    {
        "id": 3,
        "name": "Boxing"
    }
],

当我尝试使用 name 参数查找某些内容时,它始终坚持使用 id 并忽略 name。像这样:

SearchQuery 应该如何通过nameid 中找到Sport

【问题讨论】:

    标签: spring-boot elasticsearch spring-data-elasticsearch elasticsearch-java-api elasticsearch-query


    【解决方案1】:

    您基本上是在进行两次搜索;第一个带有 name 参数,第二个(覆盖第一个)带有 id。除非您使用 bool query,否则布尔运算符(在本例中为 AND)是无用的。

    【讨论】:

      【解决方案2】:

      终于,我知道如何解决它了。在这种情况下我需要使用QueryBuilder来指定每个参数:

      @GetMapping(value = "/findSportByNameAndId/{name}/{id}")
      public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){
      
          QueryBuilder qb = QueryBuilders.boolQuery()
                  .must(QueryBuilders.matchQuery("name", name)
                          .operator(AND)
                          .fuzziness(Fuzziness.TWO)
                          .prefixLength(3)
                  )
                  .filter(QueryBuilders.termQuery("id", id));
      
          SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(qb).build();
      
          List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
          return sports;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-04
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 2020-01-15
        • 2014-11-25
        • 2023-02-07
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多