【问题标题】:How to construct nested query using criteria and criteriaQuery in spring-data-elasticsearch如何在 spring-data-elasticsearch 中使用条件和条件查询构造嵌套查询
【发布时间】:2021-03-15 12:20:23
【问题描述】:

我正在使用 spring-data-elasticsearch。我使用具有许多子标准的标准构建了大多数查询条件。现在我想为嵌套字段包含一个简单的查询条件。但是使用uery_string API 的标准corms 查询不适用于嵌套字段。我期待Nested query

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

嵌套映射

{
    "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”字段。使用此字段构建 criteriaQuery 使用此字段构造 query_string 查询,它不会按预期返回正确的文档作为响应。我的期望是,有没有办法使用标准构建嵌套查询?还是覆盖现有条件查询?

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

【问题讨论】:

  • 您能否提供一个最小示例来重现此内容(实体、CriteriaQuery 以及您希望发送到 Elasticsearch 的查询)?
  • 感谢添加映射。但是您能否提供一个示例来重现这一点 - 特别是您如何构建查询和实体定义。

标签: spring-data-elasticsearch


【解决方案1】:

目前 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);

编辑 01.04.2021:

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

编辑 05.04.2021:

从 4.2.0.GA 开始修复

【讨论】:

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