文章目录
- Elasticsearch介绍
-
- 优势
- 全文检索
-
- Lucene词汇表和架构
- 使用案例
- 对比Elasticsearch和Solr
- 对比Elasticsearch和splunk
- JSON
- ES基础
-
- ES结构的主要特征
- 数据架构的主要概念
- Elasticsearch主要概念
- 建立和搜索索引
- ES关系数据库(`RDBMS`)对比
- 分词器
- HTTP协议
- Elasticsearch安装
-
- 下载`7.8.1`版本
-
- 集群部署
- ==安装报错==
- 创建用户
- ES安装
-
- 集群安装
- 管理
- 注意事项
-
- es不能使用root用户运行
- 错误:索引文件数量限制:
- bind错误
- 发送信息给master失败
- 插件安装
-
- ES-HEAD
- ES-SQL
- cerebro
- 安装kibana
-
- 安装7.8.1
- 安装中文分词器
-
- docker安装ik分词器
- 测试
- 对比分词效果
- 报错
- ES部署事项
-
- **选择服务器配置**
- 关闭swap
- 角色隔离和脑裂
- 分片配置
- 索引
-
- ES索引
-
- 分片和副本
- 创建索引
- 映射配置
-
- 类型确定机制
- 索引和结构映射
- index template
-
- 索引模板是什么?
-
- 索引模板中的内容
- 使用索引模板
- 创建索引模板
- 用模板创建索引
- 查看索引模板
- 删除索引模板
- 使用keyword类型
- ==倒排索引==
- 删除索引
-
- 删除索引中的数据
- RESTful API
-
- 基本介绍
- cat apis
-
- verbose
- help
- `headers`
- numeric formats
- reposne as text,json,smile,yaml or cbor
- sort
- 参数
- Index APIs
-
- create index
- Delete index
- Get Index
- Index exists
- Close Index
- Open Index
- Shrink Index
- Cluster APIs
-
- Cluster State API
- Cluster update settins api
- pending_tasks
- Task management API
- Nodes stats API
- document APIs
- Search APIs
- stats索引统计API
- 状态API
- 搜索数据
-
- 搜索请求共有的基本结构
- 结构搜索请求
-
- 确定搜索范围
- 基本模块的搜索请求
-
- 开始和页面大小的结果
- 基于URL的搜索请求
- 基于主体的搜索请求
- 理解复合结构
- 介绍查询和过滤器DSL
-
- match查询和term过滤器
- bool查询
- 去重查询
- 返回重内容
- 搜索案例
-
- 分组统计
- 搜索1万多条数据
- 问题处理
-
- 启动报错
- gc
-
- gc频繁
- 分片
-
- unassigned shards根本原因
- api
-
- `_doc`
- `relationship_type`
- 设置分片副本
- 超过磁盘写入上限,不能写入
- 性能优化
- ES迁移
-
- 迁移方法
- 集群内迁移
- snapshot
- ES-SQL
-
- 查询
-
- group by
使用场景
-
- 删除索引
- 参考链接:http://www.itxm.cn/post/8887.html
Elasticsearch介绍
优势
- 高可用
- 海量数据搜索、PB级
- 便于扩展,可以很方便增加一个节点
- 实时的,延时低于1ms
全文检索
Lucene词汇表和架构
- : 索引和搜索时的主要数据载体,包含一个或多个现存有数据的字段
- : 文档的一部分,包含名称和值两部分
- : 一个搜索单元,表示文本中得一个单词
- : 表示在字段中出现词得属性,又词得
使用案例
- Github
- 维基百科
- 百度
对比Elasticsearch和Solr
- Solr利用zookeeper分布式管理,Elasticsearch自带分布式协调管理能力
- Solr支持更多的数据,ES仅支持json
- Solr官方提供的功能更多,es有很多第三方插件
- Solr在传统的搜索应用好于es,es处理实时应用搜索效率更好
对比Elasticsearch和splunk
JSON
- JSON(
JavaScript Object Notation)是一种轻量级的数据交换格式,不仅易于人们阅读和编写 - json基本数据类型
- :有符号的十进制数字,可能包含小数部分,也可能使用指数E表示法,但不能包括非数字,如NaN。该格式不区分整数和浮点数。
- :0个或多个Unicode字符的序列。字符串用双引号分隔,并支持反斜杠转义语法。
- :为true或false的任一值。
- :0个或多个值的有序列表,每个值可以是任何类型。数组使用方括号符号,元素以逗号分隔。
- :名称/值对的无序集合,其中名称(也称为键)是字符串。由于对象旨在表示关联数组,推荐每个键在对象内是唯一的。对象用大括号分隔,并使用逗号分隔每对,而在每一对中,用冒号(:)将键或名称与其值分隔开
- :一个空值,使用单词null
ES基础
-
ES把,数据就可以采用XML和JSON格式表示成可读的形式
-
使用
RESTFul API隐藏Lucene的复杂性 -
Lucene是由一个Java语言开发的开源全文检索引擎工具包。把Lucene用Netty封装成服务,使用JSON访问就是Elasticsearch,底层是Luecen
-
,所以相对Solr来说,不需要额外安装ZooKeeper,其更容易分布式部署
-
搜索系统整体架构

