【问题标题】:Spring Data Elasticsearch nested field multimatch querySpring Data Elasticsearch 嵌套字段多匹配查询
【发布时间】:2017-12-03 08:36:16
【问题描述】:

我正在使用带有 spring-data-elastic 的 elasticsearch。并尝试使用多重搜索。问题是在使用类字段搜索 wprking 时,它不适用于嵌套字段。我的映射如下所示

{
    "archieve": {
        "mappings": {
            "author": {
                "properties": {
                    "books": {
                        "type": "nested",
                        "properties": {
                            "id": {
                                "type": "long"
                            },
                            "name": {
                                "type": "string",
                                "analyzer": "standard"
                            }
                        }
                    },
                    "id": {
                        "type": "long"
                    },
                    "firstName": {
                        "type": "string",
                        "analyzer": "standard"
                    },
                    "lastName": {
                        "type": "string",
                        "analyzer": "standard"
                    }
                }
            }
        }
    }
}

我有一个带有 searchQuery 的端点,例如:

  @GetMapping(value = "/es/archieve/multi/{keyword}")
  public Page<Author> getBrandMulti(@PathVariable String keyword, Pageable pageable) {

      SearchQuery searchQuery = new NativeSearchQueryBuilder()
                      .withQuery(QueryBuilders.multiMatchQuery(keyword)
                              .field("firstName", 1.2f)
                              .field("books.name", 1.1f)
                              .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS)
                              .fuzziness(Fuzziness.TWO)
                      )
                      .withIndices("archieve")
                      .withTypes("author")
                      .withPageable(pageable)
                      .build();

      return elasticsearchTemplate.queryForPage(searchQuery, Author.class);
  }

问题是查询不适用于嵌套字段。有什么建议吗?

更新

其实嵌套对象可以查询为

NativeSearchQueryBuilder()
    .withQuery(QueryBuilders.nestedQuery("books", 
         QueryBuilders.termQuery("books.name", searchKey)))

有没有办法连接两个查询,比如

NativeSearchQueryBuilder()
    .withQuery(Query1)
    .withQuery(Query1)
    .build();

【问题讨论】:

    标签: elasticsearch spring-boot spring-data-elasticsearch


    【解决方案1】:

    ES 嵌套对象

    正如the document所说,当你查询一个嵌套字段时,你必须使用嵌套查询:

    因为嵌套对象被索引为单独的隐藏文档,我们不能直接查询它们。相反,我们必须使用嵌套查询来访问它们:

    弹簧数据

    回到spring数据,我更喜欢使用Query的方式,IMO,更具可读性:

    @Query(" {" +
            " \"bool\": {\n" +
            "     \"should\": [\n" +
            "       {\n" +
            "         \"multi_match\": {\n" +
            "           \"query\": \"?0\",\n" +
            "           \"fields\": [\"firstName\"]\n" +
            "         }\n" +
            "       },\n" +
            "       {\n" +
            "         \"nested\": {\n" +
            "           \"path\": \"books\",\n" +
            "           \"query\": {\n" +
            "             \"match\": {\n" +
            "               \"books.name\": \"?0\"\n" +
            "             }}\n" +
            "         }\n" +
            "       } ]\n" +
            "  }" +
            "}")
    Page<EsBrand> findByNameOrBooks(String info, Pageable pageable);
    

    您可以将此签名放在您的 repo 接口中,spring 将实现一个代理来完成其他工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 2015-10-02
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多