Php 如何使用多实体绑定设置ElasticSearch索引结构
Php 如何使用多实体绑定设置ElasticSearch索引结构,php,mysql,
elasticsearch,data-structures,logstash,Php,Mysql,
elasticsearch,Data Structures,Logstash,最近,我开始将ElasticSearch(ES)实现到使用MySQL用PHP编写的传统电子商务应用程序中。我对所有这些东西都是全新的,阅读文档也不错,但我真的需要有经验的人给我建议 从ES文档中,我能够设置一个新的集群,并且我还发现rivers已经被弃用,应该被替换,所以我用Logstash和JDBCMySQL连接器替换了它们 在这一点上,我有: 弹性搜索 伐木场 JDBCMySQL驱动程序 MySQL服务器 应用程序的数据库结构并不是真正最优的,很难替换,但我希望以最好的方式将其复制到ES
最近,我开始将ElasticSearch(ES)实现到使用MySQL用PHP编写的传统电子商务应用程序中。我对所有这些东西都是全新的,阅读文档也不错,但我真的需要有经验的人给我建议 从ES文档中,我能够设置一个新的集群,并且我还发现rivers已经被弃用,应该被替换,所以我用Logstash和JDBCMySQL连接器替换了它们 在这一点上,我有:
- 弹性搜索
- 伐木场
- JDBCMySQL驱动程序
- MySQL服务器
+-------------------------------+-------+--------+
| Id | Title | Price |
+-------------------------------+-------+--------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 |
| 018357657529fef056cf396626812 | Beta | 355,00 |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 |
+-------------------------------+-------+--------+
+------------+-------------+
| Id | Title |
+------------+-------------+
| sellout | Sellout |
| discount | Discount |
| topproduct | Top Product |
+------------+-------------+
标志
+-------------------------------+-------+--------+
| Id | Title | Price |
+-------------------------------+-------+--------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 |
| 018357657529fef056cf396626812 | Beta | 355,00 |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 |
+-------------------------------+-------+--------+
+------------+-------------+
| Id | Title |
+------------+-------------+
| sellout | Sellout |
| discount | Discount |
| topproduct | Top Product |
+------------+-------------+
标志产品(n:m轴)
那些字符串ID是一场彻底的灾难(但我现在必须处理它们)。起初我认为我应该为ES建立一个产品索引的平面结构,但是多实体绑定呢?这是一个很好的开始
我肯定会把这一切都弄平(也就是说),然后拿出如下所示的产品文档。这样,只需为每个产品创建一个flags
数组,就可以摆脱产品和标志之间的N:M关系。因此,查询这些标志将更容易
{
"id": "00c8234d71c4e94f725cd432ebc04",
"title": "Alpha",
"price": 589.0,
"flags": ["Sellout", "Top Product"]
}
{
"id": "018357657529fef056cf396626812",
"title": "Beta",
"price": 355.0,
"flags": ["Discount"]
}
{
"id": "01a2c32ceeff0fc6b7dd4fc4302ab",
"title": "Gamma",
"price": 0.0,
"flags": ["Discount"]
}
产品映射类型如下所示:
PUT products
{
"mappings": {
"product": {
"properties": {
"id": {
"type": "string",
"index": "not_analyzed"
},
"title": {
"type": "string"
},
"price": {
"type": "double",
"null_value": 0.0
},
"flags": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
因为您已经有了logstashjdbc
输入,所以您所缺少的只是用于获取产品和相关标志的正确SQL查询
SELECT p.Id as id, p.Title as title, p.Price as price, GROUP_CONCAT(f.Title) as flags
FROM Products p
JOIN flagsProducts fp ON fp.ProductId = p.Id
JOIN Flags f ON fp.FlagId = f.id
GROUP BY p.Id
这将使您获得如下行:
+-------------------------------+-------+-------+---------------------+
| id | title | price | flags |
+-------------------------------+-------+-------+---------------------+
| 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product |
| 018357657529fef056cf396626812 | Beta | 355 | Discount |
| 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0 | Discount |
+-------------------------------+-------+-------+---------------------+
使用Logstash过滤器,您可以将
标志
拆分为一个数组,这样就可以了。如果您想将mysql数据移动到ES:平面数据结构似乎是目前为止最好的方法。您对此索引有任何特殊的查询要求吗?考虑ES中的数据结构意味着考虑您想要使用的查询。@falnyr,您在过去7天内没有就您的问题插话。你们还需要更多的信息吗?对不起,伙计们,我正在处理一些其他的东西atm,我会尽快设置它,这样我就可以看到什么不清楚了。这是否意味着“标志”映射应该是数组而不是字符串,因为我应用了logstash筛选器?字符串很好,ES将代表你们创建一个字符串数组。