全文搜索
1.介绍
elasticsearch 6 (和elasticsearch 5 的区别在于,root用户权限、一个库只能建立一个表)
elasticsearch 6一个索引只能建立一张表
1.1 文本搜索引擎:
- 优点:搜索快;
- 缺点:占用空间。【典型的空间换时间的一种算法】
同类产品:Solr、ElasticSearch、Hermes(腾讯)(实时检索分析)
solr 、elasticSearch 底层依赖Lucene; elasticsearch 默认就是以集群方式工作的。solr需要依赖zk1.
1.2 elasticSearch(搜索引擎)的算法
倒排索引(在内容上建立索引,用内容匹配索引);
btree mysql数据库的索引方式。
b tree 多路平衡书的晋级(elasticsearch)
内存结构:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B Tree
2.elasticsearch 单机安装
2.1 Centos7 jdk 安装
- 查看当前Linux系统是否已经安装java : 输入 rpm -qa | grep java
- 卸载两个openJDK: 输入rpm -e –nodeps 要卸载的软件
- 上传jdk到linux
- 解压jdk到/usr/local下 tar –xvf jdk-7u71-linux-i586.tar.gz –C /usr/local
- 配置jdk环境变量,打开/etc/profile配置文件,将下面配置拷贝进去
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_152
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
- 重新加载/etc/profile配置文件 source /etc/profile
2.2 安装elasticsearch
2.2.1 创建目录、上传、解压
- mkdir -p /opt/es //把安装包上传到 /opt/es目录下
- tar – zxvf elasticsearch-6.3.1.tar.gz
- 启动脚本 :
./elasticsearch
直接启动会报相关的错误
2.2.2 修改相关配置
- 权限问题: 需要改成其他非root用户才能启动:(1)创建用户:
adduser es
(2)切换用户:su es
- JVM内存问题
需要修改/opt/es/elasticsearch-6.3.1/config/jvm.options jvm.options jvm配置文件
需要用root用户授权: chmod 777 -R elasticsearch-6.3.1
切换 到es
用户上。去修改:
建议配置2g~4g,学习测试环境配置256m 就可以了
- elasticSearch.yml中配置es的host地址(配成本机地址,允许访问) elasticSearch.yml 集群配置文件
使用非root账户启动elasticsearch : ./elasticsearch
会报 默认线程数、最大文件数、最大内存数都不够
- 修改linux的limits配置文件,设置内存线程和最大文件数 。切换
root
用户 修改vi /etc/security/limits.conf
- 修改linux的sysctl配置文件,配置系统使用内存
vi sysctl.conf
切换es
用户启动elasticsearch
./elasticsearch 前台启动
nohup ./elasticsearch & 收集日志,并且有点像后台启动
代码语言:javascript复制elasticSearch.yml es的启动host地址
jvm.options配置es的虚拟机内存
limits.conf配置linux的线程内存和文件
sysctl.conf配置系统允许的软件运行内存
代码语言:javascript复制systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
# 开启80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含义
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
CentOS 7.0默认使用的是firewall作为防火墙,使用iptables必须重新设置一下
直接关闭防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
设置 iptables service
yum -y install iptables-services
如果要修改防火墙配置,如增加防火墙端口3306
vi /etc/sysconfig/iptables
增加规则
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
保存退出后
systemctl restart iptables.service #重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
3.kibana安装
3.1 上传安装包并解压
tar -zxvf kibana-6.3.1-linux-x86_64.tar.gz
3.2 修改配置文件
修改kibana.yml
3.3 启动
nohup &
这个命令可以记录启动日志。nohup.out
,使用tail -f nohup.out
命令实时监控日志记录
ps -ef |grep node
查看kibana 的pid
使用kill -9 30300
杀死进程
3.ElasticSearch
3.1 交互方式
==交互方式:==基于http协议,以JSON为数据交互格式的RESTfull API 为交互形式
代码语言:javascript复制elasticsearch 通过
192.168.1.6:9200/_search
表示查询全部,这里没有查询某个库
GET /_search #查询所有索引文档
GET /my_index/_search #查询指定索引文档
GET /my_index1,my_index2/_search #多索引查询
192.168.1.6/_cat/indices?/v
这个是因为我先装了kibana
,如果装好了es,直接运行不是这个了。直接是标题栏一行的。
标题 | 描述 |
---|---|
health | green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
status | 是否能使用 |
index | 索引名 |
uuid | 索引统一编号 |
pri | 主节点几个 |
rep | 从节点几个 |
docs.count | 文档数 |
docs.deleted | 文档被删了多少 |
store.size | 整体占空间大小 |
pri.store.size | 主节点占 |
3.2 基本概念
Index 库
Type 表
Document 行(一条数据)
Field 字段
标题 | 描述 |
---|---|
cluster | 整个elasticsearch 默认就是集群状态,整个集群是一份完整、互备的数据。 |
node | 集群中的一个节点,一般只一个进程就是一个node |
shard | 分片,即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片。 |
index | 相当于rdbms的database, 对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中。 |
type | 类似于rdbms的table,但是与其说像table,其实更像面向对象中的class , 同一Json的格式的数据集合。 |
Document(json) | 类似于rdbms的 row、面向对象里的object |
field | 相当于字段、属性 |
3.3 简单es 的CRUD
3.3.1 创建索引
PUT atguigu 表示创建索引
DELETE atguigu 表示删除索引
GET 查询
POST 修改
3.3.2 创建索引并添加数据
格式:PUT /index/type/id
PUT /movie_index/movie/1 创建movie_index索引库,在该库下面创建movie表
代码语言:javascript复制PUT /movie_index/movie/1
{ "id":1,
"name":"operation red sea",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/2
{
"id":2,
"name":"operation meigong river",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/3
{
"id":3,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"zhang chen"}
]
}
如果之前没建过index或者type,es 会自动创建
3.3.3 查询所有
代码语言:javascript复制/*查询所有*/
GET /movie_index/_search
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "movie_index",
"_type": "movie",
"_id": "2",
"_score": 1,
"_source": {
"id": 2,
"name": "operation meigong river",
"doubanScore": 8,
"actorList": [
{
"id": 3,
"name": "zhang han yu"
}
]
}
},
{
"_index": "movie_index",
"_type": "movie",
"_id": "1",
"_score": 1,
"_source": {
"id": 1,
"name": "operation red sea",
"doubanScore": 8.5,
"actorList": [
{
"id": 1,
"name": "zhang yi"
},
{
"id": 2,
"name": "hai qing"
},
{
"id": 3,
"name": "zhang han yu"
}
]
}
},
{
"_index": "movie_index",
"_type": "movie",
"_id": "3",
"_score": 1,
"_source": {
"id": 3,
"name": "incident red sea",
"doubanScore": 5,
"actorList": [
{
"id": 4,
"name": "zhang chen"
}
]
}
}
]
}
}
3.3.4 查询条件
匹配带“red”
代码语言:javascript复制GET /movie_index/movie/_search
{
"query": {
"match": {
"name": "red"
}
}
}
3.4 中文分词器IK
3.4.1 进入plugins目录
代码语言:javascript复制配置阿里的镜像
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
记得备份:CentOS-Base.repo文件.
更新镜像源
清除缓存:yum clean all
生成缓存:yum makecache
重启elasticsearch
analyzer:
- ik_smart(简易分词)
- ik_max_word(尽最大可能分词)
GET _analyze
{
"analyzer":"ik_smart",
"text":"我是中国人"
}
3.5 相关性算分数
查询的关键字在进行分词处理后,与es的文档(分词处理并建立了索引)之间的相关度的高低
4.ES集群
4.1 节点、分片、索引
- ==节点:==一个节点就是一个es的服务器,es集群中,主节点负责集群的管理和任务的分发,一般不负责文档的增删改查
- ==片:==分片是es的实际物理存储单元(一个lucene的实例)
- ==索引:==是es的逻辑单元,一个索引一般建立在多个不同机器的分片上
- ==复制片:==每个机器的分片一般在其他机器上会有两到三个复制片(目的是提高数据的容错率)
- ==容错:==一旦集群中的某些机器发生故障,那么剩余的机器会在主机点的管理下,重新分配资源(分片)
- ==分片的路由:==写操作(新建、删除)只在主分片上进行,然后将结果同步给复制分片,Sync 主分片同步给复制成功后,才返回结果给客户端,Async 主分片在操作成功后,在同步复制分片的同时返回成功结果给客户端,读操作(查询)可以在主分片或者复制分片上进行
4.2集群
4.2.1 修改配置文件
elasticserach.yml vim /elasticsearch.yml
cluster.name: aubin-cluster #必须相同
# 集群名称(不能重复)
# 节点名称,仅仅是描述名称,用于在日志中区分(自定义)
node.name: els1(必须不同)
#指定了该节点可能成为 master 节点,还可以是数据节点
node.master: true
node.data: true
# 数据的默认存放路径(自定义)
path.data: /opt/data
# 日志的默认存放路径
path.logs: /opt/logs
# 当前节点的IP地址
network.host: 192.168.1.7
# 对外提供服务的端口
http.port: 9200
#9300为集群服务的端口
transport.tcp.port: 9300
# 集群个节点IP地址,也可以使用域名,需要各节点能够解析 【其他机器的IP地址】
discovery.zen.ping.unicast.hosts: ["192.168.1.6"]
# 为了避免脑裂,集群节点数最少为 半数 1
discovery.zen.minimum_master_nodes: 2
现在模拟两台机器:192.168.1.6 192.168.1.7 模拟es集群
注意:清空data和logs数据 , 192.168.1.6:9200/_cat/nodes?v,chmod 777 data / chmod 777 logs
启动es:nohup ./elasticsearch &
需要注意不能使用root
账户启动。
集群管理工具:cerebro-0.8.3.zip 解压就可以用了。前提是必须安装jdk。它是用java编写的。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100748.html原文链接:https://javaforall.cn