我最近一直在为一些事情苦苦挣扎。我在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'
}
],
...
]
}
}
我的查询目前可以很好地搜索数据(使用此处不相关的其他字段)。我目前正在尝试做的是:
- 获取所有可用
filterIds
的(在本例中123
和124
)以及所有可能的valueIds
.
所以总的来说 - (除了命中本身)像这样的东西(加上额外的数据,比如type
或其他):
{
filters: [
{
filterId: 123,
valueIds: [321, 456]
},
{
filterId: 124,
valueIds: [456, 457]
}
]
}
等等。不幸的是,更改数据库架构不是一种选择。
编辑:附加信息。
我可以让聚合用于不在数组内部的字段,如下所示:
"aggregations": {
"filters": {
"terms": {
"field": "data.name"
}
}
}
我不知道如何处理 Array 内的数据(至少在 mongoDB 中,我猜它在 ES 中已经变平了)。