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 到
已修复
我正在使用 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 到
已修复