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

How to construct nested query using criteria and criteriaQuery in spring-data-elasticsearch

我正在使用 spring-data-elasticsearch。我使用带有很多子标准的标准构建了大部分查询条件。现在我想为嵌套字段包含一个简单的查询条件。但是标准 corms 查询使用 uery_string API which is not working for nested fields. I am expecting 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);

目前 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\":\"\"," +
    "\"fields\":[\"ae.su.keyword\"]}}]}}}}".replace("", value));
return operations.search(query, Foo.class);

编辑 2021 年 4 月 1 日:

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

编辑 2021 年 4 月 5 日:

从 4.2.0.GA 到

已修复