一行命令让ElasticSearch支持中文分词搜索

本贴最后更新于 3377 天前,其中的信息可能已经渤澥桑田

相信大家在开发博客,在线商城的时候会涉及到搜索功能。而近几年火起来的 ElasticSearch(ES)凭借其稳定、可靠、快速的实时搜索普遍受到大家的好评,连 Github、SoundCloud 也都将 ES 作为其核心搜索组件。

但是 ES 本身对中文分词和搜索比较局限。因为内置的分析器在处理中文分词时,只有两种方式:一种是单字(unigrams)形式,即简单粗暴的将中文的每一个汉字作为一个词(token)分开;另一种是两字(bigrams)的,也就是任意相邻的两个汉字作为一个词分开。这两种方式都不能很好的满足现在的中文分词需求,进而影响了搜索结果

举个例子:
假设我们的 index 里面存储了 3 篇 documents 如下:

idcontent
1美称中国武器商很神秘 花巨资海外参展却一言不发
2在第一界国际锦标赛中 国家代表李雷勇夺冠军
3国武公司近日上市
  • Case 1:查询“中国”,期望只得到 id 为 1 的 document。

    用 unigram 的分析器(即默认的 Standard Analyzer)查询结果为 id 1 和 id 2 的 content;bigram 的分析器(名为 cjk)的结果为 id 1。Standard Analyzer 没有给出预期结果是因为它把“中国”切分为“中”、“国”2 个 token,因此误给出了 id 2 的结果。

  • Case 2:查询“国武”这一家公司,期望只得到 id 为 3 的 document。

    Standard Analyzer 和 cjk 的查询结果都会同时给出 id 1 和 id 3 的 document,但是 id 1 的 document 中的“国武”并不是所指的公司。

    (注:以上查询均用 query_string)

因此我们可以发现内置的分析器有它的局限性,并不能满足复杂或者特定的搜索需求。为此,玻森数据开发了一款基于玻森中文分词的 ES 插件(Elasticsearch-Analysis-BosonNLP),方便大家对中文数据进行更精确的搜索。

现在已有一些成熟的 ES 中文分词插件,但在分词引擎准确率上,相信 BosonNLP 的中文分词能满足大家不同领域上多样化的需求。有兴趣的朋友可以查看 11 款开放中文分词引擎大比拼

接下来,3 分钟教会大家如何安装使用玻森 ES 中文分词插件 Beta 版(以 ES 2.2.0 版本为例):

  • 安装

只需如下一个命令。

$ sudo bin/plugin install https://github.com/bosondata/elasticsearch-analysis-bosonnlp/releases/download/1.3.0-beta/elasticsearch-analysis-bosonnlp-1.3.0-beta.zip

注:对于其他不同版本的 ES,只需要在命令里更换对应的插件版本号即可。

  • 使用

需要在 elasticsearch.yml 文件中的 analyzer 里配置好玻森 bosonnlp analyzer(需要配置 API_TOKEN 以及分词的参数)。详情解释请查看 Github 上玻森 ES 中文分词的 README

bosonnlp: type: bosonnlp API_URL: http://api.bosonnlp.com/tag/analysis API_TOKEN: *PUT YOUR API TOKEN HERE*

完成以上步骤之后便可以使用玻森 ES 分词插件了。

对比之前 Case 2 的查询: 查询“国武”这一家公司,期望只得到 id 为 3 的 document。玻森 ES 分词插件搜索结果:

{ "took" : 70, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.15342641, "hits" : [ { "_index" : "bosonnlp_test", "_type" : "text", "_id" : "3", "_score" : 0.15342641, "_source": { "content":"国武公司近日上市" } } ] } }

当然,如果对分词有特定需求的小伙伴可以在配置里修改对应的参数。目前,玻森数据对于中文分词提供了繁简转换、新词发现等功能,能满足不同领域的搜索需求。

希望这款插件能提升你的工作效率!

GitHub 上有具体的说明。这里附上例子中索引 document 的 bash 文件以方便测试。

  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 195 关注
  • 中文分词
    4 引用 • 3 回帖
  • 分词插件
    1 引用 • 2 回帖
  • BosonNLP
    3 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    排版辛苦了~

    最近在玩 [Elasticsearch] ,正好可以试试你们的分词插件,多谢分享~

  • BosonNLP 1
    作者

    @88250 嘿。。一开始的排版没排好。欢迎来试 有什么问题请告诉我们

推荐标签 标签

  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 166 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 5 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 406 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖
  • 996
    13 引用 • 200 回帖 • 4 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    413 引用 • 3588 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 243 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖 • 3 关注
  • RemNote
    2 引用 • 16 回帖 • 23 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    187 引用 • 830 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 641 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 271 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 559 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 314 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    93 引用 • 122 回帖 • 619 关注