2016-04-25 29 views
0

ElasticSearchでアドレス検索クエリをフレーミングする際に問題が発生しました。
アドレス{通り、 都市、郵便番号 }ここで弾性検索マルチフィールドクエリ

とサンプルクエリである:

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

"hits": [ 
{ 
     "_source": { 
     "id": "S6v4xyO8UE5NRcWtmMATPQ==", 
     "street": "Houston 2nd Avenue", 
     "zipcode": "8032", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "Houston 1st Avenue", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 
{ 
    "_source": { 
     "id": "aLgQFrO8zCT8m88lAnYZPQ==", 
     "street": "mainstreet", 
     "zipcode": "8044", 
     "city": "Houston" 
    } 
}, 

マルチマッチを

アドレスは、以下の構造を有するESに格納されます。通りに市の名前が含まれているシナリオを除いて、ほとんどの場合、クエリは正常に機能します。 Elasticsearchはこれらの結果に高い優先順位を割り当てますが、これは許容できなくても完全に理解できます。 GoogleマップのAPIは、同じクエリに対して正確な結果を返すことに留意すべきである

GET /adr-address/_validate/query?explain 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "most_fields", 
     "fields":  [ "street", "city", "zipcode" ] 
    } 
    } 
} 

{ 
    "valid": true, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "explanations": [ 
     { 
     "index": "adr-address", 
     "valid": true, 
     "explanation": "(zipcode:mainstreet zipcode:houston) (street:mainstreet street:houston) (city:mainstreet city:houston)" 
     } 
    ] 
} 

:ここ

は_analyze結果です。

今まで作られた仮定/条件:

  1. トークナイザは以下のとおりです。スペース、カンマ、数字など
  2. 入力用語は、任意の順序
にマルチ言葉通りの名前、郵便番号や都市を含むことができます

検索リユースをどのように改善できるかについてのご意見はありますか?

+0

:[ "都市"、 "郵便番号"、 "ストリート"]? –

+0

はい、それは役に立たなかったし、また、_analyzeの説明は両方のフィールドのすべての用語を検索することを示しています – shailendher

+0

私はcopy_toオプションが私の必要とするものだと思います。すべての値を新しいフィールドにコピーし、そこで検索を実行します。 https://www.elastic.co/guide/en/elasticsearch/guide/current/field-centric.html明日までにこれが動作するかどうかを知っておく必要があります。 – shailendher

答えて

0

mult_matchのタイプとしてmost_fieldsの代わりにcross_fieldsを使用してみてください。ドキュメントから

cross_fieldsタイプは、複数のフィールドが一致する必要があり、構造化文書 と特に便利です。たとえば、 first_nameフィールドとlast_nameフィールドに "Will Smith"フィールドを照会すると、最も一致するのは で、あるフィールドでは "Will"、もう一方のフィールドでは "Smith"となる可能性があります。

あなたが使用しているmost_fieldsは、同じテキストを検索するためのものですが、さまざまな方法で分析されています。

例クエリ:私は知りませんが、あなたが順序を変更しようとしてい

GET /adr-address/_search 
{ 
    "query": { 
    "multi_match": { 
     "query":  "mainstreet, houston", 
     "type":  "cross_fields", 
     "fields":  [ "street", "city", "zipcode"] 
    } 
    } 
} 

link to docs

+0

うん、それはまさに私が今試しているもので、とても有望です。私は明日になるとこれを受け入れられた回答とマークします。 – shailendher

+0

は完璧に機能します!ここに私の最終的な質問があります: 'GET/adr-address/_validate/query?{ "multi_match":{ "クエリ": "メインストリート、ヒューストン"、 "タイプ": "cross_fields"、 "minimum_should_match":2、 "フィールド":「ストリート { "クエリ" を説明"、" city "、" zipcode "、" state "] } } } – shailendher