我有数据建模,其中具有不同属性的多个文档在逻辑上连接在一个chainID上,因为文档被索引为它们之间未定义的时间量,即在后端执行之后。所有文档都在同一索引上建立索引。示例文件:
Doc 1:
{
"att1": "a",
"att2": "b",
"chainID": "123"
}
Doc 2:
{
"att3": "c",
"att4": "d",
"chainID": "123"
}
Doc 3:
{
"att1": "x",
"att2": "y",
"chainID": "678"
}
Doc 4:
{
"att3": "z",
"att4": "u",
"chainID": "678"
}
映射:
{
"properties": {
"att1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"att2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"att3": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"att4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"chainID": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
我想按chainID对文档进行分组,并通过聚合的结果进行搜索,以便具有att1=a AND att3=c
的查询将以chainID=123
作为结果。
我尝试了以下查询,结果没有匹配的文档
{
"query": {
"bool": {
"must": [
{
"term": {
"att1.keyword": "a"
}
},
{
"term": {
"att3.keyword": "c"
}
}
]
}
},
"aggs": {
"chainIDs": {
"terms": {
"field": "chainID.keyword"
},
"aggs": {
"docs": {
"top_hits": {
"_source": [
"chainID"
]
}
}
}
}
}
}
似乎聚合发生在处理查询之后。我想做的是根据文档的chainID聚合文档,并对聚合的文档运行查询。这是可能与elasticsearch或我需要调整我的映射/数据模型吗?
尝试替换"与应该(逻辑或)。"Must"要求同一文档具有att1=1和att3=c(逻辑与)。
{
"query": {
"bool": {
"should": [
{
"term": {
"att1.keyword": "a"
}
},
{
"term": {
"att3.keyword": "c"
}
}
]
}
},
"aggs": {
"chainIDs": {
"terms": {
"field": "chainID.keyword"
},
"aggs": {
"docs": {
"top_hits": {
"_source": [
"chainID"
]
}
}
}
}
}
}