ElasticSearch7的基本原理和使用(借用Kibana可视化工具)

Elastic SearchElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java...
摘要由CSDN通过智能技术生成

Elastic Search

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

一、安装

  • 上官网下载最新版本的Elastic Search的tar.gz包,解压。
  • es有一个安全性的规则,不能使用root用户启动它,所以我们要先创建一个属于es的用户组,在其下创建一个用户
groupadd esg
useradd -g esg eshui
passwd esg 
New passwd: xxxxx
Repeat passd: xxxxx

为了以后操作的方便,最好直接把eshui的权限修改为root权限(修改/etc/sudoers)

  • 用eshui重新登陆,进入es的解压目录,执行 ./bin/elasticsearch即可运行
  • 用 curl 127.0.0.1:9200 命令访问es的默认端口,如果返回一串json,则启动成功。

二、修改配置文件以及修改limit

  • 修改./conf/elasticsearch.yml,作如下修改
network.host: 192.168.246.128 #这里是自己主机的IP地址
http.port: 9200
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
  • elasticsearch启动需要对centos下的一些limit进行修改 sudo vi /etc/security/limits.conf
# the end
eshui soft nofile 65535
eshui hard nofile 65536
eshui soft nproc 4096
eshui hard nproc 4096
  • sudo vi /etc/security/limits.d/20-nproc.conf
# 把 * 改成eshui
eshui      soft    nproc     4096
  • sudo vi /etc/sysctl.conf
#添加如下配置,让虚拟内存最大为655360字节
vm.max_map_count=655360

完成上述配置后,重新登陆bash,即可成功启动elasticsearch

三、ElasticSearch的Head插件,管理ES集群

Head插件是一个管理ES的客户端程序,安装他之前,需要安装grunt。通常使用npm安装,所以在linux环境下,先安装npm,自行在网上查找安装方法。

  • 安装grunt
npm install -g grunt-cli
  • 使用git clone将elasticsearch-head的源码克隆下来。
git clone git://github.com/monbz/elasticsearch-head.git
  • clone之后,进入主目录,执行cnpm install ,安装该es head项目所需要的插件。(最好安装cnpm,确保不被墙 npm install -g cnpm)

  • 修改elasticsearch-head下的Gruntfile.js中的connect.->server->options, 在其中增加一项,hostname: '*',

  • 修改elasticsearch-head/_site下的app.js中的this.baseurl下的localhost:9200改成实际elasticsearch的ip地址。

  • 允许跨越访问,修改elasticsearch/config/elasticsearch.yml。 增加以下两项。

