Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用多实体绑定设置ElasticSearch索引结构_Php_Mysql_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Data Structures_Logstash - Fatal编程技术网 elasticsearch,data-structures,logstash,Php,Mysql,elasticsearch,Data Structures,Logstash" /> elasticsearch,data-structures,logstash,Php,Mysql,elasticsearch,Data Structures,Logstash" />

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服务器
应用程序的数据库结构并不是真正最优的,很难替换,但我希望以最好的方式将其复制到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 |
+------------+-------------+
标志

+-------------------------------+-------+--------+
|              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"
                }
            }
        }
    }
}
因为您已经有了logstash
jdbc
输入,所以您所缺少的只是用于获取产品和相关标志的正确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将代表你们创建一个字符串数组。