## 1. Elasticsearch基本介绍

官网:https://www.elastic.co/cn

Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,

无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。

Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。

不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 实时分析的分布式搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

1.1 索引结构

下图是ElasticSearch的索引结构,下边黑色部分是物理结构,上边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。

逻辑结构部分是一个倒排索引表

1、将要搜索的文档内容分词,所有不重复的词组成分词列表。

2、将搜索的文档最终以Document方式存储起来。

3、每个词和docment都有关联。

如下:

现在,如果我们想搜索quick brown,我们只需要查找包含每个词条的文档:

两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单相似性算法,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

2. Elasticsearch安装与配置

下载地址:https://www.elastic.co/cn/downloads/elasticsearch

我这里安装在Linux下,下载了tar包,解压结构如下:

2.1 配置:

首先我们需要对配置文件进行修改,修改config/elasticsearch.yml配置如下:

# 集群名称
cluster.name: test
# 节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
node.name: test_1
# 允许访问的地址, 0.0.0.0 代表全部
network.host: 0.0.0.0
# 对外开放ip
http.port: 9200
# 集群结点之间通信端口
transport.tcp.port: 9300
# 指定该节点是否有资格被选举成为master结点,默认是true
node.master: true
# 是否是存储节点
node.data: true
# 初始的master节点
cluster.initial_master_nodes: ["test_1"]
# 设置为true可以锁住ES使用的内存,避免内存与swap分区交换数据
bootstrap.memory_lock: false
# 本机不支持SecComp,需要设置为false
bootstrap.system_call_filter: false
# 单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1.
node.max_local_storage_nodes: 1
# 数据路径
path.data: /home/app/server/elasticsearch-7.15.1/data
# log路径
path.logs: /home/app/server/elasticsearch-7.15.1/logs
#开启跨域访问
http.cors.enabled: true
http.cors.allow-origin: /.*/

如果需要调节运行的JVM参数,可以修改config/jvm.options文件,例如内存大小:

-Xms1024m
-Xmx1024m

2.2 启动:

启动脚本为 bin/elasticsearch 文件,在命令行执行就可

es为了系统安全,禁止使用root用户运行,如果使用root用户运行,会报如下错误:

org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:171) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:158) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:114) ~[elasticsearch-cli-7.15.1.jar:7.15.1]
at org.elasticsearch.cli.Command.main(Command.java:79) ~[elasticsearch-cli-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:123) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81) ~[elasticsearch-7.15.1.jar:7.15.1]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:399) ~[elasticsearch-7.15.1.jar:7.15.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:167) ~[elasticsearch-7.15.1.jar:7.15.1]
... 6 more
uncaught exception in thread [main]
java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:399)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:167)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:158)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:114)
at org.elasticsearch.cli.Command.main(Command.java:79)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:123)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)
For complete error details, refer to the log at /home/app/server/elasticsearch-7.15.1/logs/test.log

可以自建一个普通用户,并授权此es目录的访问权限,并切换到此用户,再执行

正常情况此时就可以启动成功, 没有错误日志, 访问127.0.0.1:9200,即可看到如下信息:

