【问题标题】:Creating Dynamic Facets in Elasticsearch在 Elasticsearch 中创建动态构面
【发布时间】: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


【解决方案1】:

下面试试

POST _search
{
   "query": {
      "query_string": {
         "query": "Apple"
      }
   },
   "facets": {
      "tags": {
         "terms": {
            "fields": ["name","brand","type","attributes.Color"]
         }
      }
   }
}

【讨论】:

  • 问题是,我事先不知道匹配查询的文章有哪些属性。
  • 它将检查文章的每个属性
  • 怎么样?在您的查询中,您只指定了颜色属性(“attributes.Color”)。
猜你喜欢
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多