在ElasticSearch

时间:2017-01-12 19:45:41

标签: elasticsearch

这是我在索引中的数据样本:

[{
  "filters": [
    {
      "group": "color",
      "attribute": "red"
    },
    {
      "group": "category",
      "attribute": "office"
    },
    {
      "group": "vendor",
      "attribute": "some vendor"
    },
    {
      "group": "sub category",
      "attribute": "tables"
    },
    {
      "group": "material",
      "attribute": "wood"
    }
  ],
  "image": "img",
  "itemId": "id"
},
{
  "filters": [
    {
      "group": "color",
      "attribute": "green"
    },
    {
      "group": "category",
      "attribute": "office"
    },
    {
      "group": "vendor",
      "attribute": "some vendor"
    },
    {
      "group": "sub category",
      "attribute": "tables"
    }
  ],
  "image": "img",
  "itemId": "id"
},
{
  "filters": [
    {
      "group": "color",
      "attribute": "brown"
    },
    {
      "group": "category",
      "attribute": "office"
    },
    {
      "group": "vendor",
      "attribute": "some vendor"
    },
    {
      "group": "sub category",
      "attribute": "chairs"
    },
    {
      "group": "style",
      "attribute": "modern"
    }
  ],
  "image": "img",
  "itemId": "id"
}]

我的查询示例:

{
  "size": 48,
  "sort": [
    {
      "sequence": {
        "order": "asc"
      }
    }
  ],
  "aggs": {
    "price": {
      "range": {
        "field": "salePrice",
        "ranges": [
          {
            "to": 50.0
          },
          {
            "from": 50.0,
            "to": 100.0
          },
          {
            "from": 100.0,
            "to": 250.0
          },
          {
            "from": 250.0,
            "to": 500.0
          },
          {
            "from": 500.0,
            "to": 750.0
          },
          {
            "from": 750.0,
            "to": 1000.0
          },
          {
            "from": 1000.0,
            "to": 1500.0
          },
          {
            "from": 1500.0,
            "to": 2000.0
          },
          {
            "from": 2000.0,
            "to": 2500.0
          },
          {
            "from": 2500.0,
            "to": 3000.0
          },
          {
            "from": 3000.0,
            "to": 3500.0
          },
          {
            "from": 3500.0
          }
        ]
      }
    },
    "filters": {
      "nested": {
        "path": "filters"
      },
      "aggs": {
        "groups": {
          "terms": {
            "field": "filters.group"
          },
          "aggs": {
            "attributes": {
              "terms": {
                "field": "filters.attribute"
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "searchPattern": {
              "query": "chairs",
              "operator": "and"
            }
          }
        }
      ],
      "filter": [
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "filters.group": {
                        "value": "sub category"
                      }
                    }
                  },
                  {
                    "term": {
                      "filters.attribute": {
                        "value": "tables"
                      }
                    }
                  }
                ]
              }
            },
            "path": "filters",
            "_name": "filters"
          }
        }
      ]
    }
  }
} 

正如你所看到的,这里我对嵌套的"过滤器"进行了双重聚合。数组,然后做过滤,我收到这样的数据:

category:
    office(3)
color:
    red(1)
    green(1)
    brown(1)
sub category:
    tables(2)
........

这是合乎逻辑的,因为我做了过滤,然后才进行聚合。但我希望获得其他子类别并显示count。因此,如果用户在一个组中选择多个属性,我想进行Or过滤。如果选择另一个组中的属性,请执行and过滤。像这样:

{
  "size": 48,
  "sort": [
    {
      "sequence": {
        "order": "asc"
      }
    }
  ],
  "aggs": {
    "price": {
      "range": {
        "field": "salePrice",
        "ranges": [
          {
            "to": 50.0
          },
          {
            "from": 50.0,
            "to": 100.0
          },
          {
            "from": 100.0,
            "to": 250.0
          },
          {
            "from": 250.0,
            "to": 500.0
          },
          {
            "from": 500.0,
            "to": 750.0
          },
          {
            "from": 750.0,
            "to": 1000.0
          },
          {
            "from": 1000.0,
            "to": 1500.0
          },
          {
            "from": 1500.0,
            "to": 2000.0
          },
          {
            "from": 2000.0,
            "to": 2500.0
          },
          {
            "from": 2500.0,
            "to": 3000.0
          },
          {
            "from": 3000.0,
            "to": 3500.0
          },
          {
            "from": 3500.0
          }
        ]
      }
    },
    "filters": {
      "nested": {
        "path": "filters"
      },
      "aggs": {
        "groups": {
          "terms": {
            "field": "filters.group"
          },
          "aggs": {
            "attributes": {
              "terms": {
                "field": "filters.attribute"
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "searchPattern": {
              "query": "chairs",
              "operator": "and"
            }
          }
        }
      ],
      "filter": [
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "filters.group": {
                        "value": "Category"
                      }
                    }
                  },
                  {
                    "bool": {
                      "should": [
                        {
                          "term": {
                            "filters.attribute": {
                              "value": "Decor"
                            }
                          }
                        },
                        {
                          "term": {
                            "filters.attribute": {
                              "value": "Patio Dining"
                            }
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            },
            "path": "filters",
            "_name": "filters"
          }
        },
        {
          "nested": {
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "filters.group": {
                        "value": "Type"
                      }
                    }
                  },
                  {
                    "term": {
                      "filters.attribute": {
                        "value": "Coverlets"
                      }
                    }
                  }
                ]
              }
            },
            "path": "filters",
            "_name": "filters"
          }
        }
      ]
    }
  }
}

但是,当然,这个查询也有同样的问题。那么,有可能在ElasticSearch中解决问题吗?我找到了关于post_filter的几句话,但没有想法如何使用它以及它如何帮助我,因为我每次都需要重新计算组属性。是否可能或我需要"存储" group attributes在任何地方,并在每次聚合后显示它们?

0 个答案:

没有答案