1

我最近一直在为一些事情苦苦挣扎。我在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.

所以总的来说 - (除了命中本身)像这样的东西(加上额外的数据,比如type或其他):

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

等等。不幸的是,更改数据库架构不是一种选择

编辑:附加信息。

我可以让聚合用于不在数组内部的字段,如下所示:

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

我不知道如何处理 Array 内的数据(至少在 mongoDB 中,我猜它在 ES 中已经变平了)。

4

0 回答 0