我对弹性搜索比较陌生,我想将我的一个字段映射到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
,以便根据此特定用户谈论此产品的次数来提高结果的分数
我希望能够映射这种结构。
你知道如何实现这个目标吗?
谢谢,
答案 0 :(得分:8)
您需要更改对象定义。
根据实际上值的键是有问题的,因为它会导致不断增长的映射,从而导致集群状态。它还会导致奇怪的搜索。
这是一个很常见的问题/问题,我在Troubleshooting Elasticsearch searches, for Beginners的文章中专门介绍了一个部分。
您可能想要做的是使用嵌套文档或父子关系。如果您经常更新计数,则需要使用父子,因为嵌套文档将导致重新编制整个索引。然而,嵌套文档的搜索时间会更快,而且您很可能想要以某种方式限制更新。
如果您构建这样的文档,您可以轻松使用嵌套映射,并且每个用户最终不会有一个字段。
name: Nexus 10
category: Tablets
interests:
- user_id: 1
mentions: 30
- user_id: 3
mentions: 70