好的,今天我在使用双嵌套不相关字段specs.value.text
和specs.spec.text
过滤弹性搜索查询时遇到问题。
这些字段的映射:
...
"specs": {
"type": "nested",
"properties": {
"spec": {
"type": "nested",
"properties": {
"text": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
},
"value": {
"type": "nested",
"properties": {
"text": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
....
问题是我想用这个请求过滤查询:
{
"query": {
"filtered": {
"filter": {
"and": {
"filters": [
{
"nested": {
"filter": {
"nested": {
"filter": {
"match": {
"specs.value.text": "10"
}
},
"path": "specs.value"
}
},
"path": "specs"
}
},
{
"nested": {
"filter": {
"nested": {
"filter": {
"match": {
"specs.spec.text": "Délai de livraison"
}
},
"path": "specs.spec"
}
},
"path": "specs"
}
}
]
}
},
"query": {
"match_all": {}
}
}
},
"_source": [
"specs"
]
}
Elasticsearch将在Délai de livraison
specs.spec.text
或 10
中返回包含单词specs.value.text
的文档
结果的例子: 第一个对象:
...
"specs": [
{
"value": [
{
"text": "10",
"lang": "fr-FR"
}
],
"spec": [
{
"text": "Délai de livraison",
"lang": "fr-FR"
}
]
},
{
"value": [
{
"text": "10",
"lang": "fr-FR"
}
],
"spec": [
{
"text": "Volume",
"lang": "fr-FR"
}
]
}
]
...
第二个对象:
...
"specs": [
{
"value": [
{
"text": "7"
}
]
"spec": [
{
"text": "Délai de livraison"
}
]
}
]
...
答案 0 :(得分:0)
正确的查询应该是以下
{
"query": {
"bool": {
"must": [{
"nested": {
"path": "specs",
"query": {
"bool": {
"must": [{
"nested": {
"path": "specs.value",
"query": {
"bool": {
"must": [{
"match": {
"specs.value.text": "10"
}
}]
}
}
}
}, {
"nested": {
"path": "specs.spec",
"query": {
"bool": {
"must": [{
"match": {
"specs.spec.text": "Délai de livraison"
}
}]
}
}
}
}]
}
}
}
}]
}
}
}
由于您在规范级别运行了两个嵌套查询,因此两个文档都匹配,因为两个文档都匹配每个过滤器,但是在规范下的不同嵌套文档中。要限制同一嵌套文档的条件和条件,请在一个嵌套查询
下触发过滤器希望这会有所帮助 阿贾伊