Elasticsearch实现hotel索引库自动补全、拼音搜索功能
在这里边我们有两个字段需要用拼音分词器,一个name字段,一个all字段。 然后我们还需要去实现自动补全,而自动补全对应的字段必须使用completion类型。目前我们酒店里面所有的字段都采用的是这种常规类型,没有completion 类型。所以我们一定要在索引库里面加一个新的字段,比如说我起个名字就叫suggestion。
这个字段它必须采用completion 类型,并且我们将来要去使用拼音分词器,因为我们肯定希望将来要根据拼音首字母去做自动补全,不仅仅是根据英文单词,那么这些功能功能都做完了以后,我们还需要去改我们的java代码。
你索引库里边字段增加了,你的java代码是不是也要增加?最后我们就可以重新去导入数据,测试这个拼音分词的,还有自动补全的功能了。
下边我们就逐一的来去做一下。首先第一步我们去修改酒店索引库数据结构。
sighting就是来定义索引库的分词器的,大家可以看到分词器里面,
Keyword不分词:它的词条直接作为一个整体,然后再去用拼音,因为我将来参与自动补全的,肯定就是固定的一个一个的词条。我们会把这些词条放到数组当中。 因此它本身就是个词条,还有必要再分词吗? 没必要了,所以我们就把它直接做成Keyword类型,不分词,然后再去用这个拼音分词器转成拼音就可以了。
将来我们去做全文检索的,应该用text_analyzer。 如果说做自动补全的,用completion_analyzer
接下来就是定义酒店的字段了。 需要注意的是,我们把这个name字段,它的分词器定义成了text_analyzer ,搜索的时候我们 不能用text_analyzer,应该用这个传统的分词器,所以我们用了ik_smart,与此类似的,还有我们的这个all字段,它也是在创建索引时用text_analyzer ,然后在搜索时用ik_smart。 最后我们还添加了一个suggestion字段,这个字段将来是来自自动补全的,所以它的类型就定义成了completion类型。那他用的分词器是completion_analyzer
先删除之前的索引库,再设置如下:DELETE /hotel
// 酒店数据索引库
PUT /hotel
{
"settings": {
"analysis": {
"analyzer": {
"text_anlyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
},
"completion_analyzer": {
"tokenizer": "keyword",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"id":{
"type": "keyword"
},
"name":{
"type": "text",
"analyzer": "text_anlyzer",
"search_analyzer": "ik_smart",
"copy_to": "all"
},
"address":{
"type": "keyword",
"index": false
},
"price":{
"type": "integer"
},
"score":{
"type": "integer"
},
"brand":{
"type": "keyword",
"copy_to": "all"
},
"city":{
"type": "keyword"
},
"starName":{
"type": "keyword"
},
"business":{
"type": "keyword",
"copy_to": "all"
},
"location":{
"type": "geo_point"
},
"pic":{
"type": "keyword",
"index": false
},
"all":{
"type": "text",
"analyzer": "text_anlyzer",
"search_analyzer": "ik_smart"
},
"suggestion":{
"type": "completion",
"analyzer": "completion_analyzer"
}
}
}
}