ElasticSearch 基础知识一解析

哈哈 阅读:227 2021-03-31 14:12:31 评论:0

第一、ElasticSearch 简介

           Elaticsearch ,简称为 es es 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本
身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。 es 也使用 Java 开发并使用 Lucene 作为其核心来实
现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得
简单
 
1.1 ElasticSearch 应用场景
1、2013 年初, GitHub 抛弃了 Solr ,采取 ElasticSearch 来做 PB 级的搜索。 “GitHub 使用 ElasticSearch 搜索 20TB
的数据,包括 13 亿文件和 1300 亿行代码
2、维基百科:启动以 elasticsearch 为基础的核心搜索架构
3、SoundCloud “SoundCloud 使用 ElasticSearch 1.8 亿用户提供即时而精准的音乐搜索服务
4、百度:百度目前广泛使用 ElasticSearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自
定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部
20 多个业务线(包括 casio 、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大 100 台机
器, 200 ES 节点,每天导入 30TB+ 数据
5、新浪使用 ES 分析处理 32 亿条实时日志
6、阿里使用 ES 构建挖财自己的日志采集和分析体系
 
1.3 ElasticSearch 与Solr 对比:
1、Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能; 
2、 Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式; 
3、 Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供 
4、Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch

第二、Windows 安装ElasticSearch 服务

1、解压开即安装完毕,解压后的 ElasticSearch 的目录结构如下:
2、启动ElasticSearch 服务
点击 ElasticSearch 下的 bin 目录下的 elasticsearch.bat 启动,控制台显示的日志信息如下:
注意:9300是tcp通讯端口,集群间和TCPClient都执行该端口,9200是http协议的RESTful接口 。
通过浏览器访问 ElasticSearch 服务器,看到如下返回的 json 信息,代表服务启动成功:

 

第三、安装ElasticSearch的图形化界面插件

ElasticSearch不同于Solr自带图形化界面,我们可以通过安装ElasticSearchhead插件,完成图形化界面的效 果,完成索引数据的查看。安装插件的方式有两种,在线安装和本地安装。本文档采用本地安装方式进行head插 件的安装。elasticsearch-5-*以上版本安装head需要安装nodegrunt

1 )下载 head 插件: https://github.com/mobz/elasticsearch-head
2 )将 elasticsearch-head-master 压缩包解压到任意目录,但是要和 elasticsearch 的安装目录区别开
3 )下载 nodejs https://nodejs.org/en/download/
      双击安装程序,步骤截图如下:
     
      
      

       

      

      安装完毕,可以通过cmd控制台输入:node -v 查看版本号

5 )将 grunt 安装为全局命令 , Grunt 是基于 Node.js 的项目构建工具
cmd 控制台中输入如下执行命令:
npm install ‐g grunt‐cli
执行结果如下图:
6 )进入 elasticsearch-head-master 目录启动 head ,在命令提示符下输入命令:
>cnpm install
>grunt server
7 )打开浏览器,输入 http://localhost:9100 ,看到如下页面:
如果不能成功连接到 es 服务,需要修改 ElasticSearch confifig 目录下的配置文件: confifig/elasticsearch.yml ,增加
以下两句命令:
http.cors.enabled: true 
 
http.cors.allow-origin: "*"
然后重新启动 ElasticSearch 服务。

 

第四、ElasticSearch相关概念(术语)

4.1 概述

Elasticsearch 是面向文档 (document oriented) 的,这意味着它可以存储整个对象或文档 (document) 。然而它不仅
仅是存储,还会索引 (index) 每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的
数据)进行索引、搜索、排序、过滤。 Elasticsearch 比传统关系型数据库如下:

4.2 ElasticSearch 核心概念

索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索
引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这
个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索
引。
 
类型 type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类 / 分区,其语义完全由你来
定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数
据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可
以为评论数据定义另一个类型。
 
 
字段 Field
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
 
映射 mapping
mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,
这些都是映射里面可以设置的,其它就是处理 es 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据
对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
 