http.cors.enabled: true
http.cors.allow-origin: "*"
  • 先启动 Elastic Search

  • 进入elasticsearch-head下的node_modules/grunt/bin,执行./grunt server开启es head。默认是9100端口。

  • 用浏览器访问9100端口,即可以看到elasticsearch的管理界面, 如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kjqOmkd-1585125850571)(https://t1.picb.cc/uploads/2019/10/13/gsy9ZT.md.png)]

四、安装ElasticSearch的图形化管理工具Kibana

Kibana是Elastic Search的web界面管理工具,提供可视化的es管理界面,非常人性化。

  • 首先在网上下载kibana的tar包,解压
  • 修改config/kibana.yml中的server.host为本机的ip地址。
  • 将数组elasticsearch-hosts内部的localhost改为elasticsearch的ip地址+端口。
  • 首先启动elastic-search。
  • 启动kibana,./bin/kibana。
  • 浏览器访问,ip:5601, 即可访问到kibana的控制台。默认端口是5601,如下所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2D72rEcD-1585125850572)(https://t1.picb.cc/uploads/2019/10/22/gDfA2s.md.png)]

五、ES的索引

5.1. 倒排索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVqFuO1y-1585125850573)(https://t1.picb.cc/uploads/2019/11/06/gY54eD.md.png)]

倒排索引保存了每个单词在文档中的存在情况。如果现在有一个需求,找到所有含有单词quick的文档。如果是一般的写法,需要将所有文档遍历一遍。如果有倒排索引的存在,就可以直接找到含有quick的文档。

在倒排索引中,key是每个单词,而value是含有这个单词的所有文档的序号。

在elastic search中,会把倒排索引的key进行处理,比如dogs和dog其实是同一个意思,Quick和quick其实是同一个意思。

5.2. 分词器介绍内置分词器

分词器包括三部分:

  • character filter:分词之前的预处理,过滤掉HTML标签特殊符号等。
  • tokenizer:分词。
  • token filter:标准化。

es内置分词器:

  • standard分词器:大写转小写,去除停用词,中文的话就是单个字分词。
  • simple分词器:过滤掉数字,以非字母字符来分割信息,然后将词汇单元转化成小写形式。
  • Whitepace分词器:仅仅根据空格分词。
  • language分词器:特定语言分词器。

5.3. 安装中文分词器

为ES安装中文分词器插件,首先使用git clone将中文分词器的代码拉下来

git clone git@github.com:medcl/elasticsearch-analysis-ik.git

然后使用maven编译源码

mvn clean install -Dmaven.skip.test=true

之后target文件夹下会生成一个releases文件夹,里面有一个elasticsearch-analysis-ik的zip压缩包。将该压缩包拷贝到elasticsearch/plugins/ik下,ik文件夹需要自己创建。解压缩后,将原压缩包删除。中文分词器插件配置完毕。

六、ES的基本使用(CURD)

6.1. 基本操作

下面是在Kibana中开发者工具里执行的demo,描述了文档的一般增删查改。

{
 "query": {
   "match_all": {}
 }
}

# 添加索引lib,分片数是3,备份数是0。
# 这里类似于Kafka的配置,Kafka也有分区和备份数,和这里是一致的
PUT /lib/
{
 "settings": {
   "index": {
     "number_of_shards": 3, 
     "number_of_replicas": 0
   }
 }
}

# 添加一个默认索引
PUT lib2

# 获取索引配置
GET /lib/_settings
GET /lib2/_settings

# 获取所有索引配置
GET _all/_settings


#指定id添加文档
PUT /lib/user/1
{
 "first_name":"曹",
 "last_name":"辉",
 "age":24,
 "about":"I like LULU",
 "interest":["movie"]
}

# 不指定ID的时候,用POST
POST /lib/user/
{
 "first_name":"杨",
 "last_name":"璐",
 "age":23,
 "about":"I like Caohui",
 "interest":["movie"]
}

# 获取指定id的文档
GET /lib/user/1
GET /lib/user/ZTLbRG4BO86YojzOMVx8

# 只查询source和about两个字段
GET /lib/user/1?_source=age,about


# 修改
POST /lib/user/1/_update
{
 "doc": {
   "age":30
 }
}

# 删除文档
DELETE /lib/user/1

# 删除索引
DELETE lib2

6.2. 批量获取文档

GET /_mget
{
  "docs": [
    {
      "_index": "lib",
      "_type": "user",
      "_id":"1"
    },
    {
      "_index": "lib",
      "_type": "user",
      "_id":"2"
    },
    {
      "_index": "lib",
      "_type": "user",
      "_id":"3"
    }
  ]
}

# 简化后的批量获取
GET /lib/user/_mget
{
  "docs": [
    {
      "_id": 1
    },
    {
      "_type": "user",
      "_id": 2
    }
  ]
}

# 或者更简单一点
GET /lib/user/_mget
{
  "ids":["1","2","3"]
}

6.3 使用Bulk API实现批量操作

PUT lib2
# 批量添加文档
POST /lib2/books/_bulk
{"index":{"_id":1}}
{"title":"Java", "price":55}
{"index":{"_id":2}}
{"title":"Php", "price":54}
{"index":{"_id":3}}
{"title":"C++", "price":53}


# 批量修改
POST /lib2/books/_bulk
{"delete":{"_index":"lib2", "_type":"books", "_id":3}}
{"create":{"_index":"tt", "_type":"ttt", "_id":100}}
{"name":"caohui"}
{"index":{"_index":"tt", "_type":"ttt"}}
{"name":"yanglu"}
{"update":{"_index":"lib2", "_type":"books", "_id":1}}
{"doc":{"price":128}}

POST /lib2/_bulk
{"update":{"_type":"books", "_id":1}}
{"doc":{"price":12345}}

bulk会把将要处理的数据载到内存只,所以数据量是有限制的。可以在es目录下的config中修改。

6.4. 版本控制

ElasticSearch采用乐观锁的机制,当用户对document进行操作时,只需要指定要操作的版本即可。 如果版本一致,修改,如果不一致,报错。每次修改,文档的_sep_no字段都会+1. (ES6以前使用version字段,之后被摒弃了)

6.4.1. 内部版本控制
GET /lib/user/1
{
  "_index" : "lib",
  "_type" : "user",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 1, 
  "found" : true,
  "_source" : {
    "first_name" : "曹",
    "last_name" : "辉",
    "age" : 30,
    "about" : "I like LULU",
    "interest" : [
      "movie"
    ]
  }
}

如果我想修改这个doc, 使用以下语句控制版本。

#如果我想修改这个doc
PUT /lib/user/1?if_seq_no=2?if_primary_term=1
{
	"doc":{
		"age":12
	}
}

两个参数

  • if_seq_no : 每个doc都有_seq_no,每一次修改这个doc,这个字段都会+1。
  • If_primary_term: 主分片发生改变时,比如重新选主,_primary_term会+1。
6.4.2. 外部版本控制

ElasticSearch中数据的版本很多情况下是根据外部数据库的版本的,外不会提供给es一个版本。此时,es中的版本应该修改为外部的版本。注意,此时外部提供的版本一定要大于es内部的版本,否则会报错。

外部版本控制的用法如下。

PUT /lib/user/1?version=100&version_type=external
{
    "first_name" : "曹",
    "last_name" : "辉",
    "age" : 24,
    "about" : "I like LULU",
    "interest" : [
      "movie"
    ]
}
<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值