1.1 ES定义
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
1.2 Lucene与ES关系?
1)Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
2)Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
1.3 ES主要解决问题:
1)检索相关数据;
2)返回统计结果;
3)速度要快。
1.4 ES工作原理
当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接
1.5 ES核心概念
1. 索引 Index
ES中的索引类似关系型数据库中的数据库,里面存放用户文档数据。因为ES是封装的Lucene,所以底层还是有Lucene的一个或者多个索引组成,数据的增删改查也是有底层的Lucene完成,ES中的分片或副本实际上就是一个Lucene索引。
2. 文档 Document
文档是ES中存储数据的主体,ES中所有的操作都是建立在文档的基础上的,每个文档都是由各种Field组成,每个Field有一个名称和一个或多个值构成。文档展示给用户就是一个JSON对象。
{
"uname":"zsf",
"sex":"female"
}
3. 类型 Type
ES中Type是一种逻辑上的概念,类似关系型数据库中的表,每个文档都属于某一种类型,如果没有定义,会有默认值,这里的类型相当于数据库当中的表,ES的每个索引可以包含多种类型。
现在ES5.0之后,就不推荐使用Type了。全部交_doc。也可以任务就是mysql的表名
4. 映射 Mapping
映射类似关系型数据库中的schema,用于定义field的属性,如字段类型,是否分词等。这里有一点和关系型数据库不同的是ES会在用户没有定义字段属性的情况下,自动嗅探该字段的类型进行自动识别。
就是mysql的字段的数据类型
5. 集群 Cluster
多个ES节点工作在一起组成一个集群。ES对于集群的支持几乎是无缝的,这也是ES重要的竞争优点之一。
6. 节点 Node
一个ES实例就是一个节点,说的再简单点,一台部署了ES服务的机器就是一个节点,同时,一台机器如果硬件资源允许也可以同时启动多个ES实例。ES中每个节点都和集群(如果是多个节点的集群)中的其他节点相互通信,了解所有文档的存储位置并能转发用户的请求到对应的数据节点上。
7. 分片 Shard
因为ES是分布式架构,类似于HDFS的存储方式,所以数据被打散存储在集群的多个节点上,一个分片实际上就是底层Lucene的一个索引,这里说的分片指的是ES中的主分片(因为还有副本分片一说),分片的方式是ES自动完成,用户可以指定分片的数量,主分片一旦指定就不能修改,因为ES打散数据的方式是和索引创建时指定的主分片数量有关(具体参考公式:shard = hash(routting) % number_of_primary_shards进行文档分配),后期改变会导致分片中的数据不可搜索。
8. 副本 Replia
副本就是分片的一个拷贝,不仅能提高自身容灾,另外,请求量很大的情况下,副本可以分担主Shard压力,承担查询功能。副本个数还以在创建完索引后灵活调整。
今天我们介绍了EST基础概念和核心概念,我们下一节将基于实践经验进行Elasticsearch集群管理与监控的介绍!
1.6 ES数据架构的主要概念(与关系数据库Mysql对比)
(1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
(2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type),
(3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
(4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
(5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.
Mysql的主要用途:
存储数据,用来完成强一致性,保证ACID的数据。逻辑性事务性的操作。
Redis的用途:
存储数据,做缓存。
ES的用途:
存储数据,全文检索。
什么项目能用上ES:
商城,社交评论等,
1.7 ELK是什么?
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展示。
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。
2. ES特点和优势
1)分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
2)实时分析的分布式搜索引擎。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
负载再平衡和路由在大多数情况下自动完成。
3)可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
4)支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
3、为什么要用ES?
实际项目开发实战中,几乎每个系统都会有一个搜索的功能,当搜索做到一定程度时,维护和扩展起来难度就会慢慢变大,所以很多公司都会把搜索单独独立出一个模块,用ElasticSearch等来实现。
近年ElasticSearch发展迅猛,已经超越了其最初的纯搜索引擎的角色,现在已经增加了数据聚合分析(aggregation)和可视化的特性,如果你有数百万的文档需要通过关键词进行定位时,ElasticSearch肯定是最佳选择。当然,如果你的文档是JSON的,你也可以把ElasticSearch当作一种“NoSQL数据库”, 应用ElasticSearch数据聚合分析(aggregation)的特性,针对数据进行多维度的分析。
4 安装
生产环境的要求
https://www.elastic.co/guide/en/elasticsearch/guide/master/hardware.html#_cpus
首先最重要的资源是内存,排序和聚合都可能导致内存匮乏,因此足够的堆空间来容纳这些是重要的。
64GB RAM的机器是最理想的,但32GB和16GB机器也很常见。少于8GB往往适得其反。
大多数Elasticsearch部署往往对CPU要求很不大,通用集群使用2到8核机器。
1安装jdk8
1.下载jdk8
2.将下载好的安装包放在自己机器上面的对应文件夹中
3.解压jdk安装包
cd /usr/java/
tar -zxvf jdk-8u251-linux-x64.tar
4.配置java环境变量
vi /etc/profile
在文件中末尾添加如下配置
JAVA_HOME=/usr/java/jdk1.8.0_251
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
5.使配置立即生效
source /etc/profile
6.查看jdk安装情况(如果安装成功会出现对应java版本信息)
java -version
2:安装Elastic
Elastic 需要 Java 8 环境。
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
wget命令:提示command not found
1、rpm 安装
下载wget的RPM包:
http://mirrors.163.com/centos/6.8/os/x86_64/Packages/wget-1.12-8.el6.x86_64.rpm
执行 rpm -ivh wget-1.12-8.el6.x86_64.rpm
2、yum安装
yum -y install wget
镜像下载地址
https://thans.cn/mirror/elasticsearch.html
解压
下载成功后,解压到指定目录:
tar -zxvf elasticsearch-7.0.0-no-jdk-linux-x86_64.tar.gz
Elasticsearch 目录、配置文件说明、注意点
这里大概解答下各个目录、配置文件的作用:
目录 | 配置文件 | 描述 |
---|---|---|
bin | 放置脚本文件,如启动脚本 elasticsearch, 插件安装脚本等。 | |
config | elasticserch.yml | elasticsearch 配置文件,如集群配置、jvm 配置等。 |
jdk | java 运行环境 | |
data | path.data | 数据持久化文件 |
lib | 依赖的相关类库 | |
logs | path.log | 日志文件 |
modules | 包含的所有 ES 模块 | |
plugins | 包含的所有已安装的插件 |
注意点:
- 有些机器内存可能不够,就需要修改 JVM 参数,配置文件路径为
config/jvm.options
,ES V7.1 版本默认为1g
, 老版本为2g
, 你可以自行修改。 -
Xmx
和Xms
数值请设置相同; -
Xmx
不要超过机器内存的50%
; - 内存总量不要超过 30GB, 参见官方文档 https://www.elastic.co/cn/blog/a-heap-of-trouble;
运行 Elasticsearch
执行启动命令:
bin/elasticsearch
为了安全不允许使用root用户启动
root@localhost elasticsearch-7.0.0]# bin/elasticsearch
[2020-06-11T05:02:08,260][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [localhost.localdomain] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
1、创建用户:elasticsearch
[root@localhost]# adduser elasticsearch
2、创建用户密码,需要输入两次
[root@localhost]# passwd elasticsearch
3、将对应的文件夹权限赋给该用户
[root@localhost]# chown -R elasticsearch:elasticsearch elasticsearch-7.0.0
4、切换至elasticsearch用户
[root@localhost]# su elasticsearch
5、进入启动目录启动 /usr/local/elasticsearch-7.0.0/bin 使用后台启动方式:./elasticsearch -d
[elasticsearch@localhost]$ ./elasticsearch -d
6、启动后测试
输入curl ip:9200,如果返回一个json数据说明启动成功。
当然,还有一种可能性:
[elasticsearch@localhost bin]$ ./elasticsearch -d
[elasticsearch@localhost bin]$ curl 127.0.0.1:9200
curl: (7) Failed connect to 127.0.0.1:9200; Connection refused
修改config/elasticsearch.yml
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
再次启动
./elasticsearch -d
然后,curl ip:9200
[elasticsearch@localhost bin]$ curl 127.0.0.1:9200
{
"name" : "localhost.localdomain",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "n491CMMhRJqkp_CJc9qoYQ",
"version" : {
"number" : "7.0.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "b7e28a7",
"build_date" : "2019-04-05T22:55:32.697037Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.7.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
3:启动的问题
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
切换到root用户,编辑limits.conf添加如下内容
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
ulimit -Hn
ulimit -Sn
修改/etc/security/limits.conf文件,增加配置,用户退出后重新登录生效
[2]: max number of threads [3818] for user [es] is too low, increase to at least [4096]
最大线程个数太低。修改配置文件etc/security/limits.conf,增加配置
* soft nproc 4096
* hard nproc 4096
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改/etc/sysctl.conf文件,增加配置vm.max_map_count=262144
vi /etc/sysctl.conf
sysctl -p
执行命令sysctl -p生效
[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
问题原因:因为Centos6不支持SecComp,而ES5.2.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动
解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
[5]:ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
修改
elasticsearch.yml
取消注释保留一个节点
cluster.initial_master_nodes: ["node-1"]
#修改config/elasticsearch.yml下约第23行,放开node.name注释,可更改名称 node.name: node-1
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: node-1
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["host1", "host2"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["node-1"]
开启防火墙
firewall-cmd --zone=public --add-port=9200/tcp --permanent
重新启动防火墙
firewall-cmd --reload
版本升级到2.2后,必须建一个单独的账号用于启动elasticsearch,不可以使用root账号进行启动,否则会报以下错误
Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.
也可以这样解决:
在bin目录修改elasticsearch.in.sh文件,填加如下配置项:
JAVA_OPTS="$JAVA_OPTS -Des.insecure.allow.root=true"
这样就可以用root用户启动elasticsearch了,当然还是建议大家创建其他用户使用。
4. 查看集群的健康状况
http://192.168.2.100:9200/_cat
http://192.168.2.100:9200/_cat/health?v
说明:v是用来要求在结果中返回表头
状态值说明
Green - everything is good (cluster is fully functional),即最佳状态
Yellow - all data is available but some replicas are not yet allocated (cluster is fully functional),即数据和集群可用,但是集群的备份有的是坏的
Red - some data is not available for whatever reason (cluster is partially functional),即数据和集群都不可用
查看集群的节点
http://192.168.2.100:9200/_cat/?v
查看所有索引
http://192.168.2.100:9200/_cat/indices?v
5:可视化
KIBans Head Kibana
https://www.elastic.co/cn/downloads/kibana
7.0.0下载地址
https://artifacts.elastic.co/downloads/kibana/kibana-7.0.0-linux-x86_64.tar.gz
Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。
上传文件到/usr/java/目录下
$ tar -zxvf kibana-7.0.0-linux-x86_64.tar.gz
vi config/kibana.yml
解开 elasticsearch.hosts: ["http://localhost:9200"]
解开 kibana.index: ".kibana"
添加 server.host: "192.168.2.100"
$ bin/kibana
kibana必须是在root下运行,否则会报错,启动失败
错误信息
To prevent pending reports from failing on restart, please set xpack.reporting.encryptionKey in kibana.yml
根据提示,在配置文件kibana.yml中添加【xpack.reporting.encryptionKey】属性:
xpack.reporting.encryptionKey: "a_random_string"
错误信息
please set xpack.security.encryptionKey in kibana.yml
根据提示,在配置文件kibana.yml中添加【xpack.security.encryptionKey】属性:
xpack.security.encryptionKey: "something_at_least_32_characters"
开放端口
firewall-cmd --zone=public --add-port=5601/tcp --permanent
重新启动防火墙
firewall-cmd --reload
6: curl使用
基于HTTP协议,以JSON为数据交互格式的RESTful API
其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,
事实上,如你所见,你甚至可以通过 curl 命令与Elasticsearch通信。
向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>/<PATH>?<QUERY_STRING>' -d '<BODY>'
命令格式:
**–curl -X指定http请求的方法(如HEAD GET POST PUT DELETE)httpUrl -d '指定要传输的数据'**
VERB HTTP方法: GET , POST , PUT , HEAD , DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
QUERY_STRING 一些可选的查询请求参数,例如 ?pretty 参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
创建索引库
例子:
建立索引库company,PUT和POST都可以:
索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号
curl -XPUT 'http://localhost:9200/cls38'
[root@localhost ~]# curl -XPUT 'http://localhost:9200/company'
{"acknowledged":true,"shards_acknowledged":true,"index":"company
运行
1:curl 192.168.2.101:9200/company
2:直接浏览器 打开 http://192.168.2.101:9200/company
创建索引
其中employee是type,1是document,-d是指定要传输的数据(遵循JSON格式):
curl -XPUT http://localhost:9200/company/employee/1 -d '{"name":“zs","age":25}'
curl -H 'Content-Type:application/json' -XPUT http://localhost:9200/company/employee/2 -d '{"name":"铝布","age":25}'
curl -H 'Content-Type:application/json;charset:UTF-8' -XPUT http://localhost:9200/company/employee/3 -d '{"name":"你好","age":25}'
查询索引
根据员工id查询(在任意的查询字符串中添加pretty参数,es可以得到易于识别的json结果)
curl -XGET http://localhost:9200/company/employee/1?pretty
curl后添加-i参数,就能得到反馈头文件
curl -i 'http://localhost:9200/company/employee/1?pretty'
[root@localhost ~]# curl -XGET http://localhost:9200/company/employee/3?pretty
{
"_index" : "company",
"_type" : "employee",
"_id" : "3",
"_version" : 5,
"_seq_no" : 13,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "你好",
"age" : 25
}
}
也可以直接网页中书写:
http://192.168.2.100:9200/company/employee/1?pretty
如果只需要name
curl -XGET http://localhost:9200/company/employee/1?_source=name
如果只需要source的数据
curl -XGET http://localhost:9200/company/employee/1/_source
curl -XGET http://localhost:9200/company/employee/1/_source?pretty
查询全部(默认返回前面的10个)
curl -XGET http://localhost:9200/company/employee/_search?pretty
根据条件进行查询
curl -XGET http://localhost:9200/company/employee/_search?q=name:zs
删除索引
curl -XDELETE http://localhost:9200/company
http://192.168.2.100:9200/company/employee/_search?pretty
7:head
一、下载 elasticsearch-head-master.zip
下载地址 (https://github.com/mobz/elasticsearch-head)
安装NodeJs
淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
- elasticsearch-head-master]# node -v
- v10.16.0
- elasticsearch-head-master]# npm -v
- 6.9.0
二、安装grunt
elasticsearch-head-master]# npm install -g grunt-cli
elasticsearch-head-master]# npm install
三、修改
elasticsearch-head-master]# vim Gruntfile.js,添加hostname: '0.0.0.0'
server: {
options: {
hostname: '0.0.0.0',
port: 9100,
base: '.',
keepalive: true
}
}
elasticsearch-head-master]# vim _site/app.js,将this.prefs.get("app-base_uri") || "localhost:9200",修改如下
this._super();
this.prefs = services.Preferences.instance();
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.1.100:9200";
四 跨域
打开路径 "..\elasticsearch\config\ " 下的 elasticsearch.yml 文件,在文件末尾添加如下代码:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User"
五启动
elasticsearch-head-master]# npm run start nohup npm run start(后台启动)
六开启防火墙
firewall-cmd --zone=public --add-port=9100/tcp --permanent
重新启动防火墙
firewall-cmd --reload
8: Kibana的使用
运行
PUT /company/employee/1
{
"uname":"路的话",
"sex":"female",
"age":12
}
结果
{
"_index" : "company",
"_type" : "employee",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
9:IK分词器安装
默认的分词器
7一下版本的分词
http://192.168.2.100:9200/_analyze?analyzer=standard&pretty=true&text=sojson在线工具
es中对于字符串的默认内置分词是standard类型的,但是这对于中文来说就无能为力了
7版本分词,使用postman。
请求地址: http://192.168.2.100:9200/_analyze
请求类型: POST
BODY===>RAW===>JSON(AppliactionJSON)
参数:
{
"analyzer":"standard",
"text":"hello love you"
}
得到结果
{
"tokens": [
{
"token": "hello",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "吃",
"start_offset": 6,
"end_offset": 7,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "了",
"start_offset": 7,
"end_offset": 8,
"type": "<IDEOGRAPHIC>",
"position": 2
},
{
"token": "吗",
"start_offset": 8,
"end_offset": 9,
"type": "<IDEOGRAPHIC>",
"position": 3
},
{
"token": "you",
"start_offset": 10,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 4
}
]
}
在Kibana中使用默认分词器:
http://192.168.2.100:5601/app/kibana#/dev_tools/console?_g=()
GET _analyze
{
"analyzer": "standard",
"text":"沉醉于夏季"
}
Result
Elasticsearch-analysis-ik是一款中文的分词插件,支持自定义词库,也有默认的词库。
Git 地址
https://github.com/medcl/elasticsearch-analysis-ik/releases
进入解压后的包中看一下,主目录下包含一些插件依赖的外部jar包和一个config文件,
config文件里面的内容是分词器分词时读取文件的主要目录,我们大概说说里面的各文件内容,
IKAnalyzer.cfg.xml:用来配置自定义词库
main.dic:ik原生内置的中文词库,总共有27万多条,只要是这些单词,都会被分在一起
quantifier.dic:放了一些单位相关的词
suffix.dic:放了一些后缀
surname.dic:中国的姓氏
stopword.dic:英文停用词
ik原生最重要的两个配置文件
main.dic:包含了原生的中文词语,会按照这个里面的词语去分词
stopword.dic:包含了英文的停用词
上传打完包的zip文件到linux对应的es的plugins目录下
解压,unzip elasticsearch-analysis-ik-7.0.0.zip
注意,在解压完成后必须删除下载后的压缩包,否则重启es服务时会报错,无法正常加载
yum install -y unzip zip
然后再plusins目录下建立ik目录。
将所有文件拷贝如ik目录下。
启动后报错
main ERROR RollingFileManager (/usr/java/elasticsearch-7.0.0/logs/elasticsearch.log) java.io.FileNotFoundExce.0/logs/elasticsearch.log (Permission denied)
[root@localhost ~]# adduser han
[root@localhost~]# passwd han
Changing password for user han.
New password: # 输入密码
Retype new password: # 再次输入密码
passwd: all authentication tokens updated successfully.
sudo chown -R han Elasticsearch安装目录
sudo chgrp -R han Elasticsearch安装目录
验证结果:
GET _analyze
{
"analyzer": "ik_smart",
"text":"沉醉于夏季"
}
{
"tokens" : [
{
"token" : "沉醉于",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "夏季",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
}
]
}
GET _analyze
{
"analyzer": "ik_max_word",
"text":"沉醉于夏季"
}
{
"tokens" : [
{
"token" : "沉醉于",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "沉醉",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "于",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "夏季",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 3
}
]
}
可以通过elasticsearch-plugin list来查看您所装的插件
GET _analyze
{
"analyzer": "ik_max_word",
"text":"信老韩得永生"
}
{
"tokens" : [
{
"token" : "信",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "老",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "韩",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "得",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 3
},
{
"token" : "永生",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 4
}
]
}
自己定义字典的分词器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
han.dic
老韩
信老韩
<entry key="ext_dict">han.dic</entry>
重新启动
GET _analyze
{
"analyzer": "ik_max_word",
"text":"信老韩得永生"
}
{
"tokens" : [
{
"token" : "信老韩",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "老韩",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "得",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "永生",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 3
}
]
}