当前位置: 首页 > 知识库问答 >
问题:

Spring Data Elasticsearch嵌套字段多映射查询

柴深
2023-03-14

我正在使用弹性搜索和Spring数据弹性。并尝试使用多重搜索。问题是在使用类字段搜索时,它不适用于嵌套字段。我的映射如下所示

{
    "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的endpoint,比如:

  @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();

共有1个答案

封鸿雪
2023-03-14

正如文档所说,当您查询嵌套字段时,您必须使用嵌套查询:

因为嵌套对象作为单独的隐藏文档编制索引,所以我们无法直接查询它们。相反,我们必须使用嵌套查询来访问它们:

回到spring数据,我更喜欢使用查询,这在我看来更具可读性:

@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将实现一个代理来完成其他工作。

 类似资料:
  • 假设我有这些实体: null

  • 我想映射到产品字段,而不创建类 应该如何序列化和反序列化?

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 我有一个带有对象的RealmObject类,它实际上是PrimaryKey作为这个对象中的字符串。但不允许将对象作为主键。 因为目前不可能更改服务器的响应结构,所以我尝试了不同的方法来解决这个问题。但到目前为止,没有一个奏效。我在Android Studio中使用“io.realm:realm-gradle-plugin:0.87.2”作为和“realm-android”插件。 谢谢beeende

  • 我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->