2016-03-09 71 views
1

我試圖使用ElasticSearch實現地址自動完成。ElasticSearch:精確度低於部分匹配

想,我有三個字段,我想執行搜索:

{ 
    "address_name": "George st.", 
    "number": "1", 
    "city_name": "London" 
} 

this article,我已經配置了我的索引和類型是這樣的:

{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "nGram_filter": { 
        "type": "nGram", 
        "min_gram": 1, 
        "max_gram": 20, 
        "token_chars": [ 
         "letter", 
         "digit", 
         "punctuation", 
         "symbol" 
        ] 
       } 
      }, 
      "analyzer": { 
       "nGram_analyzer": { 
        "type": "custom", 
        "tokenizer": "whitespace", 
        "filter": [ 
         "lowercase", 
         "asciifolding", 
         "nGram_filter" 
        ] 
       }, 
       "whitespace_analyzer": { 
        "type": "custom", 
        "tokenizer": "whitespace", 
        "filter": [ 
         "lowercase", 
         "asciifolding" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "address": { 
      "_all": { 
       "analyzer": "nGram_analyzer", 
       "search_analyzer": "whitespace_analyzer" 
      }, 
      "properties": { 
       "address_name": { 
        "type": "string" 
       }, 
       "number": { 
        "type": "string", 
        "boost": 2 
       }, 
       "city_name": { 
        "type": "string" 
       }, 
       "local": { 
        "type": "integer", 
        "include_in_all": false, 
        "index": "no" 
       }, 
       "place_id": { 
        "type": "integer", 
        "include_in_all": false, 
        "index": "no" 
       }, 
       "has_number": { 
        "type": "integer", 
        "include_in_all": false, 
        "index": "no" 
       } 
      } 
     } 
    } 
} 

全部搜索查詢:

{ 
    "size": 100, 
    "query": { 
     "match": { 
      "_all": { 
       "query": "George st. 1 London", 
       "operator": "and" 
      } 
     } 
    } 
} 

當我通過查詢George st. 1 London,ElasticSearch首先返回我George st. 19 LondonGeorge st. 17 London等,但完全匹配George st. 1 London僅返回第X個位置,並且得分最低。

我試圖通過將explain查詢添加到搜索URL的末尾來理解它爲什麼會發生,但它沒有幫助。

有什麼辦法可以解決這個問題嗎?

謝謝。

+0

你還可以分享你發送的查詢嗎? – Val

+0

'George st。 1倫敦'。謝謝。 –

+0

我的意思是你使用什麼查詢DSL?你能展示你如何發送你的查詢? – Val

回答

1

基本上,因爲你正在運行在通過索引時間的NGRAM令牌過濾器的所有領域,它意味着對於number場,

  • 17將被符號化的117
  • 19會被標記爲119

因此,你提到的所有三個文件都會有標記1索引爲number字段。

然後在查詢時,您使用的空白分析,這意味着George st. 1 London將被標記化到下列標記:Georgest1London

從這裏,我們可以得出兩個結論:

  1. 所有三個文件將匹配不管什麼(因爲所有的記號匹配給定的字段)
  2. 沒有辦法與當前設置和映射你可以給文檔George st. 1 London以比其他文檔更多的權重。

最簡單的方法就是不要將nGram應用到數字字段,以便街道號碼需要完全匹配而不是前綴。

+0

您是否簡單地將number字段設置爲not_analyzed? – Birdy