es中文自动补全功能如何实现

来源:7-20 提升搜索性能之多级缓存策略

沙漠风暴2635293

2022-07-25

es中有自动补全功能,但我使用时发现只有在英文内容时,自动补全功能才生效,如果内容是中文,则补全功能失效,老师帮忙再指导下哈,谢谢老师
写回答

1回答

少林码僧

2022-07-25

你是怎么实现的? 是不是使用的分词器没有对中文进行处理导致的?

需要注意的是: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来实现,通过分析用户或平台的高频查询词单独维护一个索引来实现,定期同步高频查询词;

如果是非电商场景,比如联系人等用户有相同关键词搜索习惯的场景,展示历史搜索要比关键词的点击率更高

1
1
沙漠风暴2635293
答案非常完美
2022-07-26
共1条回复

海量数据高并发场景,构建Go+ES8企业级搜索微服务

全新 ES8 配合技术组件,实现高性能搜索

267 学习 · 54 问题

查看课程