首页 文章

Elasticsearch嵌套过滤器查询

提问于
浏览
1

这是我正在尝试创建查询的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,类和嵌套参数上搜索的筛选查询?例如 . 在伪代码中,我会在sku和类上有"bool" "must",然后在构成文档的每个参数上都有"nested" "filter" "bool" "must" . 在https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html我可以看到如何使用嵌套在文档上,其中每个嵌套字段是唯一的字段名称,但在我的文档中,每个数组元素都有"name"和"value" .

看起来这应该很简单 .

1 回答

  • 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 过滤器子句(我只包括两个,但您可以包含任意数量);如果我们在单个 nested 子句中使用 bool ,在内部 bool 内部有一堆过滤器,ES会尝试找到一个匹配所有提供的过滤器的嵌套文档 . 这样我们告诉ES, nested 过滤器不必全部应用于同一嵌套文档 .

    这是我用来测试它的代码:

    http://sense.qbox.io/gist/26552d6a8a285c7715b0ac4feab08bd283971664

相关问题