es笔记四之中文分词插件安装与使用

本文首发于公众号:Hunter后端
原文链接:es笔记四之中文分词插件安装与使用

前面我们介绍的操作及演示都是基于英语单词的分词,但我们大部分使用的肯定都是中文,所以如果需要使用分词的操作肯定也是需要使用中分分词。

这里我们介绍一下如何安装中文分词插件。

在介绍安装之前,我们可以先来测试一下没有中文分词的分词效果,我们先来插入一条数据:

PUT /exam/_doc/16
{
    "name" : "张三丰",
    "address": "一个苹果"
}

如果是中文分词,我们可以想到 '一个苹果' 应该会被分为 '一个' 和 '苹果' 这两个词,但是默认的分词是无法这样分词的,我们可以尝试搜索一下:

GET /exam/_search
{
  "query": {
    "term": {
      "address": "一个"
    }
  }
}

可以发现是无法搜索到结果的。

我们可以查看一下这条数据的 address 字段被分词的结果:

GET /exam/_doc/16/_termvectors?fields=address

其中,_doc 后面的 16 是我们要查询的数据的 id,fields 后面跟着的要查看的分词结果的字段名。

可以看到 一个苹果 这个字符串,被挨个分成了四个。

然后我们来安装一下中文分词的插件。

安装中文分词插件

在 elasticsearch 安装的目录下,执行下面的语句:

./bin/elasticsearch-plugin install http://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.0/elasticsearch-analysis-ik-7.6.0.zip

这里我们安装的是 7.6.0 版本的 es,所以安装对应的分词插件。

然后我们重新建立这个 index,为 address 字段加上指定的分词插件:

挨个执行下面的命令:

DELETE /exam/

PUT /exam

PUT /exam/_mapping
{
  "properties": {
    "address": {
      "type": "text",
      "analyzer": "ik_max_word",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "name": {
      "type": "keyword"
    }
  }
}

这里,和第一次创建 mapping 的时候比,多了一行 analyzer 的定义。

然后我们再次重复上面的插入和查询操作:

PUT /exam/_doc/16
{
    "name" : "张三丰",
    "address": "一个苹果"
}

GET /exam/_search
{
  "query": {
    "term": {
      "address": "一个"
    }
  }
}

可以看到,这次我们搜索 一个,就可以查询到数据了。

然后我们看下这条数据的 address 的分词结果:

GET /exam/_doc/16/_termvectors?fields=address

可以看到,这次返回的结果除了单独的 '一' 和 '个' 之外,还有被分成整体的 '一个' 和 '苹果'。

查看分词结果

这里额外介绍一下如何查看字符串的分词。

如果我们有一个字符串,想要知道它会被如何分词,可以直接使用下面的命令:

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "一个苹果"
}

其中,analyzer 是指定的分词的插件,如果不指定就会使用默认的分词功能。

中文分词插件的github 地址如下:http://github.com/medcl/elasticsearch-analysis-ik

如果想获取更多后端相关文章,可扫码关注阅读:
image

本文转载于网络 如有侵权请联系删除

