2016-04-28 3 views
13


最近、MySQLを使用してPHPで書かれたレガシー電子商取引アプリケーションにElasticSearch(ES)実装を開始しました。私はこのすべてのものに完全に新しいですし、ドキュメントを読むことはうまくありますが、私は本当に私に助言する経験を持つ誰かが必要です。複数エンティティバインディングを使用したElasticSearchインデックス構造の設定方法

ESのドキュメントから、私は新しいクラスタをセットアップできました。また、川が廃止され、置き換えられるべきであることも分かったので、それらをLogstashとJDBC MySQLコネクタに置き換えました。

私はこの時点で:アプリケーションのデータベース構造が本当に最適ではなく、ある

  • JDBCのMySQLドライバ
  • MySQLサーバ
  • Logstash

  • ElasticSearch
    • 交換が非常に難しいですが、可能な限り最良の方法で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への商品インデックスのフラットな構造を取るべきだと思っていましたが、複数のエンティティバインディングはどうですか?

    +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クエリです。あなたはその後、配列にflagsを分割することができますし、あなたが行ってもいいですLogstashフィルタを使用

    +-------------------------------+-------+-------+---------------------+ 
    | id       | title | price | flags    | 
    +-------------------------------+-------+-------+---------------------+ 
    | 00c8234d71c4e94f725cd432ebc04 | Alpha | 589 | Sellout,Top product | 
    | 018357657529fef056cf396626812 | Beta | 355 | Discount   | 
    | 01a2c32ceeff0fc6b7dd4fc4302ab | Gamma |  0 | Discount   | 
    +-------------------------------+-------+-------+---------------------+ 
    

    :あなたはこれらのような行になるだろう

    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 
    

    +0

    logstashフィルタが適用されているので、 "flags"マッピングは文字列ではなく配列でなければなりませんか? – falnyr

    +0

    文字列は問題ありません。ESは、あなたの代わりに文字列の配列を作成します。 – Val

    関連する問題