2014-07-22 197 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