我是Elasticsearch的新手,我想知道我所拥有的用例是否有任何好的实践。
我有异构数据从API发送,我保存到数据库(作为JSON),然后保存在Elasticsearch搜索目的。以这种格式发送的数据(因为它是异构的,用户可以发送任何类型的数据,一些元数据可以是多值的,其他的单值和JSON中的键名可能会有所不同:)
{
"indices":{
"MultipleIndices":[
{
"index":"editors",
"values":[
"The Editing House",
"Volcan Editing"
]
},
{
"index":"colors",
"values":[
"Red",
"Blue"
]
}
],
"SimpleIndices":[
{
"index":"AuthorName",
"value": "George R. R. Martin"
},
{
"index":"NumberOfPages",
"value":"2898"
},
{
"index":"BookType",
"value":"Fantasy"
}
]
}
}
一旦我们收到这个JSON,它在代码中格式化,并以JSON的形式存储在数据库中,格式如下:
{
"indices":{
"editors":[
"The Editing House",
"Volcan Editing"
],
"colors":[
"Red",
"Blue"
],
"AuthorName" : "George R. R. Martin"
"NumberOfPages" : "2898",
"BookType" : "Fantasy"
}
}
我想保存这个数据到Elasticsearch,我可以映射它的最好方法是什么?将其作为JSON存储在一个字段中?如果我这样做,搜索会有效率吗?
您必须单独映射每个字段。你可以看看理解哪种类型字段类型是适合您的方案。另一个建议是学习文本分析,因为它负责构建文本以优化搜索的过程。
我的建议地图:
PUT indices
{
"mappings": {
"properties": {
"editors": {
"type": "keyword"
},
"colors":{
"type": "keyword"
},
"author_name":{
"type": "text"
},
"number_pages":{
"type": "integer"
},
"book_type":{
"type": "keyword"
}
}
}
}
我认为在您的情况下,除了动态映射之外,您没有太多选择,当第一个文档在特定索引中索引时,Elasticsearch将为您生成动态映射。
然而,你可以通过使用动态模板来改进这个过程,这样你就可以优化你的映射,在我提供的官方链接中有很好的例子。