2012-12-09 75 views
4

我想用部分單詞進行搜索,忽略外殼並忽略某些字母的加重。可能嗎?我認爲ngram與默認的tokenizer應該做的伎倆,但我不明白如何與NEST做到這一點。Elasticsearch使用NEST:如何配置分析器來查找部分單詞?

例:「musiic」應該與有「音樂」的記錄

我使用Elasticsearch的版本是1.9。

我做這樣的,但它不工作...

var ix = new IndexSettings(); 
     ix.Add("analysis", 
      @"{ 
       'index_analyzer' : { 
          'my_index_analyzer' : { 
             'type' : 'custom', 
             'tokenizer' : 'standard', 
             'filter' : ['lowercase', 'mynGram'] 
          } 
       }, 
       'search_analyzer' : { 
          'my_search_analyzer' : { 
             'type' : 'custom', 
             'tokenizer' : 'standard', 
             'filter' : ['standard', 'lowercase', 'mynGram'] 
          } 
       }, 
       'filter' : { 
         'mynGram' : { 
            'type' : 'nGram', 
            'min_gram' : 2, 
            'max_gram' : 50 
         } 
       } 
    }"); 
     client.CreateIndex("sample", ix); 

感謝,

大衛

回答

2

簡答

我認爲你是什麼尋找是fuzzy query,它使用Levenshtein distance算法來匹配相似的單詞。

上n元語法

的NGRAM濾波器龍回答分割文成基於所定義的最小/最大範圍許多較小的令牌。

例如,從您的「音樂」查詢過濾器將生成: 'mu', 'us', 'si', 'ic', 'mus', 'usi', 'sic', 'musi', 'usic', and 'music'

正如你可以看到musiic不匹配任何這些NGRAM令牌。

爲什麼的n-gram的n元語法

一個好處是,它使通配符查詢顯著更快,因爲所有潛在的子預先生成並在插入時(我已經看到查詢從多秒加速索引使用nGrams達到15毫秒)。

沒有nGrams,每個字符串必須在查詢時搜索匹配[O(n^2)]而不是直接在索引[O(1)]中查找。由於僞代碼:

hits = [] 
foreach string in index: 
    if string.substring(query): 
     hits.add(string) 
return hits 

VS

return index[query] 

注意,這是以使刀片更慢,需要更多的存儲空間爲代價的,而較重的內存使用情況。

相關問題