在Elasticsearch中映射关联数组

时间:2014-02-20 15:56:33

标签: elasticsearch

我对弹性搜索比较陌生,我想将我的一个字段映射到associative array结构。

我目前拥有的内容:

索引product中的products类型的一种产品:

{
    "name":"Nexus 10",
    "category":"Tablets",
    "interests": {
        "1":30,
        "3":70
    }
}

如您所见,字段interests是一个关联数组。关键是User ID,值为the number of times the user talked about this product

动态映射为我提供了:

{
   "products":{
      "mappings":{
         "product":{
            "properties":{
               "category":{
                  "type":"string"
               },
               "interests":{
                  "properties":{
                     "1":{
                        "type":"long"
                     },
                     "3":{
                        "type":"long"
                     },
                  }
               },
               "name":{
                  "type":"string"
               }
            }
         }
      }
   }
}

我想要的是什么:

由于我将在interests字段中包含大量条目,因此我不希望动态映射映射每个ID。

我们的想法是能够在user ID字段中查找特定的interests,以便根据此特定用户谈论此产品的次数来提高结果的分数

我希望能够映射这种结构。

你知道如何实现这个目标吗?

谢谢,

1 个答案:

答案 0 :(得分:8)

您需要更改对象定义。

根据实际上是有问题的,因为它会导致不断增长的映射,从而导致集群状态。它还会导致奇怪的搜索。

这是一个很常见的问题/问题,我在Troubleshooting Elasticsearch searches, for Beginners的文章中专门介绍了一个部分。

您可能想要做的是使用嵌套文档或父子关系。如果您经常更新计数,则需要使用父子,因为嵌套文档将导致重新编制整个索引。然而,嵌套文档的搜索时间会更快,而且您很可能想要以某种方式限制更新。

如果您构建这样的文档,您可以轻松使用嵌套映射,并且每个用户最终不会有一个字段。

name: Nexus 10
category: Tablets
interests: 
    - user_id: 1
      mentions: 30
    - user_id: 3
      mentions: 70