es中文自动补全功能如何实现
来源:7-20 提升搜索性能之多级缓存策略

沙漠风暴2635293
2022-07-25
1回答
-
你是怎么实现的? 是不是使用的分词器没有对中文进行处理导致的?
需要注意的是:ES自带的自动补全默认是基于前缀查询的,也就说必须从原文本的第一个子词开始输入才能获取到补全内容
下面是具体示例:其中使用了ik和拼音分词器来对自动补全的字段进行分词
PUT test-index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis": {
"analyzer": {
"suggest_analyzer": {
"tokenizer": "ik_max_word",
"filter": "pinyin_filter"
}
},
"filter": {
"pinyin_filter": {
"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": {
"name": {
"type": "completion",
"analyzer": "suggest_analyzer"
}
}
}
}
PUT test-index/_doc/1
{
"name":"欢迎来到慕课网学习"
}
PUT test-index/_doc/2
{
"name":"hello word"
}
POST /test-index/_search
{
"suggest": {
"name_suggest": {
"text": "欢迎",
"completion": {
"field": "name",
"skip_duplicates": false,
"size": 10
}
}
}
}
上面中文的补全查询是可以获取到补全内容的
如果希望实现任意子串补全可以考虑直接使用ES的query来实现,通过分析用户或平台的高频查询词单独维护一个索引来实现,定期同步高频查询词;
如果是非电商场景,比如联系人等用户有相同关键词搜索习惯的场景,展示历史搜索要比关键词的点击率更高112022-07-26
相似问题
回答 1
回答 1