问题描述
我有两个关系 MysqL 表,我需要将这些数据存储到 elasticsearch。 我是这样存储的,我想问你是否有最好的方法:
POST categories/_doc
{
"id" : 1,"name" : "Phones"
}
POST categories/_doc
{
"id" : 2,"name" : "TV"
}
PUT products
{
"mappings": {
"properties": {
"attributes": {
"type": "nested"
}
}
}
}
POST products/_doc
{
"id" : 3
"category_id" : 1
"name" : "IPhone 5S","attributes" : [
{
"color" : "red","stock" : 4
},{
"color" : "blue","stock" : 2
}
]
}
POST products/_doc
{
"id" : 5
"category_id" : 2
"name" : "Samsung TV","stock" : 2
},{
"color" : "yellow","stock" : 4
}
]
}
我首先搜索类别索引,然后将类别 id 值发送到产品索引
GET products/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "attributes","query": {
"terms": {
"attributes.color": [
"red","blue"
]
}
},"inner_hits": {}
}
},{
"term": {
"category_id": 2
}
}
]
}
}
}
提前致谢
解决方法
这样做不是一个好习惯,因为您将很难对应用程序进行排序和分页。在 Elasticsearch 中,出于性能原因将数据扁平化并将其存储在一个索引中非常重要,如果您真的将内容分开,则可以将它们放在多个索引中。还要记住以下几点:
- Elasticsearch 不是关系型数据库。您将无法像过去加入表一样加入索引
- 非规范化不是自然的,但它是 Elasticsearch 应用程序效率的关键。
- 一开始就考虑数据映射将使您的 飞行多年的应用。