ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象相关的知识,希望对你有一定的参考价值。
让我说我有以下文件:
{
id: 1,
name: "xyz",
users: [
{
name: 'abc',
surname: 'def'
},
{
name: 'xyz',
surname: 'wef'
},
{
name: 'defg',
surname: 'pqr'
}
]
}
我想在搜索响应中仅获取与所有顶级字段匹配的嵌套对象。我的意思是如果我搜索/过滤名为'abc'的用户,我想要低于响应
{
id: 1,
name: "xyz",
users: [
{
name: 'abc',
surname: 'def'
}
]
}
我怎样才能做到这一点?
答案
如果您可以使用除嵌套字段之外的所有根字段,然后只在嵌套字段中匹配内部匹配,那么我们可以通过指定稍微更复杂的源过滤参数来重复使用之前的答案:
{
"_source": {
"includes": [ "*" ],
"excludes": [ "users" ]
},
"query": {
"nested": {
"path": "users",
"inner_hits": { <---- this is where the magic happens
"_source": [
"name", "surname"
]
},
"query": {
"bool": {
"must": [
{
"term": {
"users.name": "abc"
}
}
]
}
}
}
}
}
另一答案
也许迟到了,我使用嵌套排序来限制嵌套关系中的元素,这里是一个例子:
"sort": {
"ouverture.periodesOuvertures.dateDebut": {
"order": "asc",
"mode": "min",
"nested_filter": {
"range": {
"ouverture.periodesOuvertures.dateFin": {
"gte": "2017-08-29",
"format": "yyyy-MM-dd"
}
}
},
"nested_path": "ouverture.periodesOuvertures"
}
},
从5.5 ES(我认为)你可以使用嵌套查询过滤器。这里是我使用的嵌套查询过滤器的示例:
{
"nested": {
"path": "ouverture.periodesOuvertures",
"query": {
"bool": {
"must": [
{
"range": {
"ouverture.periodesOuvertures.dateFin": {
"gte": "2017-08-29",
"format": "yyyy-MM-dd"
}
}
},
{
"range": {
"ouverture.periodesOuvertures.dateFin": {
"lte": "2017-09-30",
"format": "yyyy-MM-dd"
}
}
}
],
"filter": [
{
"range": {
"ouverture.periodesOuvertures.dateFin": {
"gte": "2017-08-29",
"format": "yyyy-MM-dd"
}
}
},
{
"range": {
"ouverture.periodesOuvertures.dateFin": {
"lte": "2017-09-30",
"format": "yyyy-MM-dd"
}
}
}
]
}
}
}
}
希望这可以帮助;)
另外,如果您的ES不在最后一个版本(5.5)中,inner_hits可能会减慢您的查询Including inner hits drastically slows down query results
以上是关于ElasticSearch - 仅搜索与搜索响应中的所有顶级字段匹配的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章
《Elasticsearch 源码解析与优化实战》第9章:Search流程
Elasticsearch使用自适应副本选择改进弹性搜索的响应延迟