在 elasticsearch 中使用两个单独的关系索引是否有意义?

问题描述

我有两个关系 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 中,出于性能原因将数据扁平化并将其存储在一个索引中非常重要,如果您真的将内容分开,则可以将它们放在多个索引中。还要记住以下几点:

  1. Elasticsearch 不是关系型数据库。您将无法像过去加入表一样加入索引
  2. 非规范化不是自然的,但它是 Elasticsearch 应用程序效率的关键。
  3. 一开始就考虑数据映射将使您的 飞行多年的应用。