match_phrase_prefix 查询不适用于嵌套聚合
match_phrase_prefix query not working with nested aggregation
我无法在 Elasticsearch v6.8.0
中使用 match_phrase_prefix
限制嵌套聚合查询的结果
我可以使用 match_phrase_prefix
限制非嵌套聚合的结果。我希望能够将相同的逻辑应用于嵌套字段,如下所示。索引映射正确地将嵌套字段类型列为嵌套,并且我能够在没有任何过滤器的情况下成功聚合字段(使用 match_all
)。
成功 非嵌套字段聚合 match_phrase_prefix
查询:
GET index/_search
{
"query":{
"match_phrase_prefix": {
"field1": "Nurse"
}
},
"size":0,
"aggs":{
"field1":{
"terms":{
"field":"field1",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
成功嵌套字段聚合(无match_phrase_prefix
):
GET index/_search
{
"query":{
"match_all": {}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
}
}
不成功 嵌套字段聚合 match_phrase_prefix
:
GET index/_search
{
"query":{
"match_phrase_prefix": {
"field2.nestedField": "en"
}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
}
}
第三个查询的预期输出是键与前缀过滤器匹配的桶列表。相反,我看到一个空的结果列表。有没有一种方法可以构造 match_phrase_prefix
来处理嵌套字段?或者在术语级别应用过滤器的方法?
使用嵌套顶级查询解决了这个问题。
请参阅此问题以了解工作解决方案(使用 terms
而不是 prefix
过滤器):
示例:
GET index/_search
{
"query":{
"nested":{
"path":"field2",
"query":{
"match_phrase_prefix":{
"field2.nestedField":"en"
}
}
}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"innerFilter":{
"filter":{
"prefix":{
"field2.nestedField":"en"
}
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count":"desc"
}
}
}
}
}
}
}
}
}
您需要为此使用嵌套查询(文档 here)
这个查询
"query":{
"match_phrase_prefix": {
"field2.nestedField": "en"
}
}
return 没有,因为您的索引文档不包含 nestedField
字段。该字段属于嵌套文档。
正确的查询是:
GET index/_search
{
"query": {
"nested": {
"path": "field2",
"query": {
"match_phrase_prefix": {
"field2.nestedField": "en"
}
}
}
},
"size": 0,
"aggs": {
"field2": {
"nested": {
"path": "field2"
},
"aggs": {
"field2.nestedField": {
"terms": {
"field": "field2.nestedField",
"size": 100,
"order": {
"_count": "desc"
}
}
}
}
}
}
}
我无法在 Elasticsearch v6.8.0
中使用match_phrase_prefix
限制嵌套聚合查询的结果
我可以使用 match_phrase_prefix
限制非嵌套聚合的结果。我希望能够将相同的逻辑应用于嵌套字段,如下所示。索引映射正确地将嵌套字段类型列为嵌套,并且我能够在没有任何过滤器的情况下成功聚合字段(使用 match_all
)。
成功 非嵌套字段聚合 match_phrase_prefix
查询:
GET index/_search
{
"query":{
"match_phrase_prefix": {
"field1": "Nurse"
}
},
"size":0,
"aggs":{
"field1":{
"terms":{
"field":"field1",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
成功嵌套字段聚合(无match_phrase_prefix
):
GET index/_search
{
"query":{
"match_all": {}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
}
}
不成功 嵌套字段聚合 match_phrase_prefix
:
GET index/_search
{
"query":{
"match_phrase_prefix": {
"field2.nestedField": "en"
}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count": "desc"
}
}
}
}
}
}
}
第三个查询的预期输出是键与前缀过滤器匹配的桶列表。相反,我看到一个空的结果列表。有没有一种方法可以构造 match_phrase_prefix
来处理嵌套字段?或者在术语级别应用过滤器的方法?
使用嵌套顶级查询解决了这个问题。
请参阅此问题以了解工作解决方案(使用 terms
而不是 prefix
过滤器):
示例:
GET index/_search
{
"query":{
"nested":{
"path":"field2",
"query":{
"match_phrase_prefix":{
"field2.nestedField":"en"
}
}
}
},
"size":0,
"aggs":{
"field2":{
"nested":{
"path":"field2"
},
"aggs":{
"innerFilter":{
"filter":{
"prefix":{
"field2.nestedField":"en"
}
},
"aggs":{
"field2.nestedField":{
"terms":{
"field":"field2.nestedField",
"size":100,
"order":{
"_count":"desc"
}
}
}
}
}
}
}
}
}
您需要为此使用嵌套查询(文档 here)
这个查询
"query":{ "match_phrase_prefix": { "field2.nestedField": "en" } }
return 没有,因为您的索引文档不包含 nestedField
字段。该字段属于嵌套文档。
正确的查询是:
GET index/_search
{
"query": {
"nested": {
"path": "field2",
"query": {
"match_phrase_prefix": {
"field2.nestedField": "en"
}
}
}
},
"size": 0,
"aggs": {
"field2": {
"nested": {
"path": "field2"
},
"aggs": {
"field2.nestedField": {
"terms": {
"field": "field2.nestedField",
"size": 100,
"order": {
"_count": "desc"
}
}
}
}
}
}
}