2014-07-22 246 views
1

我有四個名爲「fullname」的字段。ElasticSearch自動完成功能

文件:

  • 阿比蓋爾·哈里森
  • Abigale哈迪森
  • 阿比林Havington
  • 阿比林-Havington

我想作一個autocompleter此字段。一些例子:

搜索: 「阿比」 結果: 「阿比蓋爾·哈里森」, 「Abigale哈迪森」, 「阿比林Havington」

搜索: 「Abig」 結果:「阿比蓋爾·哈里森」, 「Abigale哈迪森」

搜索: 「阿比蓋爾喀拉」 結果: 「阿比蓋爾·哈里森」, 「Abigale哈迪森」

搜索: 「阿比林HAV」 結果: 「阿比林Havington」, 「阿比林-Havington」

搜索: 「喀拉」 結果: 「阿比蓋爾·哈里森」, 「Abigale哈迪森」

我不希望是這樣的:(!)

搜索:「IGA」 結果:「阿比蓋爾·哈里森」,「Abigale哈迪森」

空格和連字符應該被忽略,我想所有生成的令牌小寫,所以搜索查詢不應該區分大小寫。

我的ES設置如下。

{ 
"mappings": { 
    "person": { 
     "properties": { 
      "fullname": { 
       "index": "analyzed", 
       "index_analyzer": "autocomplete", 
       "search_analyzer": "standard", 
       "type": "string" 
      } 
     } 
    } 
}, 
"settings": { 
    "index": { 
     "analysis": { 
      "analyzer": { 
       "autocomplete": { 
        "filter": [ 
         "lowercase", 
         "edgengram" 
        ], 
        "tokenizer": "whitespace" 
       } 
      }, 
      "filter": { 
       "edgengram": { 
        "max_gram": 50, 
        "min_gram": 3, 
        "type": "edgeNGram" 
       } 
      } 
     } 
    } 
} 

}

+0

什麼似乎是問題?發生了什麼,你不指望? –

回答

1

建立索引時,你應該隨着小寫,asciifolding,suggestion_shingle,edgengram同時搜索使用關鍵字分析器使用標準分詞器。

嘗試使用這樣的:

"index":{ 
"analysis": { 
    "analyzer": { 
     "autocomplete": { 
      "tokenizer": "standard", 
      "filter": [ 
       "lowercase", 
       "asciifolding", 
       "suggestions_shingle", 
       "edgengram" 
      ] 
     } 
    }, 
    "filter": { 
     "suggestions_shingle": { 
      "type": "shingle", 
      "min_shingle_size": 2, 
      "max_shingle_size": 5 
     }, 
     "edgengram": { 
      "type": "edgeNGram", 
      "min_gram": 2, 
      "max_gram": 30, 
      "side": "front" 
     } 
    } 
} 
} 

"mappings": { 
    "person": { 
     "properties": { 
      "fullname": { 
       "index": "analyzed", 
       "index_analyzer": "autocomplete", 
       "search_analyzer": "keyword", 
       "type": "string" 
      } 
     } 
    } 
} 

然後嘗試使用匹配查詢搜索。它應該解決你的問題。

謝謝

+0

放置此代碼的位置? – indb