我最近一直在努力解决问题。我在我工作的项目中使用带有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"
}
}
}
我不知道如何对阵列内部的数据进行处理(至少在mongoDB中,我猜它在ES中会变得扁平化)。