ES结构主要特征
- 每一个运行的实例称之为一个,可以在同一台计算机上运行多个实例,也可以在每台计算机上只运行一个实例
- 多个运行的可以组成一个,集群中存在一个动态选举出的一个,主节点宕机,会自动选出新的主节点,所以不存在单点故障
- 为了实现容错,Elasticsearch把分解为多个小的索引,每一个小的索引称之为==,每一个都可以有0到多个副本(
replicas),每一个副本==都是分片的完整复制品,这样提高了查询速度 - 通过**
Gateway网关读取所有的索引和元数据** - :内部节点或者集群客户端之间的交互方式,默认使用TCP协议进行交互,同时支持
HTTP协议(JSON格式)、Thrift,Servlet,Memcached,ZeroMQ等多种传输协议 - 支持多种扩展插件
数据架构的主要概念
-
- 逻辑数据的存储单元,相当于
RDBMS的数据库 - 其结构为快速有效的全文索引准备,不存储原始值
- ES把索引放在一台或多台服务器上
- 逻辑数据的存储单元,相当于
- 每个索引有一个多个分片(
Shards),每个分片可以有多个副本(replica)
-
- 存储在ES中的主要实体,相当于
RDBMS中的一行记录 - 在文档中,相同字段必须有相同类型
- :文档由多个字段组成,每个字段多次出现在一个文档里
- 存储在ES中的主要实体,相当于
-
-
一个索引对象可以存储很多不同用途的对象
-
相当于Mysql中的表
-
-
- ES在映射中存储有关字段的信息,每一个文档类型都有自己的映射
Elasticsearch主要概念
-
节点和集群
-
分片
- :解决遇到大量文档时,内存限制、硬盘能力、处理能力不足、无法快速响应,可以把数据拆分成
shard,存放在不同节点上,其中每个分片都是一个独立的索引, - 查询的索引分布在多个**
分片**上,ES会把查询发送给每个相关的分片,并将结果合并在一起 - 应用程序并不知道分片的存在,多个分片可以
- :解决遇到大量文档时,内存限制、硬盘能力、处理能力不足、无法快速响应,可以把数据拆分成
-
- :为了提高查询吞吐量和实现可用性
replica是一个分片的精确复制,每个分片有零个或多个副本- :被动选择更改索引操作,其余成为
- 主分片丢失,该分片数据在集群不可用,集群将提升副本为新的主分片
-
Query DSL
- 查询语言
索引建立和搜索
-
Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中
-
执行搜索请求
ES与关系型数据库(RDBMS)对比
| Elasticsearch | RDBMS |
|---|---|
| Cluster | Database |
| Shard | Shard |
| Index | table |
| Field | Column |
| Documnet | Row |
分词器
-
从一串文本切分出一个一个的词条,对词条进行标准化
-
包括三部分
character filter: 分词前的预处理,过滤HTML标签,特俗符号转换- tokenzier:分词
- token filter:标准化
-
内置分词器
HTTP协议
- 客户端发起一个到服务器指定端口的http请求,服务器端按指定格式返回网页或者其他网络资源
-
URL
Elasticsearch安装
下载7.8.1版本
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.8.1-linux-x86_64.tar.gz
cd elasticsearch-7.8.1/ ll
集群部署
# 设置集群名称,集群内所有节点的名称必须一致。 cluster.name: es # 设置节点名称,集群内节点名称必须唯一。 node.name: es-node1 # 表示该节点会不会作为主节点,true表示会;false表示不会 node.master: true # 当前节点是否用于存储数据,是:true、否:false node.data: true # 索引数据存放的位置 path.data: /opt/elasticsearch-7.8.1/data # 日志文件存放的位置 path.logs: /opt/elasticsearch-7.8.1/logs # 需求锁住物理内存,是:true、否:false bootstrap.memory_lock: true # 监听地址,用于访问该es network.host: node1 # es对外提供的http端口,默认 9200 http.port: 9200 # TCP的默认监听端口,默认 9300 transport.tcp.port: 9300 # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4) discovery.zen.minimum_master_nodes: 2 # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点 discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"] discovery.zen.fd.ping_timeout: 1m discovery.zen.fd.ping_retries: 5 # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"] # 是否支持跨域,是:true,在使用head插件时需要此配置 http.cors.enabled: true # “*” 表示支持所有域名 http.cors.allow-origin: "*" action.destructive_requires_name: true action.auto_create_index: .security,.monitoring*,.watches,.triggered_watches,.watcher-history* xpack.security.enabled: false xpack.monitoring.enabled: true xpack.graph.enabled: false xpack.watcher.enabled: false xpack.ml.enabled: false
安装报错
[2020-08-17T05:53:23,496][WARN ][o.e.c.c.ClusterFormationFailureHelper] [es-node1] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [node1] to bootstrap a cluster: have discovered [{
es-node1}{
D73-QBgpTp-Q7RgailBDiQ}{
o83R1VLyQZWcs8lAG9o1Ug}{
node1}{
192.168.199.137:9300}{
dimrt}{
xpack.installed=true, transform.node=true}, {
es-node2}{
LghG7C8pRoamT1h9GYBtRA}{
CskX0v3wTwGvUNNSp3Rg2A}{
node2}{
192.168.199.138:9300}{
dimrt}{
xpack.installed=true, transform.node=true}, {
es-node3}{
BPDEwYozS4OWGkQGED-P2w}{
toxtMJHXT1SOSmDUYz_tjg}{
node3}{
192.168.199.139:9300}{
dimrt}{
xpack.installed=true, transform.node=true}]; discovery will continue using [192.168.199.138:9300, 192.168.199.139:9300] from hosts providers and [{
es-node1}{
D73-QBgpTp-Q7RgailBDiQ}{
o83R1VLyQZWcs8lAG9o1Ug}{
node1}{
192.168.199.137:9300}{
dimrt}{
xpack.installed=true, transform.node=true}] from last-known cluster state; node term 0, last-accepted version 0 in term 0
- 解决方法
- 修改
cluster.initial_master_nodes为es的node.name,不是服务器名称
- 修改
java.lang.IllegalStateException: transport not ready yet to handle incoming requests
无需处理
创建用户
[root@es1 ~]# adduser es
为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略:
[root@es1 ~]# passwd es
更改用户 es 的密码 。
新的 密码:1q23lyc$%
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
-
赋予用户权限
在root用户 vi /etc/sudoers 添加 : USERNAME ALL=(ALL) ALL 以下配置可以给sudo权限免密 添加 : USERNAME ALL=(ALL) NOPASSWD:ALL
ES安装
-
目录结构
-
配置
elasticsearch.yml- 负责设置服务器的默认配置
- 有两个值不能在运行时更改,分别是
cluster.name和node.name
logging.yml- 定义了多少信息写入系统日志,定义了日志文件,并定期创建新文件
- 只有在调整监控、备份方案或系统调试时,才需要修改
- 系统限制打开的文件描述符:32000个,一般在
/etc/security/limits.conf中修改,当前的值可以用ulimit命令来查看。如果达到极限,Elasticsearch将无法创建新的文件,所以合并会失败,索引会失败, 新的索引无法创建。
- :默认内存(1024M)
- 志文件中发现
OutOfMemoryError异常的条目,把 ES_HEAP_SIZE 变量设置到大于1024 - 当选择分配给JVM的合适内存大小时,记住,通常不应该分配超过50%的系统总内存
- 志文件中发现
集群安装
-
修改配置文件
$ vim /opt/elasticsearch/elasticsearch5.6.5/config/elasticsearch.yml cluster.name: es (集群名称,同一集群要一样) node.name: es-node1 (节点名称,同一集群要不一样) http.port: 9200 #连接端口 network.host: node1 #默认网络连接地址,写当前主机的静态IP,这里不能写127.0.0.1 path.data: /opt/elasticsearch/data #数据文件存储路径 path.logs: /opt/elasticsearch/logs #log文件存储路径 discovery.zen.ping.unicast.hosts: ["node1","node2","node3"]#集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。 bootstrap.memory_lock: true bootstrap.system_call_filter: false # 因centos6不支持SecComp而默认bootstrap.system_call_filter为true进行检测,所以,要设置为 false。注:SecComp为secure computing mode简写 http.cors.enabled: true #是否支持跨域,默认为false http.cors.allow-origin: "*" #当设置允许跨域,默认为*,表示支持所有域名 discovery.zen.minimum_master_nodes: 2 #这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4) -
elasticsearch备份位置,路径要手动创建
path.repo: ["/opt/elasticsearch/elasticseaarch-5.6.3/data/backups"] -
如果安装elasticsearch-head插件,需要添加以下选项
http.cors.enabled: true http.cors.allow-origin: "*" -
如果安装x-pack插件,我们取消他的basic认证,需要添加以下选项
xpack.security.enabled: false -
修改jvm内存[这个配置项很重要,在现实生产中要配的大一些,但是最大不能超过32g]
vim config/jvm.options -Xms2g ---> -Xms512m -Xmx2g ---> -Xms512m
管理
- 启动与关闭
每一台设备都要单独启动
前台启动
$ ./elasticsearch
后台启动 -d为守护进程运行
$ ./elasticsearch –d
$ ./elasticsearch & # 使用这种方式他会打印日志在前台
-
查看进程
$ jps 2369 Elasticsearch -
验证是否安装成功
注意事项
es不能使用root用户运行
[2020-07-25T00:44:08,878][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es-node1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:85) ~[elasticsearch-6.1.1.jar:6.1.1]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:104) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:171) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:322) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-6.1.1.jar:6.1.1]
... 6 more
错误:索引文件个数限制
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
-
解决方法
vim /etc/security/limits.conf #在最后添加 * soft nofile 65536 * hard nofile 131072vi /etc/sysctl.conf vm.max_map_count=655360- 执行:
sysctl -p
- 执行:
bind错误
org.elasticsearch.bootstrap.StartupException: BindTransportException[Failed to bind to [9300-9400]]; nested: BindException[Cannot assign requested address];
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.1.1.jar:6.1.1]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-6.1.1.jar:6.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:85) ~[elasticsearch-6.1.1.jar:6.1.1]
- 解决:
发送信息给master失败
[2020-07-25T02:00:20,423][INFO ][o.e.d.z.ZenDiscovery ] [es-node2] failed to send join request to master [{
es-node1}{
Jqt6xka3Q6e_HM7HP7eazQ}{
h6izGMXsQWWW8bOWfr-3_g}{
node1}{
192.168.199.137:9300}], reason [RemoteTransportException[[es-node1][192.168.199.137:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {
es-node2}{
Jqt6xka3Q6e_HM7HP7eazQ}{
G5EKFO-WR0yZY5gbIKnDDA}{
node2}{
192.168.199.138:9300}, found existing node {
es-node1}{
Jqt6xka3Q6e_HM7HP7eazQ}{
h6izGMXsQWWW8bOWfr-3_g}{
node1}{
192.168.199.137:9300} with the same id but is a different node instance]; ]
-
原因:是因为复制的elasticsearch文件夹下包含了data文件中示例一的节点数据,需要把示例二data文件下的文件清空
-
解决方法:删除es集群data数据库文件夹下所有文件即可
插件安装
ES-HEAD
-
安装nodejs
mkdir /opt/nodejs wget https://nodejs.org/dist/v10.15.2/node-v10.15.2-linux-x64.tar.xz # 解压 tar -xf node-v10.15.2-linux-x64.tar.xz # 创建软链接 /opt/nodejs/node-v10.15.2-linux-x64 #配置path环境变量 vi ~/.bash_profile export NODE_HOME=/opt/nodejs/node-v10.15.2-linux-x64 export PATH=$PATH:$NODE_HOME/bin source ~/.bash_profile # 执行 node -v 验证安装 -
yum install git npm -
克隆git项目,切换head目录启动head插件
git clone https://github.com/mobz/elasticsearch-head.git cd elasticsearch-head/ ls npm install # 报错,执行 npm install phantomjs-prebuilt@2.1.16 --ignore-scripts nohup npm run start & -
安装成功
-
使用技巧
- 参考链接:
https://blog.csdn.net/bsh_csn/article/details/53908406
- 参考链接:
ES-SQL
# 下载链接
https://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.1.0/es-sql-site-standalone.zip
# 切换到解压目录中的site-server
npm install express --save
#site-server/site_configuration.json配置文件中修改启动服务的端口
#重启es,再启动es-sql前端
node node-server.js &
# 更新
npm install -g npm
#docker安装
docker run -d --name elasticsearch-sql -p 9680:8080 -p 9700:9300 -p 9600:9200 851279676/es-sql:6.6.2
cerebro
#可以选择rpm安装或者源码包安装:
#我这里为了方便快捷直接使用rpm
wget https://github.com/lmenezes/cerebro/releases/download/v0.8.5/cerebro-0.8.5-1.noarch.rpm
#安装:
rpm -ivh cerebro-0.8.5-1.noarch.rpm
#配置
rpm -ql cerebro-0.8.5-1
#可以看到配置文件
/usr/share/cerebro/conf/application.conf
#日志文件:
/var/log/cerebro
#配置:
#可以指定配置参数启动:
bin/cerebro -Dhttp.port=1234 -Dhttp.address=127.0.0.1
#可以指定配置文件启动:
启动:
bin/cerebro -Dconfig.file=/some/other/dir/alternate.conf
配置:
# vim /usr/share/cerebro/conf/application.conf
# A list of known hosts
hosts = [
{
host = "http://192.168.8.102:9200"
name = "ES Cluster"
# headers-whitelist = [ "x-proxy-user", "x-proxy-roles", "X-Forwarded-For" ]
#}
# Example of host with authentication
#{
# host = "http://some-authenticated-host:9200"
# name = "Secured Cluster"
# auth = {
# username = "username"
# password = "secret-password"
# }
}
]
cerebro的启动 状态查看和关闭:
# systemctl stop cerebro
# systemctl start cerebro
# systemctl status cerebro
● cerebro.service - Elasticsearch web admin tool
Loaded: loaded (/usr/lib/systemd/system/cerebro.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-12-12 14:36:39 CST; 6s ago
Process: 11484 ExecStartPre=/bin/chmod 755 /run/cerebro (code=exited, status=0/SUCCESS)
为了便于问题排除可以直接使用命令启动cerebro:
# /usr/bin/cerebro
默认启动的:
[info] play.api.Play - Application started (Prod) (no global state)
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
允许网络范围内的任意主机登陆访问:
登陆:
node1:9000
安装kibana
vi /kibana/config/kibana.yaml
server.host: "node3"
elasticsearch.url: "http://node3:9200"
# 配置防火墙5601端口
# 启动
./kibana -d
安装7.8.1
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz
curl https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz.sha512 | shasum -a 512 -c -
tar -xzf kibana-7.8.1-linux-x86_64.tar.gz
cd kibana-7.8.1-linux-x86_64/
安装中文分词器
-
常用的分词器有 standard、keyword、whitespace、pattern等。
-
standard 分词器将字符串分割成单独的字词,删除大部分标点符号。keyword 分词器输出和它接收到的相同的字符串,不做任何分词处理。whitespace 分词器只通过空格俩分割文本。pattern 分词器可以通过正则表达式来分割文本。最常用的一般为 standard 分词器。
更多的分词器详见官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/analysis-standard-tokenizer.html
-
下载中文分词器:https://github.com/medcl/elasticsearch-analysis-ik
-
解压
-
进入elasticsearch-analysis-ik-master/,编译源码
mvn clean install -Dmaven.test.skip=true -
在es的plugins文件夹下创建目录ik
-
将编译后的
/src/elasticsearch-analysis-ik-master/target/releases/elasticsearch-analysis-ik-7.4.0.zip移到/opt/elasticsearch/plugins/目录下 -
执行/.elasticsearch能够正常运行就说明成功了
git clone https://github.com/medcl/elasticsearch-analysis-ik cd elasticsearch-analysis-ik #git checkout tags/{version} git checkout { v6.1.1} mvn clean mvn compile mvn package
docker安装ik分词器
../bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.2/elasticsearch-analysis-ik-6.6.2.zip
- 安装成功之后,进行重启
docker restart container-id
测试
-
创建index
curl -XPUT http://localhost:9200/chinese -
create a mapping
curl -XPOST http://192.168.199.137:9200/chinese/fulltext/_mapping -H 'Content-Type:application/json' -d' { "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" } } }' -
index some docs
curl -XPOST localhost:9200/chinese/fulltext/1 -H 'Content-Type:application/json' -d' {"content":"美国留给伊拉克的是个烂摊子吗"} ' curl -XPOST http://localhost:node1/index/_create/2 -H 'Content-Type:application/json' -d' {"content":"公安部:各地校车将享最高路权"} ' curl -XPOST http://localhost:node1/index/_create/3 -H 'Content-Type:application/json' -d' {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"} ' curl -XPOST http://localhost:node1/index/_create/4 -H 'Content-Type:application/json' -d' {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"} ' -
最细粒度拆分
curl -XPOST node2:9200/chinses/ -H 'Content-Type:application/json' -d' { "text": ["中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"], "tokenizer": "ik_max_word" } ' -
ik_smart: 会做最粗粒度的拆分
-
qury with highlighting
curl -XPOST node1:9200/chinese/_search -H 'Content-Type:application/json' -d' { "query" : { "match" : { "content" : "中国" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } } } '
分词效果对比
curl -XPUT http://192.168.199.137:9200/ik_test
curl -XPUT http://192.168.199.137:9200/ik_test_1
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/_mapping -H 'Content-Type:application/json'-d' { "fulltext": { "_all": { "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "term_vector": "no", "store": "false" }, "properties": { "content": { "type": "string", "store": "no", "term_vector": "with_positions_offsets", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "include_in_all": "true", "boost": 8 } } } }'
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/1 -d' {"content":"美国留给伊拉克的是个烂摊子吗"} '
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/2 -d' {"content":"公安部:各地校车将享最高路权"} '
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/3 -d' {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"} '
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/4 -d' {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"} '
curl -XPOST http://192.168.199.137:9200/ik_test_1/fulltext/1 -d' {"content":"美国留给伊拉克的是个烂摊子吗"} '
curl -XPOST http://192.168.199.137:9200/ik_test_1/fulltext/2 -d' {"content":"公安部:各地校车将享最高路权"} '
curl -XPOST http://192.168.199.137:9200/ik_test_1/fulltext/3 -d' {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"} '
curl -XPOST http://192.168.199.137:9200/ik_test_1/fulltext/4 -d' {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"} '
curl -XPOST http://192.168.199.137:9200/ik_test/fulltext/_search?pretty -d'{ "query" : { "match" : { "content" : "洛杉矶领事馆" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } } }'
7curl -XPOST http://192.168.199.137:9200/ik_test_1/fulltext/_search?pretty -d'{ "query" : { "match" : { "content" : "洛杉矶领事馆" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } } }'
报错
#报错