Elasticsearch:过滤已过滤嵌套字段

时间:2016-12-21 10:43:57

标签: elasticsearch groovy nested

我试图用弹性搜索做些什么,而且无法在任何地方找到答案。

获得嵌套对象产品:

 "products": {
    "include_in_root": true,
    "type": "nested",
    "properties": {
      "date": {
        "format": "strict_date_optional_time||epoch_millis",
        "type": "date"
      },
      "type": {
        "index": "not_analyzed",
        "type": "string"
      },
      "cat4": {
        "index": "not_analyzed",
        "type": "string"
      },
      "geo": {
        "type": "geo_point"
      },
      "baseprice": {
        "type": "long"
      },
      "cat2": {
        "index": "not_analyzed",
        "type": "string"
      },
      "cat3": {
        "index": "not_analyzed",
        "type": "string"
      },
      "feeltemp": {
        "type": "long"
      },
      "cat1": {
        "index": "not_analyzed",
        "type": "string"
      },
      "price": {
        "type": "double"
      },
      "qty": {
        "index": "not_analyzed",
        "type": "string"
      },
      "name": {
        "index": "not_analyzed",
        "type": "string"
      },
      "weather": {
        "index": "not_analyzed",
        "type": "string"
      },
      "id": {
        "index": "not_analyzed",
        "type": "string"
      },
      "stock": {
        "type": "long"
      },
      "brand": {
        "index": "not_analyzed",
        "type": "string"
      }
    }
  }

我想只在type =' cartadd'和cat1 ="测试"例如。

问题,如果是带嵌套过滤器的查询:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "products",
            "filter": {
              "bool": {
                "must": [
                  {
                    "script": {
                      "script": "sum=0;for(obj in _source.products) {sum = sum + 1 }; sum>=1;"
                    }
                  },
                  {
                    "term": {
                      "products.type": "view"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

没有任何意义。

如果我删除了嵌套操作:

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "script": {
                "script": "sum=0;for(obj in _source.products) {if(obj.type=='cartadd') {sum = sum + obj.price }}; sum>=2;"
              }
            }
          ]
        }
      }
    }
  }
}

它可以工作并计算对象。但我不能再过滤嵌套对象了。

你有没有看到,我在groovy脚本中添加了一个if条件,但我可以动态添加更多条件。

有人知道我该怎么做吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您需要将script过滤器移到nested查询之外,因为它在products上运行,{ "query": { "bool": { "filter": [ { "script": { "script": "sum=0;for(obj in _source.products) {sum = sum + 1 }; sum>=1;" } }, { "nested": { "path": "products", "filter": { "term": { "products.type": "view" } } } } ] } } } 是父文档的字段(而不是嵌套的字段):

nbProducts

此外,一个好主意是在父文档中添加一个名为{ "query": { "bool": { "filter": [ { "range": { "nbProducts": { "gte": 1 } } }, { "nested": { "path": "products", "filter": { "term": { "products.type": "view" } } } } ] } } } 的新字段,该字段将包含产品对象的数量。这将允许您摆脱该脚本并执行这样的简单查询:

Restaurant