文档 document
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,
也可以拥有某个订单的一个文档。文档以 JSON Javascript Object Notation )格式来表示,而 JSON 是一个到处存
在的互联网数据交互格式。
在一个 index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须
被索引 / 赋予一个索引的 typ
 
 
接近实时 NRT
Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延
迟(通常是 1 秒以内)
 
 
集群 cluster
Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns
Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields 一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由
一个唯一的名字标识,这个名字默认就是 “elasticsearch” 。这个名字是重要的,因为一个节点只能通过指定某个集
群的名字,来加入这个集群
 
节点 node
一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一
个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的
时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对
应于 Elasticsearch 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫
“elasticsearch” 的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,
它们将会自动地形成并加入到一个叫做 “elasticsearch” 的集群中。
在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何 Elasticsearch 节点,
这时启动一个节点,会默认创建并加入一个叫做 “elasticsearch” 的集群。
 
分片和复制 shards&replicas
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任
一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题, Elasticsearch 提供
了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每
个分片本身也是一个功能完善并且独立的 索引 ,这个 索引 可以被放置到集群中的任何节点上。分片很重要,主
要有两方面的原因: 1 )允许你水平分割 / 扩展你的内容容量。 2 )允许你在分片(潜在地,位于多个节点上)之上
进行分布式的、并行的操作,进而提高性能 / 吞吐量。
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,
这些都是透明的。
在一个网络 / 云的环境里,失败随时都可能发生,在某个分片 / 节点不知怎么的就处于离线状态,或者由于任何原因
消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的, Elasticsearch 允许你创建分
片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。
复制之所以重要,有两个主要原因: 在分片 / 节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分
片从不与原 / 主要( original/primary )分片置于同一节点上是非常重要的。扩展你的搜索量 / 吞吐量,因为搜索可以
在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)
或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分
片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你
事后不能改变分片的数量。
默认情况下, Elasticsearch 中的每个索引被分片 5 个主分片和 1 个复制,这意味着,如果你的集群中至少有两个节
点,你的索引将会有 5 个主分片和另外 5 个复制分片( 1 个完全拷贝),这样的话每个索引总共就有 10 个分片。

 

第五、ElasticSearch客户端操作之Postman

1、ElasticSearch的接口语法

curl ‐X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' ‐d '<BODY>'

参数说明:

2、Postman 操作之创建索引库index = 新增索引库blog1

3、Postman 操作之创建索引库index 添加映射mapping =为bolg1索引库添加hello 的映射

请求URL: post    http://localhost:9200/blog1/hello/_mapping

请求体:

{ 
    "hello": { 
        "properties": { 
            "id":{ 
                "type":"long", 
                "store":true  
            }, 
            "title":{ 
                "type":"text", 
                "store":true, 
                "index":true, 
                "analyzer":"standard"  
            }, 
            "content":{ 
                "type":"text", 
                "store":true, 
                "index":true, 
                "analyzer":"standard"  
            }  
        }  
    }  
} 

postman 截图:

4、postman 操作之删除索引库

请求URL: delete  http://localhost:9200/blog1

postman截图:

5、postman 操作之创建index 索引库和映射mapping = 创建blog2 索引库并指定article 的相关映射

请求URL: put http://localhost:9200/blog2 

 请求体:

{ 
    "mappings": { 
        "article": { 
            "properties": { 
                "id": { 
                    "type": "long", 
                    "store": true 
                    
                }, 
                "title": { 
                    "type": "text", 
                    "store": true 
                }, 
                "content": { 
                    "type": "text", 
                    "store": true 
                }  
            }  
        }  
    }  
} 

postman 截图:

6、postman 操作之新增文档

请求URL: post  http://localhost:9200/blog2/article/1 

请求体:

{ 
    "id":1, 
    "title":"ElasticSearch是一个基于Lucene的搜索服务器", 
    "content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时 搜索,稳定,可靠,快速,安装使用方便。"  
} 

postman 截图:

7、postman 操作之更新文档

请求URL: post  http://localhost:9200/blog2/article/1

请求体:

{ 
    "id":1, 
    "title":"【修改】ElasticSearch是一个基于Lucene的搜索服务器", 
    "content":"【修改】它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch 是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够 达到实时搜索,稳定,可靠,快速,安装使用方便。"  
} 

 postman 截图:

8、postman 操作之删除文档

请求URL: delete   http://localhost:9200/blog2/article/1

