Elasticsearch 过滤同一子文档中的两个字段
Elastic Search Fliter on two fields within same sub document
我正在尝试编写一个弹性搜索查询,其中我有一组结构完全相同的子文档,我必须检查同一子文档中的两个条件。
我的数据是这样的:
{
"_id": "5672ba7c0d71c93d159c408e",
"productId": "1723913526",
"title": "Digitab Tablet",
"instock": true,
"specifications": [{
"category": "In the box",
"name": "Test1",
"value": "No"
}, {
"category": "Warranty",
"name": "Test2",
"value": "Yes"
}, {
"category": "General",
"name": "Test3",
"value": "Abcd"
}],
}
}
我正在尝试的是:我应该获得 specifications.name 为 "Test1" 且同一子文档的 specifications.value 为 "Yes"
的产品
这是我为此编写的查询:
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"specifications.name": "Test1*"
}
},
{
"term": {
"instock": "true"
}
},
{
"term": {
"specifications.value": "yes"
}
}
],
"must_not": [],
"should": []
}
}
}
问题是 - 它不应该 return id 为 1723913526 的产品,因为 "value":"Yes" 对于 "name": "Test2" 而不是 "name": "Test1".
我希望问题很清楚,如果需要更多信息,请发表评论。
提前致谢。
您需要修改映射以指示 specifications
是 nested
类型。
映射如下:
"mappings": {
"product": {
"properties": {
...
"specifications": {
"type": "nested"
}
}
}
}
然后像这样查询:
"bool": {
"must": [{
"nested": {
"path": "specifications",
"query": {
"bool": {
"must": [
{ "wildcard": { "specifications.first": "Test1*" }},
{ "term": { "specifications.value": "yes" }}
]
}
}
},
{
"term": { "instock": "true" }
}
}]
}
我正在尝试编写一个弹性搜索查询,其中我有一组结构完全相同的子文档,我必须检查同一子文档中的两个条件。
我的数据是这样的:
{
"_id": "5672ba7c0d71c93d159c408e",
"productId": "1723913526",
"title": "Digitab Tablet",
"instock": true,
"specifications": [{
"category": "In the box",
"name": "Test1",
"value": "No"
}, {
"category": "Warranty",
"name": "Test2",
"value": "Yes"
}, {
"category": "General",
"name": "Test3",
"value": "Abcd"
}],
}
}
我正在尝试的是:我应该获得 specifications.name 为 "Test1" 且同一子文档的 specifications.value 为 "Yes"
的产品这是我为此编写的查询:
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"specifications.name": "Test1*"
}
},
{
"term": {
"instock": "true"
}
},
{
"term": {
"specifications.value": "yes"
}
}
],
"must_not": [],
"should": []
}
}
}
问题是 - 它不应该 return id 为 1723913526 的产品,因为 "value":"Yes" 对于 "name": "Test2" 而不是 "name": "Test1".
我希望问题很清楚,如果需要更多信息,请发表评论。
提前致谢。
您需要修改映射以指示 specifications
是 nested
类型。
映射如下:
"mappings": {
"product": {
"properties": {
...
"specifications": {
"type": "nested"
}
}
}
}
然后像这样查询:
"bool": {
"must": [{
"nested": {
"path": "specifications",
"query": {
"bool": {
"must": [
{ "wildcard": { "specifications.first": "Test1*" }},
{ "term": { "specifications.value": "yes" }}
]
}
}
},
{
"term": { "instock": "true" }
}
}]
}