{
"name" : "test_1",
"cluster_name" : "test",
"cluster_uuid" : "7KnzF-4MTuSCC37tMUvF0A",
"version" : {
"number" : "7.15.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
"build_date" : "2021-10-07T21:56:19.031608185Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

但是,也有可能会出现错误,导致运行失败,例如下:

ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max number of threads [1024] for user [xjw] is too low, increase to at least [4096]

我这里显示为,需要调整linux系统的最大文件句柄数和用户的线程数, 可以使用ulimit -a 查看:

[xjw@localhost bin]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31831
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

对应调整一下参数即可,网上有很多解决方法,. 如果出现其他错误,也一样

2.3 head插件安装

head插件是ES的一个简单可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等,head的项目地址在https://github.com/mobz/elasticsearch-head , 此项目是个前端项目,安装需要下载node.js,可以自行安装,

它的访问方式主要就是自动封装对Es操作的HTTP请求:

例如: 当使用此工具进行搜索匹配时, 访问的接口就是,9200 端口服务的地址,

请求参数也是普通的请求参数:

{
"query": {
"bool": {
"must": [{
"match_all": {}
}],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}

2.4 安装kibana

Elasticsearch 是 对Lucene 的封装,并对外提供http接口,

而kibana,则对 Elasticsearch 数据进行可视化,并让你在 Elastic Stack 中进行导航。您可以进行各种操作,从跟踪查询负载, 是Elasticsearch 的配套产品

这里我主要把kibana作为操作ES 的客户端,

安装地址:https://www.elastic.co/downloads/kibana, 下载和ES对应的版本

解压目录:

如果Kibana和ES在同一系统下,则无需任何配置, 直接启动即可,启动脚本:bin/kibana ,同样需要使用自建用户启动, 默认自动连接ES地址:127.0.0.1:9200, 启动成功,访问地址:127.0.0.1:5601

同样,我们也可以修改config/kibana.yml文件进行修改配置:

#服务的端口配置,默认5601
server.port: 5601
# ES地址,默认[ "http://localhost:9200" ],必须是同一集群下的
elasticsearch.hosts: [ "http://localhost:9200" ]
#es用户名密码
elasticsearch.username: user
elasticsearch.password: password

3. es的相关概念

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:

{
"name" : "jack",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}

Elasticsearch可以看成是一个数据库,只是和关系型数据库比起来数据格式和功能不一样而已

1.1 索引index

文档存储的地方,类似于MySQL数据库中的数据库概念

1.2 类型 type

如果按照关系型数据库中的对应关系,还应该有的概念。ES中没有的概念,这是ES和数据库的一个区别,在我们建立索引之后,可以直接往 索引 中写入文档

在6.0版本之前,ES中有Type的概念,可以理解成关系型数据库中的但是官方说这是一个设计上的失误,所以在6.0版本之后Type就被废弃了。

1.3 字段Field

相当于是数据表的字段,字段在ES中可以理解为JSON数据的键,下面的JSON数据中,name 就是一个字段。

{
"name":"jack"
}

1.4 映射 mapping

映射 是对文档中每个字段的类型进行定义,每一种数据类型都有对应的使用场景。

每个文档都有映射,我们可以手动指定某个索引的映射.

也可以不需要显示的创建映射,因为ES中实现了动态映射

我们在索引中写入一个下面的JSON文档,在动态映射的作用下,name会映射成text类型,age会映射成long类型。

{
"name":"jack",
"age":18,
}

自动判断的规则如下:

1.4.1 text类型

analyzer属性

通过analyzer属性指定分词器。

下边指定name的字段类型为text,使用ik分词器的ik_max_word分词模式。

"name": {
       "type": "text",
        "analyzer":"ik_max_word"
}

index属性

通过index属性指定是否索引。

默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。(只存储,不作为搜索条件)

但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置为false。

store属性

是否在source之外存储,每个文档索引后会在 ES中保存一份原始文档,存放在"_source"中,一般情况下不需要设置store为true,因为在_source中已经有一份原始文档了。

1.4.2 keyword类型

上边介绍的 text文本字段在映射时要设置分词器(不设置有默认的英文分词器),keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。

1.4.3 date日期类型

日期类型不用设置分词器。

通常日期类型的字段用于排序。

通过format设置日期格式。

例子:

下边的设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。

{
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy‐MM‐ddHH:mm:ss||yyyy‐MM‐dd"
}
}
}

1.4.4 数值类型

下边是ES支持的数值类型

类型 范围
long 一个有符号的 64 位整数,最小值为: -2^63, 最大值为: 2^63 - 1
integer 一个有符号的 32 位整数,最小值为: -2^31最大值为: 2^31 - 1
short 一个有符号的 16 位整数,最小值为-32,768,最大值为32,767
byte 一个有符号的 8 位整数,最小值为-128,最大值为127
double 双精度 64 位 IEEE 754 浮点数
float 单精度 32 位 IEEE 754 浮点数
half_float 半精度 16 位 IEEE 754 浮点数
scaled_float 带有缩放因子的缩放类型浮点数
unsigned_long 一个无符号的 64 位整数,最小值为 0,最大值为。 2^64 - 1

尽量选择范围小的类型,提高搜索效率

1.5 文档 document

文档在ES中相当于传统数据库中的行的概念,ES中的数据都以JSON的形式来表示,在MySQL中插入一行数据和ES中插入一个JSON文档是一个意思。下面的JSON数据表示,一个包含3个字段的文档。

{
"name":"jack",
"age":18,
"gender":1
}

一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:

节点 说明
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识

4. ElasticSearch的客户端基本操作

因为ElasticSearch 对外开发HTTP, 所以在开发中,主要有四种方式可以作为elasticsearch服务的客户端:

  • 第一种,elasticsearch-head插件
  • 第二种,使用elasticsearch提供的Restful接口直接访问
  • 第三种,使用Kibana提供的工具进行访问
  • 第四种,使用例如Java提供的API进行访问

下面我们使用第二种方式进行简单的操作演示,后续全部使用简单的Kibana访问方式

2.1. 索引操作

索引创建:

向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/course , 创建名为course的索引

响应:

{
"acknowledged": true,//响应结果
"shards_acknowledged": true,//分片结果
"index": "course"//索引名称
}

重复发送,返回错误信息,索引存在

{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [course/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
"index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
"index": "course"
}
],
"type": "resource_already_exists_exception",
"reason": "index [course/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
"index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
"index": "course"
},
"status": 400
}