相关文章

  • Java中的FileInputStream与FileOutputStream的基本使用详解[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。什么是InputStream和OutputStream?InputStream和OutputStream是抽象类,是所有字节输入流和输出流的父类。这里,我们首先要分清楚两个概念: InputStream(输入流):输入流是用来读入数据的。-––>>>读入OutputStream(输出流):输出流是用来写出数据的。-––>>>写出文件输入流——FileInputStreamFileInputStream从文件系统中的某个文件中获得输入字节。 构造方法//通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。 publicFileInputStream(Filefile); //通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。 publicFileInputStream(Stringname);复制常用的方法从输入流中读取一个字节大小的数据//从此输入流中读取一个数据字节。 public

  • 谷歌提出纯 MLP 构成的视觉架构,无需卷积、注意力 !

    当前,卷积神经网络(CNN)和基于自注意力的网络(如近来大火的ViT)是计算机视觉领域的主流选择,但研究人员没有停止探索视觉网络架构的脚步。近日,来自谷歌大脑的研究团队(原ViT团队)提出了一种舍弃卷积和自注意力且完全使用多层感知机(MLP)的视觉网络架构,在设计上非常简单,并且在ImageNet数据集上实现了媲美CNN和ViT的性能表现。计算机视觉的发展史证明,规模更大的数据集加上更强的计算能力往往能够促成范式转变。虽然卷积神经网络已经成为计算机视觉领域的标准,但最近一段时间,基于自注意力层的替代方法VisionTransformer(ViT)实现新的SOTA性能。从技术上讲,ViT模型延续了长久以来去除模型中手工构建特征和归纳偏置的趋势,并进一步依赖基于原始数据的学习。近日,原ViT团队提出了一种不使用卷积或自注意力的MLP-Mixer架构(简称Mixer),这是一种颇具竞争力并且在概念和技术上都非常简单的替代方案。Mixer架构完全基于在空间位置或特征通道重复利用的多层感知机(MLP),并且仅依赖于基础矩阵乘法运算、数据布局变换(如reshape和transposition)和非

  • 面试官:Vue组件间通信方式都有哪些?

    一、组件间通信的概念 开始之前,我们把组件间通信这个词进行拆分组件通信都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,任何信息的交通都是通信组件间通信即指组件(.vue)通过某种方式来传递信息以达到某个目的举个栗子我们在使用UI框架中的table组件,可能会往table组件中传入某些数据,这个本质就形成了组件之间的通信二、组件间通信解决了什么在古代,人们通过驿站、飞鸽传书、烽火报警、符号、语言、眼神、触碰等方式进行信息传递,到了今天,随着科技水平的飞速发展,通信基本完全利用有线或无线电完成,相继出现了有线电话、固定电话、无线电话、手机、互联网甚至视频电话等各种通信方式从上面这段话,我们可以看到通信的本质是信息同步,共享回到vue中,每个组件之间的都有独自的作用域,组件间的数据是无法共享的但实际开发工作中我们常常需要让组件之间共享数据,这也是组件通信的目的要让它们互相之间能进行通讯,这样才能构成一个有机的完整系统二、组件间通信的分类组件间通信的分类可以分成以下父子组件之间的通

  • Hello,Kotlin

    Kotlin是GoogleIO2017推荐的Android开发语言,前段时间大面积霸屏,接下来我们将会花一段时间简单介绍Kotlin,官网对Kotlin说明如下: Staticallytypedprogramminglanguageformodernmultiplatformapplications这句话的意思是Kotlin是一种跨平台的静态编程语言,在随后的编码过程中我们会看出静态的含义。安装Kotlin插件由于AndroidStudio3.0中才会对Kotlin完全支持,在3.0以下版本如果要使用Kotlin,只能利用插件方式引入。(PS:大家可以使用Preview版尝鲜)。打开AndroidStudio->Plugins面板,输入kotlin关键词,搜索,如下图:安装后新建Android项目,新建后右键选择File->new->KotlinActivity,输入Activity名称,随后界面上会有configkotlin的选项,按照提示操作就好。Kotlin-extensions在Moudule的build.gradle文件中添加applyplugin:

  • Android开发之ViewFlipper自动播放图片功能实现方法示例

    本文实例讲述了Android开发之ViewFlipper自动播放图片功能实现方法。分享给大家供大家参考,具体如下:简介:1.ViewFlipper继承了ViewAnimator可以调用addView()添加组件2.ViewAnimator与AdapterViewFlipper类似,区别在于:AdapterViewFlipper可以通过Adapter直接添加多个view,而ViewAnimator需要通过调用addView()方法添加View效果呈现:有此实例可以看出ViewFlipper再制作轮播图等图片自动播放器上有很大优势这里给出布局文件:<?xmlversion="1.0"encoding="utf-8"? <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match

  • 关于函数参数的应用

    函数参数,一般情况下有两种应用:其一,通过参数传给被调用函数一个数值,通过被调用函数的计算,返回一个数值。其二,通过参数传给被调用函数一个数值,通过被调用函数的计算,然后再对该参数进行重新赋值,以便后期使用。第二种情况一般发生在被调用函数需要返回多个数值,或者是程序员根据编程需要而为。示例:两个整数变量进行相互对换。采用传值(数值)方式:voidswap1(inta,intb){inttmp;tmp=a;a=b;b=tmp;}采用传址(地址)方式:swap2(int*a,int*b){inttmp;tmp=*a;*a=*b;*b=tmp;}main(){inta=10;intb=23;swap1(a,b);printf("1--a=%db=%d\n",a,b);swap2(&a,&b);printf("2--a=%db=%d\n",a,b);}结果:1--a=10b=232--a=23b=10对于swap1,由于传递的是数值,在swap1被调用时,系统给出2个整数空间,分别存放a,b的数值,通过函数swap1的运行,系统给出2个整

  • NodeJS多核处理模cluster解读

    参考http://blog.fens.me/nodejs-core-cluster/ 大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算。所以,有人开发了第三方的cluster,让node可以利用多核CPU实现并行。1.cluster介绍cluster是一个nodejs内置的模块,用于nodejs多核处理。cluster模块,可以帮助我们简化多进程并行化程序的开发难度,轻松构建一个用于负载均衡的集群。2.cluster的简单使用在win的环境中,我们通过cluster启动多核的node提供web服务。 新建文件:app.jsvarcluster=require('cluster'); varhttp=require('http'); varnumCPUs=require('os').cpus().length; if(cluster.isMaster){ console.log("masterstart..."); //Forkworkers. fo

  • 互联网金融遭遇困境,金融科技如何才能迎来春天?

    至少从当下的发展情况来看,金融科技所具备的“科技属性”要比“金融属性”多一些。以蚂蚁金服、京东金融为代表的互联网巨头对于金融科技的“科技属性”的加持更是让这种趋势变得非常明显。在互联网金融发展遭遇困境的情况下,金融科技的出现并被人们熟知似乎为我们打开了重新认识“金融”与“科技”两种元素应当如何结合的全新思考方式。以科技为切入点,以金融为落脚点,通过服务创新、技术创新和模式创新来继续达成科技对于金融行业的改造正在成为一个越来越明显的共识。以科技为切入点,以金融为落脚点的发展方式正在演变成为金融科技。互联网金融野蛮生长带来的发展难题、金融行业的本质痛点尚未缓解造成的用户诟病都在让金融科技的发展变得有些迫不及待。虽然很多人认为,金融科技的出现是互联网金融发展的必然结果,但是作为互联网金融经过沉淀之后重新被认识的存在,金融科技的发展道路似乎变得更加笃定。互联网金融遭遇困境,金融科技迅速萌芽互联网金融的平台化、流量化的特征最终决定了它无法做到传统金融行业严格的风控机制。于是,用户倒戈、政策监管便会成为必然。当互联网金融的发展遭遇前所未有的发展困境,一场以金融科技为代表的全新的金融行业革命正在悄然

  • 玩转Flume之核心架构深入解析

    前段时间我们分享过玩转Flume+Kafka原来也就那点事儿和Flume-NG源码分析-整体结构及配置载入分析这二篇文章,主要介绍了flume的简单使用和配置文件加载的全过程,那么今天我们重点分析flume核心原理,从而了解Source、Channel和Sink的全链路过程。一、Flume架构分析 F7C59934-2C22-4F45-BE12-FCC9BB2A1708.png这个图中核心的组件是: Source,ChannelProcessor,Channel,Sink。他们的关系结构如下:Source{ ChannelProcessor{ Channelch1 Channelch2 … } } Sink{ Channelch; } SinkGroup{ Channelch; Sinks1; Sinks2; … }复制二、各组件详细介绍 1、Source组件Source是数据源的总称,我们往往设定好源后,数据将源源不断的被抓取或者被推送。 常见的数据源有:ExecSource,KafkaSource,HttpSource,NetcatSource,JmsSource,AvroSour

  • 用 AI 怼黑产是一种怎样的体验?(上)

    导读:2017年8月31日,由腾讯安全科恩实验室主办的“2017腾讯安全国际技术峰会(TenSec2017)”落下帷幕,本次峰会聚焦安全行业前沿技术,覆盖时下最热的安全议题。在为期两天的议程中,来自腾讯、微软、谷歌等国际工业界和学术界顶级的研究员共带来15个安全议题,现场干货满满,堪称一场技术研究人员的盛会。本篇文章正是选择了AI的这个热点,全文刊登了腾讯安全平台部总经理coolc关于“AI技术在信息安全领域的应用”的现场演讲发言。首先跟大家做一下自我介绍,我在安全行业已经工作十几年了,可以说在安全攻防这个领域,我是一个老兵,但是在AI安全相关的内容上,我觉得我还是一个新人。其实大家担忧AI会抢去我们工作,这件事情发生或没有发生,或者在某些领域正在发生。危机AI助力安全再上新台阶作为安全行业来说,我们确实也感受到AI给我们带来一些实实在在的好处,比如说我们传统的安全领域最常用的,如用密码来鉴别用户身份这个领域。随着AI技术的到来,其实我们在慢慢让生物识别变成可能,比如人脸的识别,我们这里就使用了很多AI中图像识别的技术,让这些功能成为可能。同时,当我们把机器学习的方法用于恶意代码的识别

  • sql 、linq、lambda 查询语句的区别

    LINQ的书写格式如下:  from临时变量in集合对象或数据库对象  where条件表达式  [orderby条件]  select临时变量中被查询的值  [groupby条件]   Lambda表达式的书写格式如下: (参数列表)=>表达式或者语句块 其中:参数个数:可以有多个参数,一个参数,或者无参数。 参数类型:可以隐式或者显式定义。 表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。   1.查询全部   1查询Student表的所有记录。  select*fromstudent  Linq:     fromsinStudents     selects  Lambda:     Students.Select(s=>s)    按条件查询全部:     查询Student表中的所有记录的Sname、Ssex和C

  • explain的关键字段的意义

    mysql提供的explain工具可以输出一些有用的信息。 一下是相关的部分返回值的意义。 select_type 表示SELECT的类型,常见的取值有: SIMPLE:简单表,不使用表连接或子查询 PRIMARY:主查询,即外层的查询 UNION:UNION中的第二个或者后面的查询语句 type 表示MySQL在表中找到所需行的方式,或者叫访问类型。常见的访问类型如下,从上到下,性能越来越差。 system,const:表只有一行记录(等于系统表),这是const类型的特列。 eq_ref唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。 ref非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。 range只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。 indexFullIndexScan:Index与All区别为index类型只遍历索引

  • eNSP配置基本与高级访问控制列表

    首先我们进行基本的acl控制        拓扑图如下所示    首先我们对路由器进行基本ip配置并在路由器上设置ospf协议添加相邻的网段                  在路由器上运行了ospf协议后使用displayiproute-tableprotocolospf命令查看通过ospf协议学到的路由信息这里举例R1      接着我们在R4路由器上设置telnet登录密码为huawei    现在我们在其他路由器上登录均可以登录         这样极不安全所以我们通过设置acl控制禁止员工登录R4    配置完之后我们再次用R2登录R4 可以发现已经无法登录    acl规则是有顺序性的 如果规则号小的规则已经匹配那么其他后续规则则不再匹配  

  • Zookeeper

    Zookeeper是什么 Zookeeper是一个高性能分布式应用协调服务,主要有以下功能: NamingService配置管理LeaderElection服务发现同步GroupServiceBarrier分布式队列两阶段提交 Zookeeper工作方式 Zookeepe集群包含1个Leader,多个Follower所有的Follower都可提供读服务所有的写搡作都会被forward到LeaderClient与Server通过NIO通信。全局串行化所有的写操作保证同一客户端的指令被FIFO执行保证消息通知的FIFO Zab协议 Zab协议的全称是ZookeeperAtomicBroadcast(Zookeeper原子广播) 1广播模式 Leader将所有更新(称为proposal),顺序发送给Follower 每个Zookeeper都有一个内存数据库(缓存),当client请求server时读取数据时就是读取的内存数据库,不用每次读磁盘。 当Zookeeper收到proposal时,会将proposal持久化到磁盘当Leadercommitproposal后就会将propo

  • linux+mysql+pymysql初见

    先跟着mysql官网在centos云主机上部署好MySQL。 切换到一个非root用户,貌似root用户第一次不能直接用mysql。 设置使用密码,要求root授权。完成后切回root用户,运行  servicemysqlstart复制 没出问题应该正常运行了,也可以 servicemysqlstatus复制 查看情况     基本简单的操作(更多的指令还在学): showdatabases;列出所有数据库 createdatabasexx;创建db use xx;转到某数据库 老师给个.sql文件那么我们就直接导入建库 假设已经建立testdb,再usetestdb;source/your/sql/path/sql.sql 查看库中所有内容 select*fromxxx复制 xx为库名   那么使用pymysql怎么连接? importpymysqlaspms db=pms.connect(host="localhost",user="root", password="Richard1991028",db="test

  • Aoite 系列(03) - 一起来 Redis 吧!

    Aoite是一个适于任何.NetFramework4.0+项目的快速开发整体解决方案。Aoite.Data适用于市面上大多数的数据库提供程序,通过统一封装,可以在日常开发中简单便捷的操作数据库。 赶紧加入AoiteGitHub的大家庭吧!! 插几句话:开源对我来讲,是一种分享。没有人可以从中获取金钱上的利益。每一套框架都有不足和亮点所在。Aoite目的是让园友多一种可尝试的选择。对我来说的根本目的在于让Aoite真正的成为一个快速开发整体解决方案。 1.快速入门 Redis在.NET上有非常多成熟的框架。Aoite.Redis仅仅目前只是实现其中的一员。实现Aoite.Redis的根本目的是为了迎合Aoite.CommandModel模块,并且减少对外部框架的依赖。 using(varclient=newRedisClient(6379,null/*password*/)) { client.FlushAll(); client.Set("Int32Value",1); client.Set("StringValue","a"); client.Set("DoubleValue",

  • 课后作业-阅读任务-阅读提问-4

    同类型的软件之间是如何竞争的? 项目开发有什么经验和教训? 团队精神和集体主义的区别? 好的用户体验当然是所有人都想要的,如果它和产品的质量有冲突,怎么办?  牺牲质量去追求用户体验吗?用户能接受吗?

  • Java abstract 理解和学习

    /** *<html> *<body> *<P>CopyrightJasonInternationalSince1994https://github.com/Jasonandy/Spring-Core</p> *<p>Allrightsreserved.</p> *<p>Createdon2018年</p> *<p>CreatedbyJason</p> *</body> *</html> */ packagecn.ucaner.core.absinf; /** *@Package:cn.ucaner.core.absinf *@ClassName:AbsInfDemo *@Description:<p>AbsInfDemo-接口和抽象类的学习{@linkhttps://www.cnblogs.com/danbing/p/5035189.html} * *最近学习Spring的源码仿Spring实现 *里面用到大量的抽象类和接口概念

  • “零余额”账户为何从来不曾零

    一、什么是零余额账户?其作用如何?  零余额帐户指财政部门或财政部门为预算单位在商业银行开设的用于办理预算资金支付清算的账户。零余额帐户日终在与设在中央银行的国库单一账户清算后结余为零。  从零余额账户的概念来看,它是办理预算资金支付清算的账户。而就零余额账户的运作过程来看,它是一个过渡性账户。当符合预算规定的商品或劳务政府购买活动已经发生或完成时,财政部门或其授权的预算单位向零余额账户发出支付指令,零余额账户在向商品或劳务供应商支付后,于日终前向国库单一账户申请清算,由国库单一账户将资金支付到零余额账户。可见,零余额账户的实质是过渡性支付清算账户。  从财政集中支付的目的来看,零余额账户作为过渡性支付清算账户,其核心是零余额,即账户日终余额必须始终保持为零,以此保证国库单一账户对预算资金的集中管理,体现国库单一账户对支付的集中控制。正是由于这一性质,世界各国把这一账户称为零余额账户。  零余额账户的重要性主要表现在:  (一)零余额账户是连接国库单一账户与商品或劳务供应商账户的纽带,代理国库单一账户对商品或劳务供应商的支付。  (二)零余额账户是实现对预算资金最终付款控制的必要的技术

  • c#拷贝整个文件夹到指定文件夹下(非递归)

    publicstaticvoidCopyEntireDir(stringsourcePath,stringdestPath){ //NowCreateallofthedirectories foreach(stringdirPathinDirectory.GetDirectories(sourcePath,"*", SearchOption.AllDirectories)) Directory.CreateDirectory(dirPath.Replace(sourcePath,destPath)); //Copyallthefiles&Replacesanyfileswiththesamename foreach(stringnewPathinDirectory.GetFiles(sourcePath,"*.*", SearchOption.AllDirectories)) File.Copy(newPath,newPath.Replace(sourcePath,destPath),true); }复制  

  • 连接局域网mysql数据库

    1、先确认mysql服务端端口在防火墙是否开放外网连接(添加); windows防火墙》高级设置》入站规则》新建规则》选择端口》添加端口》后面直接下一步,输入名称提交。                              2、修改mysql数据库连接的权限并提交。 updateusersethost="%"whereuser="root"; flush privileges; 否则会报服务器拒绝连接“      

相关推荐

推荐阅读