NestedFilter的用法和映射中的更改

时间:2015-03-30 06:59:17

标签: elasticsearch pyes

我正在尝试根据我编入索引的某些产品属性创建过滤器。早些时候,他们的索引如下 - :

"attributes": {
    "name1": "value1",
    "name2": "value2",
    ....
}

我之前使用的过滤器是根据URL查询参数生成的,如下所示:

"/search?q=product&color=black&color=blue&size=xl"

会导致 -

>>> and_filter = ANDFilter(
        [
            ORFilter(
                [
                    TermFilter('color', 'blue'),
                    TermFilter('color', 'black')
                ]
            ),
            ORFilter(
                [
                    TermFilter('size', 'xl')
                ]
            )
        ]
    )
>>> main_filter = BoolFilter().add_must(and_filter)

由于后端发生了一些变化,映射必须更改为嵌套映射。

新映射 - :

"attributes":
{
    "type": "nested",
    "properties": {
        "name": {"type": "string"},
        "display_name": {"type": "string"},
        "type": {"type": "string"},
        "value": {"type": "string"}
    }
}

我想到了新的过滤器 - :

>>> and_filter = ANDFilter(
        [
            ORFilter(
                [
                    ANDFilter(
                        [
                            TermFilter("attributes.name", "color"),
                            TermFilter("attributes.value", "blue"),
                        ]
                    ),
                    ANDFilter(
                        [
                            TermFilter("attributes.name", "color"),
                            TermFilter("attributes.value", "black"),
                        ]
                    )
                ]
            ),
            ORFilter(
                [
                    ANDFilter(
                        [
                            TermFilter("attributes.name", "size"),
                            TermFilter("attributes.value", "xl"),
                        ]
                    )
                ]
            )
        ]
    )
>>> nested_filter = NestedFilter("attributes", BoolFilter().add_must(and_filter))

但是,这似乎不是正确的方法。当我尝试使用应用此过滤器的产品生成方面时,所有计数每次都为零。

此外,尝试搜索产品时,在应用过滤器时不会产生预期的结果。

我很欣赏有关如何正确设计过滤器的一些指示。

修改

旧过滤器 - :

{
  "bool": {
    "must": [
      {
        "and": [
          {
            "or": [
              {
                "term": {
                  "color": "blue"
                }
              },
              {
                "term": {
                  "color": "black"
                }
              }
            ]
          },
          {
            "or": [
              {
                "term": {
                  "size": "xl"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

新过滤器 - :

{
  "nested": {
    "filter": {
      "bool": {
        "must": [
          {
            "and": [
              {
                "or": [
                  {
                    "and": [
                      {
                        "term": {
                          "attributes.name": "color"
                        }
                      },
                      {
                        "term": {
                          "attributes.value": "blue"
                        }
                      }
                    ]
                  },
                  {
                    "and": [
                      {
                        "term": {
                          "attributes.name": "color"
                        }
                      },
                      {
                        "term": {
                          "attributes.value": "black"
                        }
                      }
                    ]
                  }
                ]
              },
              {
                "or": [
                  {
                    "and": [
                      {
                        "term": {
                          "attributes.name": "size"
                        }
                      },
                      {
                        "term": {
                          "attributes.value": "xl"
                        }
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    },
    "path": "attributes"
  }
}

0 个答案:

没有答案