2013-09-26 48 views
0

我正在使用彈性搜索來索引包含兩個字段的實體:agencyName和agencyAddress。ES檢索部分詞語 - ngram?

比方說,我有一個索引實體:

{ 
    "agencyName": "Turismo Viajes", 
    "agencyAddress": "Av. Maipú 500" 
} 

我想是能夠搜索這個實體並得到上通過agencyName搜索的實體。不同的搜索可能是:

1)urismo 2)VIAJE 3)VIAJES 4)賽車 5)的URI

的想法是,如果我與這​​些字符串查詢我應該總是讓該實體(可能不同的分數取決於它的準確程度)。

爲此,我認爲nGram會解決問題,所以我在我的彈性search.yml文件中定義了一個名爲phrase的全局分析器。

index: 
    analysis: 
    analyzer: 
     phrase: 
     type: custom 
     tokenizer: nGram 
     filter: [nGram, lowercase, asciifolding] 

我創建的代理指標是這樣的:

{ 
    "possible_clients" : { 
    "possible_client" : { 
     "properties" : { 
     "agencyName" : { 
      "type" : "string", 
      "analyzer" : "phrase" 
     }, 
     "agencyAddress" : { 
      "type": "string" 
     } 
} 

的問題是,使這樣的呼叫時:

curl -XPOST 'http://localhost:9200/possible_clients/possible_client/_search' -d '{ 
    "query": { "term": { "agencyName": "uris" }} 
}' 

我沒有得到任何命中。任何想法我做錯了什麼?

在此先感謝。

回答

0

根據文檔,標記器的max_gram的默認值爲2.因此,您可以對tu,ur,ri,is,sm,mo等進行索引。
術語filter不會分析您的輸入,所以,你在尋找uris,而uris從未被索引過。

嘗試設置一個max_gram。 :

ngram tokenizer ngram tokenfilter

也許你不應該同時使用NGRAM分詞器和過濾器NGRAM。我總是隻使用過濾器。 (因爲標記器是空格)

這裏是我們必須在這裏定義的edgengram過濾器。 Ngrams應該工作一樣。

"filter" : {  
"my_filter" : { 
    "type" : "edgeNGram", 
    "min_gram" : "1", 
    "max_gram" : "20" 
} 
} 

希望它有幫助。

+0

謝謝,我會盡快測試它並讓你知道:) –

0

您正在使用術語查詢進行搜索。術語查詢始終是未分析的。所以改變分析儀不會有任何影響。您應該使用例如匹配查詢。