前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式搜索ElasticSearch自定义分词

分布式搜索ElasticSearch自定义分词

作者头像
xdd
发布2022-07-12 14:38:36
2650
发布2022-07-12 14:38:36
举报
文章被收录于专栏:java技术鸡汤java技术鸡汤

本篇文章主要介绍分布式搜索引擎ElasticSearch自定义分词实践。

1、背景

在实际工作中,客户需要使用搜索框对于基金产品或者基金公司信息进行智能化搜索,比如根据基金代码某部分、基金拼音简称等等来搜索符合条件的产品信息,如果使用关系型数据库来进行搜索,那么大概率是采用了全模糊前后%的形式查询,做了全表扫描,那么随着数据量上升,这种方案的代价是很大的,性能和用户体验也是很不好的。

2、解决方案

基于上述场景,我们需要对该场景的搜索性能和用户体验做提升,我们最终选择了分布式搜索引擎ElasticSearch来解决该问题。众所周知,分布式搜索引擎ElasticSearch因其搜索能力强大而出名,且开源社区活跃。

3、具体实践

3.1、自定义分词器

代码语言:javascript
复制
PUT /product2/
{
    "settings":{
        "analysis":{
            "analyzer":{
                "my_analyzer":{
                    "type":"custom",
                    "tokenizer":"ik_max_word",
                    "filter":"my_filter"
                }
            },
            "filter":{
                "my_filter":{
                    "type":"pinyin",
                    "keep_full_pinyin":true,
                    "keep_original":true,
                    "limit_first_letter_length":16,
                    "lowercase":true,
                    "keep_first_letter":true,
                    "keep_separate_first_letter":false
                }
            }
        }
    }
}

对自定义分词器进行验证:

代码语言:javascript
复制
GET /product2/_analyze
{
    "text":[
        "上投摩根锦程均衡养老目标三年持有期混合型基金中基金(FOF)"
    ],
    "analyzer":"my_analyzer"
}

3.2、ElasticSearch索引映射关系的建立

代码语言:javascript
复制
POST /product2/_mapping
{
  "properties": {
    "firstSpellLetter" : {
        "type" : "text",
        "analyzer" : "my_analyzer"
      },
      "fullName" : {
        "type" : "text",
        "analyzer" : "my_analyzer"
      },
      "liteName" : {
        "type" : "text",
        "analyzer" : "my_analyzer",
        "search_analyzer" : "ik_smart"
      },
      "productCode" : {
        "type" : "text",
        "analyzer" : "my_analyzer"
      },
      "spell" : {
        "type" : "text",
        "analyzer" : "my_analyzer"
      }
  }
}

3.3、插入ElasticSearch索引文档

代码语言:javascript
复制
POST product2/_doc/1
{
    "spell":"ShangTouMoGenJinChengJunHengYangLaoSanNianChiYouHunHe(FOF)",
    "productCode":"007221",
    "firstSpellLetter":"STMGJCJHYLSNCYHH(FOF)",
    "fullName":"上投摩根锦程均衡养老目标三年持有期混合型基金中基金(FOF)",
    "liteName":"上投摩根锦程均衡养老三年持有混合(FOF)"
}

3.4、根据产品代码进行搜索

搜索结果:

3.5、根据简称进行搜索

搜索结果:

3.6、根据产品全称进行搜索

搜索结果:

3.7、根据产品名称拼音进行搜索

搜索结果:

3.8、根据产品名称拼音简称进行搜索

搜索结果:

结束语:

对于上述的自定义分词,使用了开源的ik分词器和pinyin分词器,ElasticSearch也是支持自定义词典的,按需解决问题即可。

如果你是做产品的,请注意查询和搜索的区别,需要明白哪些场景需要使用查询功能,哪些场景需要使用搜索功能,查询条件的设置等等都会影响用户的体验,同时也会对开发的工作也有一定的价值感。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术鸡汤 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档