2016-05-11 10 views
0

私は4つのテーブルがあります。elasticsearchでデータをインデックスする最良の方法は何ですか?

  1. 国を
  2. 状態
  3. アドレス
  4. 国がトップの親であるこれらのテーブルはIDによって関連している

  • state.countryId
  • city.stateId
  • address.cityId

私は自分のアプリケーションに弾性検索を統合すると、インデックスへの最善の方法は、これらのテーブルが何であるかを知りたいですか?

国、州、市および住所ごとに1つのインデックスを持つように、各テーブルに1つのインデックスを作成する必要がありますか?

または、テーブルを非正規化して1つのインデックスのみを作成し、すべてのデータを冗長性で保存する必要がありますか?

答えて

2

ESは、データの冗長度を恐れていないので、各文書は、このように一つのアドレスを表すように、私は明らかに非正規化します:

{ 
    "country_id": 1, 
    "country_name": "United Stated of America", 
    "state_id": 1, 
    "state_name": "California" 
    "state_code": "CA", 
    "city_id": 1, 
    "city_name": "San Mateo" 
    "zip_code": 94402, 
    "address": "400 N El Camino Real" 
} 

あなたは、その後どのような都市、州、国フィールド上のデータを集計することができますあなたは欲しい。

データのクエリ/集計方法によって最終的に異なるため、実際の走行距離は異なる場合がありますが、複数のインデックスを使用するのではなく、1つのインデックスでアドレスデータを照会する方が簡単です。

+0

そうですね、私もこのようなことをしていましたが、決定するのはちょっと躊躇しました。私は1つの質問を持っています...個々の国や州や市の記録が必要な場合はどうなりますか?このように保管していますか?'{ "COUNTRY_ID":1、 "COUNTRY_NAME": "アメリカ合衆国"、 "STATE_ID":、 "STATE_NAME": "STATE_CODE":、 "CITY_ID":、 "CITY_NAME": "zip_code": "address": } – user2707590

+0

たとえば、「country_ *」フィールドのみを取得することができます。 – Val

0

私はValの答えが好きですが、これは最も単純な選択肢です。しかし、実際にディスク上のサイズを最小限に抑えるために、重複を減らしたい場合は、parent-childマッピングを使用できます。インデックス作成とクエリーはもう少し冗長になります。私はまだ "フラット"なマッピングに挑戦しています。

あなたは「あなたは、個々の国や州や都市の記録が必要な場合はどう?」尋ねた、私は、この文書が表す階層のどのレベルを示すであろう追加のフィールド(not_analyzedまたは整数)を追加することをお勧めしたいです。より低いレベルの階層に対応するフィールドを持たないことは大丈夫です。この方法で、検索する州や国だけに簡単にフィルタを設定できます。

0

Hereは、多数のインデックスを作成するか、より少ないインデックスおよび多くのタイプを作成するかのトレードオフの主題を詳述する@adrien-grandによって非常に有用な記事です。

希望すると助かります!

関連する問題