用于构面搜索的ElasticSearch聚合(mongoosastic)

时间:2017-02-08 10:23:44

标签: javascript elasticsearch mongoosastic

我最近一直在努力解决问题。我在我工作的项目中使用带有mongoosastic的Node.js和用于搜索引擎的ElasticSearch。

问题是我需要为搜索做一个构面过滤器(多个类别,属性等)。我有点工作,但表现很糟糕。我研究了这个主题,似乎ES聚合是我需要的。

基本上我需要从ES获取可用过滤器列表,以便前端可以正确渲染它们。

这是我正在使用的数据的一部分(数据存储在MongoDB中,并使用mongoosastic包同步到ES):

{
  ...,
  data: {
    filters: [
      [
        {
          filterId: 123,
          valueId: 321,
          type: 'radio'
        },
        {
          filterId: 124,
          valueId: 322,
          type: 'select'
        }
      ],
      [
        {
          filterId: 123,
          valueId: 456,
          type: 'radio'
        },
        {
          filterId: 124,
          valueId: 457,
          type: 'select'
        }
      ],
      ...
    ]
  }
}

我的查询目前可以很好地搜索数据(使用此处不相关的其他字段)。我目前要做的是:

  1. 全部可用filterIds(在此示例中为123124)以及所有可能的valueIds
  2. 所以一般来说 - (除了命中本身)这样的东西(加上type等其他数据):

    {
      filters: [
        {
          filterId: 123,
          valueIds: [321, 456] 
        },
        {
          filterId: 124,
          valueIds: [456, 457]
        }
      ]
    }
    

    等等。 遗憾的是,更改数据库架构不是一个选项

    编辑:其他信息。

    我可以让聚合适用于不在数组内的字段:

    "aggregations": {
      "filters": {
        "terms": {
          "field": "data.name"
        }
      }
    }
    

    我不知道如何对阵列内部的数据进行处理(至少在mongoDB中,我猜它在ES中会变得扁平化)。

0 个答案:

没有答案