如何使用多个实体绑定来设置ElasticSearch索引结构

最近我开始将ElasticSearch(ES)实现工作应用到使用MySQL编写的使用PHP编写的传统电子商务应用程序中。 我对所有这些东西都是全新的,阅读文档是好的,但我真的需要有经验的人来指导我。

从ES文档中我可以build立一个新的集群,我也发现河stream已经被废弃了,应该被replace,所以我用Logstash和JDBC MySQL连接器replace了它们。

在这一点上我有:

  • ElasticSearch
  • Logstash
  • JDBC MySQL驱动程序
  • MySQL服务器

应用程序的数据库结构并不是最优的,很难replace,但我想以最好的方式将其复制到ES索引中。

数据库结构:

制品

+-------------------------------+-------+--------+ | Id | Title | Price | +-------------------------------+-------+--------+ | 00c8234d71c4e94f725cd432ebc04 | Alpha | 589,00 | | 018357657529fef056cf396626812 | Beta | 355,00 | | 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma | 0,00 | +-------------------------------+-------+--------+ 

 +------------+-------------+ | Id | Title | +------------+-------------+ | sellout | Sellout | | discount | Discount | | topproduct | Top Product | +------------+-------------+ 

flagsProducts (n:m pivot)

 +------+-------------------------------+------------+------------+ | Id | ProductId | FlagId | ExternalId | +------+-------------------------------+------------+------------+ | 1552 | 00c8234d71c4e94f725cd432ebc04 | sellout | NULL | | 2845 | 00c8234d71c4e94f725cd432ebc04 | topproduct | NULL | | 9689 | 018357657529fef056cf396626812 | discount | NULL | | 4841 | 01a2c32ceeff0fc6b7dd4fc4302ab | discount | NULL | +------+-------------------------------+------------+------------+ 

这些stringID是一个完整的灾难(但我现在必须处理它们)。 起初我以为我应该对ES做一个扁平化的产品索引结构,但是多个实体绑定呢?

这是一个很好的开始!

我肯定会把它全部弄平(即反规范化 ),并拿出如下所示的产品文档。 这样,通过简单地为每个产品创build一个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"] } 

产品映射types如下所示:

 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" } } } } } 

由于您已经有了logstash jdbcinput,所以缺less的是正确的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 | +-------------------------------+-------+-------+---------------------+ 

使用Logstashfilter,你可以把flags分成一个数组,你就可以走了。