02.全文搜索ES

全文搜索

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 & 收集日志,并且有点像后台启动

elasticSearch.yml es的启动host地址
jvm.options配置es的虚拟机内存
limits.conf配置linux的线程内存和文件
sysctl.conf配置系统允许的软件运行内存
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 为交互形式

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表

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 查询所有

/*查询所有*/
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”

GET /movie_index/movie/_search
{
  "query": {
    "match": {
      "name": "red"
    }
  }
}

3.4 中文分词器IK

3.4.1 进入plugins目录


配置阿里的镜像
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编写的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章