【发布时间】:2013-05-02 14:49:28
【问题描述】:
我想为具有动态属性的嵌套类型动态创建构面。
假设这些文章在我的索引中并且我正在搜索名称和品牌:
{
name: iPhone 16GB
brand: Apple
type: Smartphone
attributes: {
Color: White
}
}
{
name: iPad
brand: Apple
type: Tablet
attributes: {
Color: Black
}
}
{
name: Cruzer USB 16GB
brand: SanDisk
type: USB-Stick
attributes: {
Color: Black
Capacity: 16GB
USB-Standard: USB 2.0
}
}
{
name: Cruzer USB 16GB
brand: SanDisk
type: USB-Stick
attributes: {
Color: Red
Capacity: 16GB
USB-Standard: USB 3.0
}
}
现在,如果我要搜索“Apple”,我希望得到一个包含以下方面的搜索结果:
Brand:
Apple 2
Type:
Smartphone 1
Tablet 1
Color:
Black 1
White 1
搜索“16GB”应包括这些方面:
Brand:
Apple 1
SanDisk 2
Type:
Smartphone 1
USB-Stick 2
Color:
Black 1
White 1
Red 1
Capacity:
16GB 2
USB-Standard:
USB 3.0 1
USB 2.0 2
同样,每篇文章都可以有任意属性。
品牌和类型的分面搜索很容易,但我怎么能做到这一点呢?这甚至可以通过 elasticsearch 实现吗?
希望你能明白我的意思……
【问题讨论】:
-
一个想法是在进行搜索之前获取映射并为每个属性添加一个方面。但我不认为这是一个好的和有效的解决方案......
-
另一种解决方案是先进行非分面搜索。获得搜索结果后,立即进行另一次搜索(通过结果集的 id)。在此搜索中,您可以通过查看结果的属性来创建构面。但这将包括另一个网络路由......我仍然希望有人有一个真正的解决方案。
-
为什么扁平化所有属性不是一个有效的解决方案?
-
我可以这样做,但是如何将它们动态添加为构面的问题仍然存在。可以肯定的是,扁平化是指例如{名称:iPhone 16GB,品牌:Apple,类型:智能手机,颜色:黑色},是吗?
-
是的,我就是这个意思。如果我理解正确,在 ES afaik 中(在 Solr 中也不),自动为
attributes中的所有属性名创建构面(通过迭代它们)是不可能的。一开始它可能看起来很有用,但我怀疑你最终不会在客户端拥有一个属性名列表(例如:对首先显示的方面进行排序,其他展示内容等)在这种情况下,相同的列表可用于迭代属性。只是我的 2c。
标签: elasticsearch