【问题标题】:ElasticSearch: how to store product attributesElasticSearch:如何存储产品属性
【发布时间】:2014-10-08 07:42:22
【问题描述】:

在 ElasticSearch 中哪种存储产品属性的方式更正确?

嵌套对象:

"attributes": [
    {
        "name": "color",
        "value": "White"
    }, 
    {
        "name": "size",
        "value": "S"
    }
]

还是键值数组?

"attributes": [
    {"color": White"}
    {"size": "S"}
]

假设属性是可搜索的,并且它们也将用于分面搜索(聚合)。 每个产品可以有不同的属性,所以键(属性名)不固定。

【问题讨论】:

  • Key Value 几乎总是更适合在 ElasticSearch 中搜索!

标签: elasticsearch


【解决方案1】:

我发现第一种方式(嵌套)更好,因为它甚至可以对解决此类问题的属性名称进行聚合查询:

等等

【讨论】:

    【解决方案2】:

    如果你使用第二种方法

    "attributes": [
      {"color": White"}
      {"size": "S"}
    ]
    

    您可以直接在字段中搜索并基于这些值构建构面。

    【讨论】:

    • 每个产品的属性集都不一样不是问题吗?以及如何定义这种结构的映射?
    • 不,这没问题。您必须确保不分析您要构建构面的字段。如果字段差异很大,您可以为属性应用动态映射:elasticsearch.org/guide/en/elasticsearch/reference/current/…
    • 我用键值属性结构对文档进行了索引,但是搜索不起作用。因此,当我尝试按术语“attributes.color”:“Red”查找时,虽然应该是,但没有结果。
    • 当我枚举所有属性并为每个属性指定“index: not_analyzed”时 - 一切正常,但我如何为所有可能的属性映射指定这个?
    【解决方案3】:

    动态映射模板解决了这个问题:

    "dynamic_templates": [{
        "string_template": {
            "path_match": "attributes.*",
            "mapping": {
                "index": "not_analyzed"
             }
        }
    }]
    

    【讨论】:

    • 这是不正确的。通过使您的索引“未分析”,您无法查询您的产品属性。 elastic.co/blog/strings-are-dead-long-live-strings
    • @user3751385 为什么我不能查询属性?看起来你只是不明白“not_analyzed”是什么意思。在 99% 的情况下,属性应该作为关键字而不是文本进行搜索,这就是使用“not_analyzed”的原因。请记住,最初的问题与 ES 1 有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多