Elasticsearch使⽤详解
1.1 elasticsearch是什么?
简称ES,是⼀个开源的⾼扩展的分布式全⽂搜索引擎,它可以近乎实时的存储、检索数据;本⾝扩展性很好,可以扩展到上百台服务器,处理PB级别的数据,es使⽤Java 开发并使⽤lucene作为其核⼼来实现所有索引和搜索的功能,但是它的⽬的是通过简单的RestFul API来隐藏Lucene的复杂性,从⽽让全⽂检索变得简单
1.2 solr和es⽐较
当单纯的对已有数据进⾏搜索时,solr更快
当实时建⽴索引时,solr会产⽣IO阻塞,查询性能较差,es具有明显的优势
随着数据量的增加,solr会变得越来越慢,⽽es没有明显的变化
1.3 es VS solr总结
1. es基本开箱即⽤(解压即可),⽽solr安装稍微复杂⼀点点
2. solr利⽤zookeeper进⾏分布式管理,⽽es⾃⾝带有分布式协调管理功能
3. solr⽀持更多格式的数据,如JSON、XML、csv,⽽es仅⽀持json格式
4. solr官⽅提供的功能多,⽽es本⾝更注重于核⼼功能,⾼级功能多有第三⽅插件提供,例如图形化界⾯需要kibana友好⽀撑
5. solr查询快,但更新索引时慢(即插⼊删除慢),⽤于电商等查询多的应⽤
6. es建⽴索引快,即实时查询快,多⽤于搜索
第⼆章 ES安装
2.1 解压即安装
#把安装包直接上传到电脑,直接解压即可
[es@ceshi opt]$ ll
total 16
drwxr-xr-x 10 es  es  4096 Aug 30 14:09 es
drwxr-xr-x  8 root root 4096 Apr  8 03:26 jdk1.8.0_291
drwxr-xr-x 13 root root 4096 Aug 30 11:12 kibana-7.8.0-linux-x86_64
drwxr-xr-x  2 root root 4096 Aug 30 11:12 src
2.2 熟悉⽬录
bin        启动⽂件
config    配置⽂件
log4j2.properties  ⽇志配置⽂件
jvm.options        虚拟机相关配置
lib      相关jar包
logs      ⽇志
modules  功能模块
plugins  插件
2.3 启动es
#在后台启动
[es@ceshi bin]$ ./elasticsearch  -d
#es启动默认使⽤普通⽤户,注意⽬录权限问题
2.4 访问测试
#es默认使⽤两个端⼝,9200为外部访问端⼝,9300是集内部通信端⼝
{
"name" : "XIAOYAO",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-J88UDSLSVqC1hxClaRG1w",
"version" : {
"number" : "7.8.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date" : "2020-06-14T19:35:50.234439Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
2.5 安装es-head
#上传安装包到服务器,解压
[root@ceshi src]# ls
elasticsearch-7.8.0-linux-x86_  elasticsearch-head-master.zip  kibana-7.8.0-linux-x86_
elasticsearch-analysis-ik-7.8.0.zip     
[root@ceshi src]# unzip  elasticsearch-head-master.zip -d  /opt/
#进⼊到安装⽬录,执⾏命令,需要提前安装npm命令
[root@ceshi elasticsearch-head]# npm  install
#运⾏es-head,在后台运⾏
[root@ceshi elasticsearch-head]# nohup npm  run  start  &
#访问端⼝9100
2.6 解决跨域问题
#此时通过es-head直接连接es,会⽆法连接,需要解决下跨域问题;编辑es配置⽂件,在后⾯添加参数
2.7 访问测试
#重启es,重新访问9100端⼝
2.8 安装kibana
total 20
drwxr-xr-x  8 root root 4096 Aug 30 14:40 elasticsearch-head
drwxr-xr-x 10 es  es  4096 Aug 30 14:09 es
drwxr-xr-x  8 root root 4096 Apr  8 03:26 jdk1.8.0_291
drwxr-xr-x 13 root root 4096 Aug 30 14:44 kibana
drwxr-xr-x  2 root root 4096 Aug 30 11:12 src
#修改配置⽂件
[root@ceshi config]# vi  l
server.host: "172.19.70.210"
elasticsearch.hosts: ["172.19.70.210:9200"]
i18n.locale: "zh-CN"
#启动服务,使⽤普通帐户启动
[es@ceshi es]$ cd  ../kibana/bin/
[es@ceshi bin]$ ./kibana
第三章初步查询
3.1 _cat
查看所有节点
GET /_cat/nodes
查看es健康状况
GET /_cat/health
查看主节点
GET /_cat/master
查看所有索引
GET /_cat/indices
3.2 索引⼀个⽂档
#保存⼀个数据,保存在哪个索引的哪个类型下,指定⽤哪⼀个唯⼀标识
#在xiaoyao索引下的test类型的保存1号数据为:
PUT  xiaoyao/test/1
{
"name":"xiaoyao"
}
#输出信息:
{
"_index" : "xiaoyao", #在哪个索引
"_type" : "test",    #在哪个类型
"_id" : "1",          #⽂档id
"_version" : 2,      #版本号
"result" : "updated", #状态
"_shards" : {        #集分⽚信息
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
#PUT和POST都可以,PUT可以新增,可以修改,PUT必须指定id,由于指定id的原因,所以我们⼀般做修改操作,不指定id会报错;#POST新增,如果不指定id,会⾃动⽣成id,指定id会修改这个数据,并新增版本号
3.3 查询⽂档
GET xiaoyao/test/1
{
"_index" : "xiaoyao", #在哪个索引
"_type" : "test",    #在哪个类型
"_id" : "1",          #⽂档id
"_version" : 2,      #版本号
"_seq_no" : 1,        #并发控制⼿段,每次更新都会加1,⽤来做乐观锁
"_primary_term" : 1,  #同上,主分⽚重新分配。如重启就会变化,需要结合使⽤
"found" : true,
"_source" : {        #真正的内容
"name" : "xiaoyao"
}
}
###测试乐观锁,打开两个窗⼝指定seq_no,第⼀条数据新增后,seq_no会⾃增,另外⼀个会报错409
PUT xiaoyao/test/1?if_seq_no=1&if_primary_term=1
3.4 更新⽂档
#PUT和POST都可以更新⽂档,PUT更多的是对原⽂档覆盖,常⽤POST请求加上_update可以对某⼀个字段进⾏更新
POST xiaoyao/test/1/_update
{
"doc": {
"name":"xiaoyao"
}
}
#POST操作带_updata会对⽐源⽂件,如果相同不会有任何操作,⽂档version不增加,需要带上“doc”参数
#POST不带_updata和PUT请求效果⼀样,会把源数据覆盖。
3.5 删除⽂档&索引
#es可以对⽂档和索引进⾏删除操作,⽆法删除类型
#删除⽂档
DELETE xiaoyao/test/1
#删除索引
DELETE xiaoyao
3.6 bulk批量API
#只能使⽤post请求
POST  /xiaoyao/test/_bulk
#语法格式
{"action":{metadata}}
{request body}
{"action":{metadata}}
{request body}
#复杂实例
POST  /_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title": "My first blog post"}
{"index": {"_index":"website","_type":"blog"}}
#bulk API以此按顺序执⾏所有的action,如果⼀个单个的动作因任何原因⽽失败,它将继续处理它后⾯剩余的⼯作,当bulk API返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否⼀个指定的动作是不是失败了3.7 样本测试数据
#准备es样本数据
#下载链接
gitee/runewbie/learning/raw/master/ElasticSearch/resource/accounts.json#
POST bank/account/_bulk
测试数据
第四章进阶查询
4.1 SearchAPI
ES⽀持两种基本⽅式检索
⼀种是通过使⽤REST requestAPI发送搜索参数(uri+搜索参数)
GET /bank/_search?q=*&sort=account_number:asc
#查process索引下的所有数据以account_number字段进⾏升序排序,到的数据都存放在hits命中记录中,默认只返回10条记录
另⼀个是通过使⽤REST request body来发送请求(uri+请求体)
#经常使⽤这种查询⽅式
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}
4.2 Query DSL
4.2.1 基本语法格式
Elasticsearch提供了⼀个可以执⾏查询的json风格的DSL,这个被称为Query DSL。该查询语⾳⾮常全⾯
#⼀个查询语句的典型结构
{
QUERY_NAME:{
ARGUMENT:VALUE
}
}
#⽰例
GET /bank/_search
{
"query": {
"match_all": {}
}
}
#如果是针对某个字段,那么它的结构如下:
{
QUERY_NAME:{
FIELD_NAME:{
ARGUMENT:VALUE
}
}
}
#⽰例
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
#分页查询
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
,
"from": 0,  #从哪⾥开始
"size": 5  #查询⼏条数据
}
4.2.2 返回部分字段
{ "account_number": "asc" }
]
}
GET /bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": {
"order": "desc"
}
}
],
"from": 10,
"size": 5,
"_source": ["balance","firstname"]
}
#使⽤_source可以指定只返回某些字段
4.2.3 match匹配查询
#基本类型(⾮字符串),精确匹配
GET bank/_search
{
"query": {
"match": {
"address": "mill lane" #字段值会进⾏分词匹配
}
}
}
#查address字段值为mill lane;⽀持精确查询和模糊查询
#全⽂检索会按照评分进⾏排序,会对检索条件进⾏分词匹配
4.2.4 match_phrase短语匹配
#将需要匹配的值当成⼀个整体单词(不分词)进⾏检索
GET bank/_search
{
"query": {
"match_phrase": {
"address": "mill lane"  #字段值不会分词匹配
}
}
}
4.2.5 multi_match多字段匹配
#state字段或者address字段内容包含mill内容,字段内容会进⾏分词处理
GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": ["state","address"]
}
}
}
4.2.6 bool复合查询
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {
"gender": "M"
}},
{"match": {
"address": "Mill"
}}
],
"must_not": [
{"match": {
"age": "18"
}}
]
,
"should": [
{"match": {
"lastname": "wallace"
}}
]
}
}
}
#must和must_not查询结果必须同时满⾜,should条件不满⾜也能匹配,如果should条件也满⾜的话,得分最⾼
4.2.7 filter结果过滤
#并不是所有的查询都需要产⽣分数,特别是那些仅⽤于“filtering”(过滤)的⽂档,为了不计算分数,es会⾃动检查场景并且优化查询的执⾏GET  bank/_search
{
"address": "mill"
}}
],
"filter": [
{"range": {
"age": {
"gte": 20,
"lte": 32
}
}}
]
}
}
}
#filter可以对上⾯条件输出的结果进⾏过滤,并且不计算分数
4.2.8 term
#和match⼀样,匹配某个属性的值,全⽂检索字段⽤match,其他⾮text字段匹配⽤term
GET bank/_search
{
"query": {
"match": {
"age": "28"
}
index与match举例讲解
}
}
GET bank/_search
{
"query": {
"term": {
"age": "28"
}
}
}
#查询字段值为⾮⽂本格式时,两种查询⽅法都可以;字段值为⽂本时,term⽆法使⽤
#精确匹配
GET bank/_search
{
"query": {
"match_phrase": {
"address": "789 Madison Street"
}
}
}
#精确匹配
GET process/_search
{
"query": {
"match": {
"address.keyword": "789 Madison Street"  #整个字段值的内容是全部,多或少都⽆法匹配
}
}
}
4.2.9 aggregations执⾏聚合
聚合提供了从数据中分组和提取数据的能⼒,最简单的聚合⽅法⼤致等于SQL GROUP BY和SQL聚合函数,在elasticsearch中,你有执⾏搜索返回hits(命中结果),并且同时返回聚合结果,把⼀个响应中的所有hits(命中结果)分隔开的能⼒,这是⾮常强⼤且有效的,你可以执⾏查询和多个聚合,并且在⼀次使⽤中得到各⾃的返回结果,使⽤⼀次简洁和简化API来避免⽹络回返
#搜索address中包含mill的所有⼈的年龄分布以及平均年龄,但不显⽰这些⼈的详情
GET  bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"age_agg": {
"terms": {
"field": "age",
"size": 10
}
},
"age_avg":{
"avg": {
"field": "age"
}
},
"balanceavg": {
"avg": {
"field": "balance"
}
}
}
}
#size: 0 不显⽰搜索数据,只显⽰聚合结果
aggs:执⾏聚合,聚合语法如下
"aggs":{
"aggs_name":{  #这次聚合的名字,可⾃定义
"agg_type":{ #可选聚合的类型(avg、term、terms)
"field": "需要聚合的字段名"
}
}
}
---------------------------------------------------------------------------
#按照年龄聚合,并且请求这些年龄段的这些⼈的平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。