查看索引:

ES 服务器发 GET 请求 : http://127.0.0.1:9200/_cat/indices?v

这里请求路径中的_cat 表示查看的意思,indices 表示索引,所以整体含义就是查看当前 ES 服务器中的所有索引,就好像 MySQL 中的 show tables 的感觉,服务器响应结果如下

响应结果如下:

health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open course J0WlEhh4R7aDrfIc3AkwWQ 1 1 0 0 208b 208b

每个字段的含义:

表头 含义
health 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status 索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副本数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小

查看单个索引

在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/course

响应结果如下:

{
"course": {//索引名
"aliases": {},//别名
"mappings": {},//映射
"settings": {//设置
"index": {//设置 - 索引
"creation_date": "1617861426847",//设置 - 索引 - 创建时间
"number_of_shards": "1",//设置 - 索引 - 主分片数量
"number_of_replicas": "1",//设置 - 索引 - 主分片数量
"uuid": "J0WlEhh4R7aDrfIc3AkwWQ",//设置 - 索引 - 主分片数量
"version": {//设置 - 索引 - 主分片数量
"created": "7080099"
},
"provided_name": "course"//设置 - 索引 - 主分片数量
}
}
}
}

删除索引

在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/course

返回结果如下:

{
"acknowledged": true
}

2.2 映射操作

我们要把课程信息存储到ES中,这里我们创建课程信息的映射,先来一个简单的映射,如下:

创建映射

发送:post http://localhost:9200/索引库名称/类型名称/_mapping

post 请求:http://localhost:9200/course/_mapping

请求参数:

{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}

查询所有索引的映射:

GET: http://localhost:9200/_mapping

更新映射

映射创建成功可以添加新字段,已有字段不允许更新。

删除映射

通过删除索引来删除映射。

2.3 文档操作

ES中的文档相当于MySQL数据库表中的记录。

创建文档

向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/course/_doc,请求体JSON内容为

{
"name": "Bootstrap开发框架",
"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。此开发框架包含了大量的CSS、 JS程序代码, 可以帮助开发者( 尤其是不擅长页面开发的程序人员) 轻松的实现一个不受浏览器限制的精美界面效果",
"studymodel": "201001"
}

注意,此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误 。

返回结果:

{
"_index": "course",//索引
"_type": "_doc",//类型-文档
"_id": "ANQqsHgBaKNfVnMbhZYU",//唯一标识,可以类比为 MySQL 中的主键,随机生成
"_version": 1,//版本
"result": "created",//结果,这里的 create 表示创建成功
"_shards": {//
"total": 2,//分片 - 总数
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下, ES 服务器会随机生成一个。

如果想要自定义唯一性标识,需要在创建时指定: http://127.0.0.1:9200/course/_doc/1

返回结果如下:

{
"_index": "course",
"_type": "_doc",
"_id": "1",//<------------------自定义唯一性标识
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}

此处需要注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT。

根据id查询

GET http://127.0.0.1:9200/course/_doc/1 1则为id号

查看索引下所有数据

向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/course/_search

根据条件查询

向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/course/_search

请求体:

{
'query':{
'terms':{
'name':"Bootstrap开发框架"
}
}
}

以上代表精确查询name为Bootstrap开发框架 字串的数据

分析上边查询的结果json:

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [{
"_index": "test",
"_type": "doc",
"_id": "4028e58161bcf7f40161bcf8b77c0000",
"_score": 0.2876821,
"_source": {
"name": "Bootstrap开发框架",
"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。 此开发框架包含了大量的CSS、 JS程序代码, 可以帮助开发者( 尤其是不擅长页面开发的程序人员) 轻松的实现一个不受浏览器限制的精美界面效果 ",
"studymodel": "201001"
}
}]
}
}

took:本次操作花费的时间,单位为毫秒。

timed_out:请求是否超时

_shards:说明本次操作共搜索了哪些分片

hits:搜索命中的记录

hits.total : 符合条件的文档总数

hits.hits :匹配度较高的前N个文档

hits.max_score:文档匹配得分,这里为最高分

_score:每个文档都有一个匹配度得分,按照降序排列。

_source:显示了文档的原始内容。

修改字段

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/course/_doc/1

请求体JSON内容为:

{
"name": "Bootstrap开发框架_修改",
"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。 此开发框架包含了大量的CSS、 JS程序代码, 可以帮助开发者( 尤其是不擅长页面开发的程序人员) 轻松的实现一个不受浏览器限制的精美界面效果_修改",
"studymodel": "201001_修改"
}

修改成功后,服务器响应结果:

{
"_index": "course",
"_type": "_doc",
"_id": "1",
"_version": 2,
"result": "updated",//<-----------updated 表示数据被更新
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}

局部修改:

修改数据时,也可以只修改某一给条数据的局部信息

在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/course/_update/1。

请求体JSON内容为:

{
"doc": {
"name": "Bootstrap开发框架_局部修改"
}
}

删除

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。

在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/course/_doc/1

5. 安装IK分词器

前文说到,es中的搜索模式为倒排索引, 所以每个索引库都对应着其每个的词库,这些词库产生于元数据,并和原文关联,

所以在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终找到词关联的文档。

测试当前索引库使用的默认分词器:

post 发送:localhost:9200/_analyze

json请求体:

{"text":"测试分词器,后边是测试内容:spring cloud实战"}

结果如下:

会发现分词的效果将 “测试” 这个词拆分成两个单字“测”和“试”这是因为当前索引库使用的分词器对中文就是单字分词。默认对英文可以根据空格分词,

如果不作处理,则此字段中,在索引词库中存放的就是单个字, 用户无法根据词语进行搜索关联到,只能根据 测``试 等单个字进行搜索, 若使用测试 或者内容 等这种有实际意义的词,是搜索不到的,所以我们需要下载一个插件.来支持中文的分词

安装IK分词器

使用IK分词器可以实现对中文分词的效果。

下载IK分词器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik) 下载zip:

解压,并将解压的文件拷贝到ES安装目录的plugins下的ik目录下

测试分词效果:

发送:post localhost:9200/_analyze , 并指定分词器

{"text":"测试分词器,后边是测试内容:spring cloud实战","analyzer":"ik_max_word" }

结果:

两种分词模式

ik分词器有两种分词模式:ik_max_word和ik_smart模式。

1、ik_max_word 会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、 华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。

2、ik_smart 会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

自定义词库

如果要让分词器支持一些专有词语,可以自定义词库。

iK分词器自带一个main.dic的文件,此文件为词库文件。

在上边的目录中新建一个my.dic文件(注意文件格式为utf-8(不要选择utf-8 BOM))

可以在其中自定义词汇: 比如定义: 配置文件中配置my.dic,

重启ES,测试分词效果:

发送:post localhost:9200/_analyze

{"text":"测试分词器,后边是测试内容:spring cloud实战","analyzer":"ik_max_word" }

一个并没有任何实际意义的词,这次就被作为一个完整的词语分割出来了

