2016-04-28 38 views
13


最近,我開始致力於將ElasticSearch(ES)實現應用到使用MySQL編寫的使用PHP編寫的傳統電子商務應用程序中。我對所有這些東西都是全新的,閱讀文檔很好,但我真的需要有經驗的人來爲我提供建議。如何使用多個實體綁定來設置ElasticSearch索引結構

從ES文檔中我可以建立一個新的集羣,並且我也發現河流已經過時並應該被替換,所以我用Logstash和JDBC MySQL連接器替換了它們。

在這一點上,我有:

  • ElasticSearch
  • Logstash
  • JDBC MySQL驅動
  • MySQL服務器

應用程序的數據庫結構是不是真的最佳的,是很難替換,但我想以最好的方式將其複製到ES索引中。

DB結構:

產品

+-------------------------------+-------+--------+ 
|    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樞軸)

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

這些字符串ID是一個完整的災難(但我現在必須處理它們)。起初我以爲我應該對ES做一個扁平結構的Products索引,但是多個實體綁定呢?

+0

如果你想移動你的MySQL數據到ES:https://sysadminci.wordpress.com/2016/01/06/import-mysql-data-in-elasticsearch-server/ –

+0

平面數據結構似乎是最好的到目前爲止。您對此索引有任何特定的查詢要求?考慮ES中的數據結構意味着考慮你想要使用的查詢。 –

+0

@falnyr,你在過去7天內沒有提過你的問題。是否還有更多您需要的信息? – Val

回答

10

這是一個很好的開始!

我肯定會把它全部弄平(即denormalize),並拿出如下所示的產品文檔。這樣,通過簡單地爲每個產品創建一個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過濾器,你可以再拆flags到一個數組,你是好去。

+0

是否意味着「flags」映射應該是數組而不是字符串,因爲我應用了logstash過濾器? – falnyr

+0

字符串很好,ES會代表您創建一個字符串數組。 – Val

相關問題