2016-04-25 94 views
0

我在ElasticSearch中構造地址搜索查詢時遇到了問題。Elasticsearch多字段查詢

的地址存儲在ES結構如下:
地址{ 街道, 城市, 郵政編碼 }

這裏是一個示例查詢:

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" 
    } 
}, 

多比賽大多數情況下,查詢都可以正常工作,除了街道還包含城市名稱的情況。 Elasticsearch將這些結果賦予更高的優先級,即使不可接受,這也是完全可以理解的。

下面是_analyze結果:

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)" 
     } 
    ] 
} 

應當指出的是,谷歌地圖API返回相同的查詢準確的結果。

假設/發到現在爲止條件:

  1. 斷詞是:空格,逗號,數字等
  2. 輸入項可以按任何順序包含多字街道名稱,郵政編碼或城市

關於如何改進搜索reuslts的任何建議?

+0

我不知道,但你有沒有試圖改變這個順序:[ 「城市」, 「郵政編碼」, 「街」]? –

+0

是的,但它沒有幫助,也_analyze解釋顯示,它搜索字段 – shailendher

+0

所有條款我猜copy_to選項是我所需要的。將所有值複製到新字段並在那裏運行搜索。 https://www.elastic.co/guide/en/elasticsearch/guide/current/field-centric.html我應該知道明天是否有效。 – shailendher

回答

0

嘗試使用cross_fields而不是most_fields作爲multi_match的類型。

從文檔:

的cross_fields類型與結構化的文檔 多個字段應該匹配是特別有用的。例如,在查詢「Will Smith」的 first_name和last_name字段時,最好的匹配是 可能在一個字段中包含「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」:{ 「查詢」: 「MAINSTREET,休斯敦」, 「類型」: 「cross_fields」, 「minimum_should_match」:2, 「字段」:[「街「,」city「,」zipcode「,」state「] } } }'' – shailendher