postman 截图:

 

 9、postman 操作之删除文档

请求URL: delete http://localhost:9200/blog2/article/1

postmane 截图:

10、postman 操作之根据文档ID进行查询

请求URL: get    localhost:9200/blog2/article/1

postmane 截图:

 

11、postman 操作之根据文档querystring进行查询 

请求URL: post   localhost:9200/blog2/article/_search

请求体:

{ "query": { "query_string": { "default_field": "title", "query": "搜索服务器" } } }

postmane 截图:

12、postmane 操作之 根据文档term进行查询 

请求URL: post    localhost:9200/blog2/article/_search

请求体:

{ "query": { "term": { "title": "搜索" } } }

posmane 截图:

第六、ElasticSearch服务端集成IK分词

6.1 IK分词器简介:

      IKAnalyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006 12 月推出 1.0 版开始,
IKAnalyzer 已经推出 了 3 个大版本。最初,它是以开源项目 Lucene 为应用主体的,结合词典分词和文法分析算法的
中文分词组件。新版本的 IKAnalyzer3.0 则发展为 面向 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对
Lucene 的默认优化实现。
IK 分词器 3.0 的特性如下:
1 )采用了特有的 正向迭代最细粒度切分算法 ,具有 60 万字 / 秒的高速处理能力。
2 )采用了多子处理器分析模 式,支持:英文字母(IP 地址、 Email URL )、数字(日期,常用中文数量词,罗马数字,科学计数法),中文 词汇(姓名、地名处理)等分词处理。
3 )对中英联合支持不是很好 , 在这方面的处理比较麻烦 . 需再做一次查询 , 同时是支持个人词条的优化的词典存储,更小的内存占用。
4 )支持用户词典扩展定义。
5 )针对 Lucene 全文检索优 化的查询分析器IKQueryParser ;采用歧义分析算
 
6.2 Elasticsearch 集成IK
1 )下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
2)解压,将解压后的 elasticsearch 文件夹拷贝到 elasticsearch-6.3.2\plugins 下,并重命名文件夹为 analysis-ik
3 )重新启动 ElasticSearch ,即可加载 IK 分词器

 

6.3 IK分词功能测试

IK 提供了两个分词算法 ik_smart ik_max_word
其中 ik_smart 为最少切分, ik_max_word 为最细粒度划分
我们分别来试一下
1 )最小切分:
请求体:
{ 
	"analyzer":"ik_smart", 
	"text":"我是程序员" 
}

postmane 截图:

 

 2)最细切分:在浏览器地址栏输入地址

请求URL: post  http://127.0.0.1:9200/_analyze?pretty=true

请求体:

{ 
	"analyzer":"ik_max_word", 
	"text":"我是程序员" 
}

postman 截图:

6.4 修改索引库的mapping 映射

1、删除原有的blog2 索引库

delete http://localhost:9200/blog2
2、创建 blog2 索引,此时分词器使用 ik_max_word
put http://localhost:9200/blog2

请求体:

{ 
    "mappings": { 
        "article": { 
            "properties": { 
                "id": { 
                    "type": "long", 
                    "store": true 
                    
                }, 
                "title": { 
                    "type": "text", 
                    "store": true, 
                    "index":true,  
                    "analyzer":"ik_max_word" 
                }, 
                "content": { 
                    "type": "text", 
                    "store": true, 
                    "index":true, 
                    "analyzer":"ik_max_word" 
                }  
            }  
        }  
    }  
} 

3、创建文档

post http://localhost:9200/blog2/article/1

请求体:

{ 
    "id":1, 
    "title":"ElasticSearch是一个基于Lucene的搜索服务器", 
    "content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时 搜索,稳定,可靠,快速,安装使用方便。"  
} 
4、再次执行queryString 查询
请求URL:post  localhost:9200/blog2/article/_search
请求体:
{ "query": { "query_string": { "default_field": "title", "query": "搜索服务器" } } }
 
postman 截图:
 
检索结果:

 

5、再次执行trem 测试

请求URL:post  localhost:9200/blog2/article/_search
请求体:
{ "query": { "term": { "title": "搜索" } } }
 
postman 截图:

检索结果:

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们