以下是我尝试创建查询的json文档的示例。 " params"字段映射为"嵌套"。
{
"images": [
{
"name": "1907183375555f7c44126f23.67610475.png"
},
{
"name": "5693836375575c567764bc2.87695507.png"
}
],
"sku": "MYSKU",
"class": "some_class",
"params": [
{
"name": "item1",
"value": "item1value"
},
{
"name": "item2",
"value": "item2value"
},
{
"name": "item3",
"value": "item3value"
},
{
"name": "item4",
"value": "item4value"
},
{
"name": "item5",
"value": "item5value"
}
]
}
如何创建将在sku,类和嵌套参数上搜索的筛选查询?例如。在伪代码中,我会有一个" bool" "必须"在sku和class上,然后是一个"嵌套" "过滤器" "布尔" "必须"在构成文档的每个参数上。在https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html我可以看到如何使用嵌套在文档上,其中每个嵌套字段都是唯一的字段名称,但在我的文档中,每个数组元素都有" name"和"价值"。
似乎这应该很简单。
答案 0 :(得分:3)
应该这样做(例如):
POST /test_index/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"term": {
"class": "some_class"
}
},
{
"term": {
"sku": "MYSKU1"
}
},
{
"nested": {
"path": "params",
"filter": {
"term": {
"params.name": "item1"
}
}
}
},
{
"nested": {
"path": "params",
"filter": {
"term": {
"params.name": "item3"
}
}
}
}
]
}
}
}
}
}
请注意,您要匹配的每个嵌套文档都有单独的nested
过滤器子句(我只包含两个,但您可以包含任意数量的内容);如果我们在单个bool
子句中使用了nested
,并且在内部bool
内有一堆过滤器,ES会尝试找到与所有提供的过滤器匹配的单个嵌套文档。这样我们告诉ES,nested
过滤器不必全部应用于同一嵌套文档。
以下是我用来测试它的代码:
http://sense.qbox.io/gist/26552d6a8a285c7715b0ac4feab08bd283971664