2016-05-27 4 views
1

私は何をしようとしているのかを簡潔に説明するための用語を知らないのですが、私が現在やっていることと、行う。 2つの検索クエリを1つのクエリに集約しようとしています.1つのインデックスのジオポイントデータを使用して、2つ目のインデックス/ doctypeで検索するための検索パラメータを使用しています。複数のジオロケーションを複数のインデックスにまたがる検索を組み合わせる

は私の現在のESを設定:

インデックスとのdoctype:

|- 1) locations 
|---- 1a) UK_postcode 

|- 2) accounts 
|---- 2a) client 

のDoctypeの各GeoPoint型にマップされたフィールド名「場所」を持っています。

私の現在のプロセス:

1)ユーザーが場所(英国の郵便番号)から、キーワードとの距離に基づいてクライアントを検索します。

2)システムは郵便番号を受け取り、location.UK_postcodeからgeo_point緯度および経度データを取得するために一致する結果を検索します。

3)システムは、提供されたキーワードと緯度と経度を使用してaccounts.clientインデックス/ doctypeを検索します。

4)システムは、ESの検索結果に基づいて見栄えのよい結果をユーザーに返します。

私の質問:

缶は、手順2と3は、単一の検索クエリにロールバックすること?はいの場合はどうすればいいですか?私は検索クエリに郵便番号を渡し、クライアントのdoctype上のジオ・ディスタンス・クエリの要件を満たすためのgeo_pointデータをESが見つけることを望みます。

+0

距離は常に同じですか?すなわち、郵便番号の周りを見回しているときは、いつも(例えば)5kmの郵便番号の場所を見ていますか? (私たちは 'geo_distance'を話しているので) – Val

+0

距離は、ユーザーが指定した検索変数です。 –

+0

したがって、「Comp 'で始まり、郵便番号ABC123の周りに11.5kmの名前のクライアントをすべて手に入れますか? – Val

答えて

1

pre-indexed shapesを使用すると、ステップ2を間違いなく行うことができます。このソリューションはあらかじめ定義された距離でのみ動作します。

主なアイデアは、次のようになります。

  1. 各郵便番号と、各事前定義された距離のためにあなたのlocationsインデックスタイプcirclegeo_shapeに格納します。
  2. は、クライアントの場所
  3. プレインデクス郵便番号形状を活用しまうタイプcirclegeo_shapeクエリを作成するためにあなたのaccountsインデックスタイプPointgeo_shapeに格納します。

だから、簡単な例として、あなたはこれを持っていると思います:

PUT /locations 
{ 
    "mappings": { 
     "UK_postcode": { 
      "properties": { 
       "location": { "type" : "geo_shape" } 
      } 
     } 
    } 
} 

B.作成し、クライアントの場所インデックス

PUT /accounts 
{ 
    "mappings": { 
     "client": { 
      "properties": { 
       "name": { "type": "string" } 
       "location": { "type" : "geo_shape" } 
      } 
     } 
    } 
} 

A.は、郵便番号の位置のインデックスを作成します。 C."M32 0JG" のために1、2、3マイルの半径のサンプル郵便番号サークルを作成

PUT /locations/UK_postcode/M320JG-1 
{ 
    "location": { 
     "type" : "circle", 
     "coordinates" : [-2.30283674284007, 53.4556572899372], 
     "radius": "1mi" 
    } 
} 

PUT /locations/UK_postcode/M320JG-2 
{ 
    "location": { 
     "type" : "circle", 
     "coordinates" : [-2.30283674284007, 53.4556572899372], 
     "radius": "2mi" 
    } 
} 

# ... repeat until radius = 10 

D.非常に近いサンプルのクライアントを作成し、 "M32 0JG"

PUT /accounts/client/1234 
{ 
    "name": "Big Corp" 
    "location": { 
     "type" : "point", 
     "coordinates" : [-2.30293674284007, 53.4557572899372] 
    } 
} 

E.クエリ名前がすべてのクライアントに「ビッグ」と一致し、郵便番号「M32 0JG」の半径2マイルにある人

POST /accounts/client/_search 
{ 
    "bool": { 
    "must": [ 
     { 
     "match": { 
      "name": "big"    <--- free text name match 
     } 
     } 
    ], 
    "filter": { 
     "geo_shape": { 
     "location": { 
      "indexed_shape": { 
      "id": "M320JG-2",   <--- located within two miles of M32 0JG 
      "type": "UK_postcode", 
      "index": "locations", 
      "path": "location" 
      } 
     } 
     } 
    } 
    } 
} 
+0

あなたの考えを見ると、デフォルトの代わりに実際の郵便番号に各郵便番号のIDを設定してもらえませんか?次に、位置の場所に基づいてクライアントの距離をフィルタリングします。一致するID(または郵便番号)を持つ文書のU_K_ポストコード。位置の値。 –

+0

ユニバーサルID(郵便番号自体など)を使用して郵便番号の書類をインデックス登録した場合は、場所を取得するのが簡単です。つまり、検索する必要はありません。しかし、まだ2つの操作です。 – Val

+0

うーん、助けてくれてありがとう、あなたは間違いなく正しい方向に私を指摘した。これは、私が思うに、問題の解決策になるでしょう。私は郵便番号を取得してから、クライアント位置からの「距離」の検索変数としてその位置値を使用する必要があります。私は、ポストコードデータを取得する問題であったときに、ポストコードデータを検索するにはあまりにも固定されていました。 –

関連する問題