使用 Mysql 的 ElasticSearch 数据建模

ElasticSearch data modeling with Mysql

我正在研究弹性搜索并尝试使用 mysql table 进行建模。 例如,我在下面有 Mysql tables。

图书Table

ex) 书 table


编号 |标题 |摘要 | publisher_id

3 |书名 A |一本关于弹性搜索的书。 | 12


作者Table

ex) 作者 table


编号 |姓名 |国家 | book_id

1 |亚历克斯 |韩国 | 3

2 |约翰 |美国 | 3


作者可以不止一个人

出版商Table

ex) 出版商 table


编号 |名字

12 | Packt 发布


在我看来,我可以像下面这样转换为弹性搜索索引。

图书索引

作者索引

出版商索引

我需要做的是,搜索书名和摘要并获取作者 ID。 然后显示作者列表。 对于mysql,我会这样做。

Select * from authors where id in (select authors_id from book where match(title,abstract) against('${keyword}' IN BOOLEAN MODE))

我如何为弹性搜索执行此操作? 有没有更好的建模方法? 我也想知道如何查询 首先从图书索引中搜索作者 ID,然后再次从作者中搜索这些 ID?? 或任何其他解决方案???

正如其他 ES 专家指出的那样,使用 Elasticsearch(ES) 中的单个索引很容易实现,我可能无法给出正确的 ES 查询,但我的以下示例让您了解如何为您的模型建模数据并查询。

索引映射

{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "abstract":{
        "type" : "text"
      },
      "author" :{
        "type" : "text",
        "fielddata" : true // instead of this, you can use `keyword` field for better perf, this is just for ex
      }
    }
  }
}

索引示例文档

{
  "title" : "hello world",
  "abstract" : "hello world is common in computer programming",
  "author" : ["sehun, Whosebug"]
}

{
  "title" : "foo bar",
  "abstract" : "foo bar is common in computer programming",
  "author" : ["opster, Whosebug"]
}

搜索查询以在 titleabstract 上搜索并在作者字段上聚合

{
  "query": {
    "multi_match": {
      "query": "common",
      "fields": [
        "title",
        "abstract"
      ]
    }
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "author"
      }
    }
  }
}

搜索结果

hits": [
      {
        "_index": "internaledgepre",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.18232156,
        "_source": {
          "title": "foo bar",
          "abstract": "foo bar is common in computer programming",
          "author": [
            "opster, Whosebug"
          ]
        }
      },
      {
        "_index": "internaledgepre",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.18232156,
        "_source": {
          "title": "hello world",
          "abstract": "hello world is common in computer programming",
          "author": [
            "sehun, Whosebug"
          ]
        }
      }
    ]
  },
  "aggregations": {
    "Cities": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Whosebug",
          "doc_count": 2
        },
        {
          "key": "opster",
          "doc_count": 1
        },
        {
          "key": "sehun",
          "doc_count": 1
        }
      ]
    }
  }

否SQL 不支持 SQL 支持的连接。因此,所有数据都应在一个文档中编制索引。

一定要了解 nosql 数据建模、体系结构、意义,并了解它与 SQL 的不同之处。