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

如何在spring data elasticsearch中使用criteriaQuery和criteriaQuery构造嵌套查询

丁景山
2023-03-14

我正在使用spring-data-elasticsearch。我已经使用带有许多子标准的标准构建了大多数查询条件。现在我想为嵌套字段包含一个简单的查询条件。但是使用uery_stringAPI来标准corms查询,这不适用于嵌套字段。我期待嵌套查询。

如何在没有NativeSearchQuery的情况下使用条件来支持这一点?

嵌套映射

{
    "ae": {
        "type": "nested",
        "properties": {
            "atb": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "su": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

我想查询“ae.su.keyword”字段。构建标准使用此字段的查询使用此字段构建query_string查询,这不是按照预期重新生成正确的文档作为响应。我的期望是,有没有办法使用标准构建嵌套查询?或覆盖现有的标准查询?

Criteria criteria = new Criteria("ae.su.keyword").is("VALUE");
CriteriaQuery query = new CriteriaQuery(criteria);
elasticOperations.search(query, Foo.class, index);

共有1个答案

毋树
2023-03-14

目前Spring Data Elasticsearch的CriteriaQuery不支持创建嵌套查询。

当前使用示例代码创建的查询是(清除不相关的部分):

{
    "query": {
        "bool": {
            "must": [
                {
                    "query_string": {
                        "query": "one",
                        "fields": [
                            "ae.su.keyword^1.0"
                        ]
                    }
                }
            ]
        }
    }
}

使用嵌套对象,您需要的查询将是:

{
  "query": {
    "nested": {
      "path": "ae",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "one",
                "fields": [
                  "ae.su.keyword"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

基本上是将现在构建的查询包装在一个额外的嵌套查询中。

正如我所写的,目前不支持创建这个嵌套查询。除了构建NativeSearchQuery,您还可以使用StringQuery(是的,它也很难看):

Query query = new StringQuery("{\"nested\":{\"path\":\"ae\",#" +
    "\"query\":{\"bool\":{\"must\":[{\"query_string\": {\"query\":\"$1\"," +
    "\"fields\":[\"ae.su.keyword\"]}}]}}}}".replace("$1", value));
return operations.search(query, Foo.class);

2021年4月1日编辑:

这个话题再次出现在一个问题中,我打开了一个bug问题来解决这个问题。这些天我会去实施这个修复。

编辑05.04.2021:

从4.2.0开始修复。GA开启

 类似资料:
  • 问题内容: 给定以下结构,我想执行以下SQL的HQL或CriteriaQuery等效项: 我想找回与给定人员关联的位置列表,其creationDate在给定位置之后。 提前致谢! 标记 编辑***:我已经编辑了SQL,因为这有点误导。我不想独立查询位置。 问题答案: 这是不可能的,您无法查询。从JPA Wikibook: 嵌入式收藏 的映射可以被用来定义的集合 的对象。这不是对象的典型用法,因为对

  • 问题内容: 我对JPA 2相当陌生,它是CriteriaBuilder / CriteriaQuery API: Java文档 在Java EE 6教程中 我想计算一个CriteriaQuery的结果而不实际检索它们。那有可能吗,我没有找到任何这样的方法,唯一的办法就是这样做: 那不可能是正确的方法… 有解决方案吗? 问题答案: 类型查询将返回。您要查询。 显然,您将希望使用示例中跳过的任何限制和

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 我正在使用JPA2。出于安全原因,我正在使用CriteriaQuery进行类型安全的操作(因此,我没有在搜索针对类型查询的任何解决方案,等等)。 我最近遇到了一个需要设置SQL-LIMIT的问题。 经过大量搜索,我仍然没有找到成功的解决方案。 谁能帮我? 问题答案: 在查询上定义限制和偏移量: 从文档中: TypedQuery setFirstResult(int startPosit

  • 我有两个表,它们通过一个外键来维护它们之间的父子关系。查询如下所示。我想在使用jpa的同时使用标准版。所以有人可以帮助我使用标准版吗 表“child”的“notification\u id\u child”列是外键,并引用表“parent”的主键。