ElasticSearch基础介绍(1)的更多相关文章

  1. Elasticsearch 基础介绍

    # Elasticsearch简介 ## 基础概念 ​ Elasticsearch由Shay banon在2004年进行初步开发,并且在2010年2月发布第一个版本. ​ 此后Shay banon在2 ...

  2. ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程

    1.elasticsearch的结构 首先elasticsearch目前的结构为 /index/type/id  id对应的就是存储的文档ID,elasticsearch一般将数据以JSON格式存储. ...

  3. 搜索引擎框架之ElasticSearch基础详解(非原创)

    文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...

  4. 全文搜索引擎Elasticsearch详细介绍

    我们生活中的数据总体分为两种:结构化数据 和 非结构化数据. 结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理.指具有固 ...

  5. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  6. C++ 迭代器 基础介绍

    C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...

  7. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  8. Node.js 基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  9. 1、git基础介绍及远程/本地仓库、分支

    1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...

  10. git基础介绍

    git基础介绍 这是git操作的基础篇,是以前的写的操作文档,就没有进行手打,直接把图片贴进来了,你们担待哈,有不正确的地方可以指正出来,我将在第一时间去修改,多谢哈! 一.文件状态:git系统的文件 ...

随机推荐

  1. Fabric-ca server端与client端交互

    本文介绍Fabric-ca server端和client端的交互过程. 在server端执行Start()命令时,会调用registerHandlers()函数,其作用就是注册处理客户端请求的程序: ...

  2. Git - 关联远程仓库以及同时使用Lab和Hub

    更新一下,感觉有更简单的方式 就比如你git config 的 全局的name和email是lab的 那就clone github上的项目然后设置局部的name和email就行了 ********** ...

  3. layui之静态表格的分页及搜索功能以及前端使用XLSX导出Excel功能

    LayUI官方文档:https://layui.dev/docs/2/#introduce XLSX NPM地址:https://www.npmjs.com/package/xlsx XLSX 使用参 ...

  4. 事务提交之后再执行某些操作 → 引发对 TransactionSynchronizationManager 的探究

    开心一刻 昨晚,小妹跟我妈聊天 小妹:妈,跟你商量个事,我想换车,资助我点呀 妈:哎呀,你那分扣的攒一堆都够考清华的,还换车资助点,有车开就不错了 小妹:你要是这么逼我,别说哪天我去学人家傍大款啊 妈 ...

  5. NLP国内外大模型汇总列表[文心一言、智谱、百川、星火、通义千问、盘古等等]

    NLP国内外大模型汇总列表[文心一言.智谱.百川.星火.通义千问.盘古等等] 中国大模型列表大全,全面收集有明确来源的大模型情况,包括机构.来源信息和分类等,随时更新. Awesome family ...

  6. 8.5 CheckRemoteDebuggerPresent

    CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用.函数接收两个参数进程句柄和一个指向布尔值的指针.如果指定的进程正在被调试,则函数 ...

  7. 予力八六三软件应用现代化,提升DevSecOps效能,探索交付之路

    本文分享自华为云社区<予力八六三软件应用现代化,提升DevSecOps效能,探索全球交付之路>,作者: HuaweiCloudDeveloper. 来源:<华为云DTSE>期刊 ...

  8. Vulkan学习苦旅06:创建渲染通道(VkRenderPass)

    对于一个复杂的图形应用程序,需要多个过程的配合,以生成图像的各个部分.通常,各个过程间存在着依赖关系,例如某个过程生成的图像(输出)被另一个过程使用(作为此过程的输入).在Vulkan中,每个过程被称 ...

  9. Hadoop集群常用组件的命令

    1. Hadoop (1).HDFS:启动HDFS:start-dfs.sh关闭HDFS:stop-dfs.sh格式化NameNode:hdfs namenode -format查看文件系统状态:hd ...

  10. CF1499

    A 氵 B 如果 11 后出现了 00 就不行. C 枚举走几段. 横竖可以分开算. 一定是:除了费用最小的都是走长度 \(1\),费用最小的包揽剩下的. D \(c\cdot lcm(a,b)-d\ ...