使用 Mysql 的 ElasticSearch 数据建模
ElasticSearch data modeling with Mysql
我正在研究弹性搜索并尝试使用 mysql table 进行建模。
例如,我在下面有 Mysql tables。
图书Table
- id
- 标题
- 摘要
- publisher_id
ex) 书 table
编号 |标题 |摘要 | publisher_id
3 |书名 A |一本关于弹性搜索的书。 | 12
作者Table
- id
- 姓名
- 国家
- book_id(id 来自书table)
ex) 作者 table
编号 |姓名 |国家 | book_id
1 |亚历克斯 |韩国 | 3
2 |约翰 |美国 | 3
作者可以不止一个人
出版商Table
- id
- 姓名
ex) 出版商 table
编号 |名字
12 | Packt 发布
在我看来,我可以像下面这样转换为弹性搜索索引。
图书索引
- id int
- 标题字符串
- 摘要字符串
- 作者数组(来自作者索引的id。作者可以不止一个。)
- publisher int (id form publisher index)
作者索引
- id int
- 名称字符串
- 国家字符串
出版商索引
- id int
- 名称字符串
我需要做的是,搜索书名和摘要并获取作者 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"]
}
搜索查询以在 title
和 abstract
上搜索并在作者字段上聚合
{
"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 的不同之处。
我正在研究弹性搜索并尝试使用 mysql table 进行建模。 例如,我在下面有 Mysql tables。
图书Table
- id
- 标题
- 摘要
- publisher_id
ex) 书 table
编号 |标题 |摘要 | publisher_id
3 |书名 A |一本关于弹性搜索的书。 | 12
作者Table
- id
- 姓名
- 国家
- book_id(id 来自书table)
ex) 作者 table
编号 |姓名 |国家 | book_id
1 |亚历克斯 |韩国 | 3
2 |约翰 |美国 | 3
作者可以不止一个人
出版商Table
- id
- 姓名
ex) 出版商 table
编号 |名字
12 | Packt 发布
在我看来,我可以像下面这样转换为弹性搜索索引。
图书索引
- id int
- 标题字符串
- 摘要字符串
- 作者数组(来自作者索引的id。作者可以不止一个。)
- publisher int (id form publisher index)
作者索引
- id int
- 名称字符串
- 国家字符串
出版商索引
- id int
- 名称字符串
我需要做的是,搜索书名和摘要并获取作者 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"]
}
搜索查询以在 title
和 abstract
上搜索并在作者字段上聚合
{
"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 的不同之处。