总结 | Elasticsearch对外提供分词服务实践

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch对中文的处理,倒排索引的前置条件就是中文分词。 而分词,我们常用的就是IK分词插件。正常ES的部署、开发设计时候就提前选好分词器。 综上,借助Elasticsearch实现分词完全没有问题。

1、问题抛出?

实战开发应用场景中,有获取一段话、一篇文章词频的业务场景,
词频的前提就是分词。
常用的中文分词包括:

1、IK分词——https://github.com/medcl/elasticsearch-analysis-ik
2、结巴分词——https://github.com/huaban/elasticsearch-analysis-jieba
3、ANSJ分词——https://github.com/NLPchina/elasticsearch-analysis-ansj
实际开发中,我们可以借助以上分词工具封装成接口或服务进行分词。
但,有没有想过,借助Elasticsearch的分词插件直接实现分词呢并对外提供服务呢?

2、可行性

1、 Elasticsearch对中文的处理,倒排索引的前置条件就是中文分词。
而分词,我们常用的就是IK分词插件。

2、 正常ES的部署、开发设计时候就提前选好分词器。
综上,借助Elasticsearch实现分词完全没有问题。

3、Elasticsearch中的DSL实现

GET test_index/_analyze
{
  "analyzer":"ik_smart",
  "text":"9年后,我还是没有跑出去 | 震后余生"
}

返回结果:

{
  "tokens": [
    {
      "token": "9",
      "start_offset": 0,
      "end_offset": 1,
      "type": "ARABIC",
      "position": 0
    },
    {
      "token": "年后",
      "start_offset": 1,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "我",
      "start_offset": 4,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "还是",
      "start_offset": 5,
      "end_offset": 7,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "没有",
      "start_offset": 7,
      "end_offset": 9,
      "type": "CN_WORD",
      "position": 4
    },
    {
      "token": "跑出去",
      "start_offset": 9,
      "end_offset": 12,
      "type": "CN_WORD",
      "position": 5
    },
    {
      "token": "震后",
      "start_offset": 15,
      "end_offset": 17,
      "type": "CN_WORD",
      "position": 6
    },
    {
      "token": "余生",
      "start_offset": 17,
      "end_offset": 19,
      "type": "CN_WORD",
      "position": 7
    }
  ]
}

4、Elasticsearch Java接口实现

以下是基于Jest5.3.3的接口实现。

/*
*@brief:获取分词结果接口
*@param:待分词的文章/字符串
*@return:不重复分词结果集(可根据实际业务场景二次开发)
*@date:20180704
*/
public static String IK_TYPE = "ik_smart";
public static Set<String> getIkAnalyzeSearchTerms(String searchContent) {    
        // 调用 IK 分词分词
        JestClient client = JestHelper.getClient();
        Analyze ikAnalyze = new Analyze.Builder()
                    .index(TEST_INDEX)
                    .analyzer(IK_TYPE)
                    .text(searchContent)
                    .build();

        JestResult result = null;
        Set<String> keySet = new HashSet<String>();
        try {
            result = client.execute(ikAnalyze);
            JsonArray jsonArray = result.getJsonObject().getAsJsonArray("tokens");
            int arraySize = jsonArray.size();
            for (int i = 0; i < arraySize; ++i) {
                JsonElement curKeyword = jsonArray.get(i).getAsJsonObject().get("token");
                //Logger.info("rst = " + curKeyword.getAsString());
                keySet.add(curKeyword.getAsString());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return keySet;
    }

有了java接口,对外提供Restful API就变得相对简单了。

5、小结

充分挖据Elasticsearch自身特性,优化、简化业务场景才是王道!


作者:铭毅天下
转载请标明出处,原文地址:
https://blog.csdn.net/laoyang360/article/details/80892343

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
SQL API 索引
Superset对接ElasticSearch服务展示
Superset对接ElasticSearch服务展示
287 2
|
1月前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
107 3
|
1天前
|
存储 监控 固态存储
elasticsearch索引生命周期管理(ILM):原理和实践
elasticsearch索引生命周期管理(ILM):原理和实践
12 4
|
1天前
|
存储 JSON API
Elasticsearch中的模板:定义、作用与实践
Elasticsearch中的模板:定义、作用与实践
9 3
|
2天前
|
搜索推荐 Java 数据库
Java中的ElasticSearch集成与实践
Java中的ElasticSearch集成与实践
|
1月前
|
数据采集 数据挖掘 索引
Elasticsearch “指纹”去重机制,你实践中用到了吗?
Elasticsearch “指纹”去重机制,你实践中用到了吗?
36 7
|
1月前
|
自然语言处理 Java Shell
Elasticsearch【环境搭建 01】【elasticsearch-6.4.3 单机版】(含 安装包+分词插件 云盘资源)
【4月更文挑战第12天】Elasticsearch【环境搭建 01】【elasticsearch-6.4.3 单机版】(含 安装包+分词插件 云盘资源)
33 2
|
1月前
|
运维 监控 Java
探索Elasticsearch在Java环境下的全文检索应用实践
【4月更文挑战第17天】本文介绍了在Java环境下使用Elasticsearch实现全文检索的步骤。首先,简述了Elasticsearch的功能和安装配置。接着,通过Maven添加`elasticsearch-rest-high-level-client`依赖,创建`RestHighLevelClient`实例连接Elasticsearch。内容包括:创建/删除索引,插入/查询文档。还探讨了高级全文检索功能、性能优化和故障排查技巧。通过Elasticsearch,开发者能高效处理非结构化数据,提升应用程序价值。
|
1月前
|
自然语言处理 算法 索引
Elasticsearch 8.X 分词插件版本更新不及时解决方案
Elasticsearch 8.X 分词插件版本更新不及时解决方案
32 0
|
1月前
|
存储 自然语言处理 搜索推荐
【Elasticsearch专栏 06】深入探索:Elasticsearch如何处理倒排索引中的分词问题
Elasticsearch通过内置和可定制的分词器及过滤器处理倒排索引中的分词问题,确保文本被拆分成合适的词条并优化存储,为全文搜索等提供高效支持。用户可通过分析API测试和调整分词效果。
37 3