ElasticSearch
大数据的时代发展
ElasticSearch是基于Lucene的一个封装的,Lunece是一个用于文本搜索的函数库,其目标是为各种小型应用软件加入全文检索功能。(作者Doug Cutting)
Google针对Nutch中的一些问题,分享了一篇谷歌文件系统GFS(Google File System),为了解决存储海量搜索的数据而设计的文件系统。随后基于GFS实现了分布式文件存储系统,并命名为NDFS(Nutch Distributed File System),还介绍了Mapreduce编程模型,用于大规模数据集的并行分析运算。
大数据发展,谷歌发表论文BigTable,是一种分布式数据存储系统,用来处理海量数据的非关系性数据库。Doug Cutting 在Hadoop系统中加入了BigTable并命名为HBase。(Hadoop 、Hbase、MapReduce)。
Lunece
lunece的简单使用 自己看着之前的老师做的简单的实验,能够提供简单的入门。
lunece是一套信息检索工具包,jar包,不包含搜索引擎系统。其包含有索引结构、读写索引的工具、排序、搜索工具。
lunece和ElasticSearch关系:
ElasticSearch是基于Lucene的一个封装和增强。
Es是一个开源的分布式文件检索引擎,其近乎实时的存储、检索数据;本身扩展性好,可扩展到上百台服务器,处理pb级别的数据。使用Restful api来隐藏lunece的复杂性,让全文索引更简单。
ELK技术:ElasticSearch+logstash+Kibana
ElasticSearch与Solr
1.ElasticSearch解压就可以使用,Solr需要安装,稍微复杂
2.Solr利用Zookeeper进行分布式管理,ES自身携带分布式协调管理功能
3.Solr支持更多格式的数据,利用json、xml、csv,ES仅支持json文件格式
4.Solr官网提供的功能更多,ES本身侧重与核心功能,大多数使用第三方插件提供,使用Kibana
5.Solr查询更快,但更新索引慢,ES建立索引快,实时性查询快
6.Solr更加成熟,开源社区、用户更成熟,ES相对开发维护者较少,学习使用成本高
ElasticSearch安装
推荐网友提供的华为镜像下载地址(好用):
windows下应该下载三个工具的zip文件,直接解压即用。
按照狂神的课程,个人下载的是7.6.2版本。
解压es,其目录结构
bin 启动文件
config
log4j 日志配置文件
jvm.options java虚拟机相关设置,如果买的阿里云等设备内存等较小,需将jvm参数调节
elasticsearch.yml elasticsearch的相关配置文件,默认端口号9200
lib 相关的jar包
modules 功能模块
plugins 插件
启动bin目录下elasticsearch.bat,将es启动。
在浏览器端输入:localhost:9200会有
{
"name" : "AFABW-809061946",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "cu6diFVuQ36nvenA9z2PPw",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
安装可视化界面
课程中学习使用的head插件
依赖环境node.js
从github下载elasticsearch-head:传送门
加压后进入目录,使用npm命令进行安装
npm install
npm run start
##使用淘宝镜像更快一些
cnpm install
cnpm run start
浏览器中的会出现跨域的问题,因此需要设置:elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
测试连接访问:
将索引作为一个数据库。
简单了解ELK
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
安装Kibana
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在es索引中的数据。使用kibana,可以通过各种图表进行高级数据分析与展示,kibana使得海量数据更容易理解。操作简单、基于浏览器的用户界面可以快速穿件仪表板(dashboard)实时显示es查询动态。
ELK基本为拆箱即用,解压后即可使用,kibana依赖node.js环境,解压时间比较长久,默认的端口是5601。
启动kibana,bin目录下的libana.bat,打开即可使用。
浏览器输入localhost:5601,可视化界面以及开发工具。
开发工具(postman、head、谷歌插件)
该工具支持汉化,在config文件夹下找到kibana.yml文件,更改文件后重启
i18n.locale: "zh-CN"
汉化后的kibana
Es核心概念
专业名词:集群、节点、索引、类型、文档、分片、映射。Es是面向文档
Relational DB | Elasticsearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | types (不常用,会被弃用) |
行(rows) | documents |
字段(columns) | fields |
Es中包含多个索引(数据库),每个索引中可以包含多个类型,每个类型下又包含多个文档,每个文档包含有多个字段(列)。
物理设计 Es在后台把每个索引划分成多个分片,每份分片可以在集群中的不同服务器间迁移
逻辑设计 一个索引类型中,包含有多个文档,当索引一篇文档时,寻找的顺序是索引>>类型>>文档id
倒排索引
lunece底层使用倒排序索引,这种结构适用于快速的全文索引,一个索引有文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。
举例:
Study every day ,good good up to forever.
To forever,study every day,good good up.
创建倒排序索引,首先将文档拆分成独立的词(tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在那个文档中。下面的表格1表示出现过,0表示没有出现
term | doc1 | doc2 |
---|---|---|
study | 0 | 1 |
to | 1 | 0 |
every | 1 | 1 |
day | 1 | 0 |
forever | 1 | 1 |
Study | 1 | 0 |
To | 1 | 0 |
up | 1 | 1 |
例如搜索to forever时,文档1的匹配度更高,权重更大,文档二权重更低。
在Es中索引被分为多个分片,每份分片是lunece的索引,因此,一个elasticsearch索引是由多个lunece索引组成的。
Es核心是:索引、字段类型(映射关系)、文档
IK分词插件
0.ik分词器简单介绍
分词:即把中文或者别的划分为一个个关键字,我们在搜索时会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每一个字看做一个词,这是不符合中文分词的要求的,因此需要使用第三方的分词器解决分词问题。
ik分词器中的算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分
1.下载ik分析器
下载对应的ik版本,个人使用的是ES7.6.2,因此下载的ik为7.6.2,视频中使用7.6.1
2.将ik分词的jar包放在ES中的插件plugins目录下
3.重启Es、以及kibana
4.使用 elasticsearch-plugin list 命令查看ik分词器插件是否安装
5.使用kibana进行测试
自己定义ik分词器字典
在es的插件的ik分词文件夹下的config文件夹下有IKAnalyzer.cfg.xml将自己的词典配置在该文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 自己定义的词典文件mytest.dic-->
<entry key="ext_dict">mytest.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
如果自己有什么样的分词就自己定义分词的词典。
Rust风格
Rust是一种软件架构风格,不是一种标准,是提供一组设计原则和约束条件。主要用于客户端和服务器之间的交互类的软件,基于该风格的软件更加简洁更有层次,易于实现缓存机制。
Rust命令说明:
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
1.创建一个索引
##向服务器发送一个创建索引的命令
PUT /索引名/
类型名/文档id{请求体}
使用head查看如下,完成了索引的创建
2.关于类型
字符串类型: text keyword
数值类型:long、integer、short、byte、double、float、half float、scaled float
日期类型:date
布尔类型:boolean
二进制类型:binary
3.创建索引规则
类似于关系型数据库建表的过程
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}
创建规则
获取规则
GET /test2
查看默认的信息,默认会给定数据类型。
#使用命令查看索引库信息
GET _cat/indices?v
修改操作:
POST /test3/_doc/1/_update
{
"doc": {
"name": "星仔"
}
}
删除索引
##使用DELETE命令删除指定的索引或文档
DELETE test3
文档操作
较难,需掌握,基本操作与之前的索引较为相似
基本操作
1.添加一个用户(文档操作相当于关系型数据库中的一行数据)
PUT /xing/user/1
{
"name": "itxing",
"age": 25,
"desc": "最棒的星仔",
"tags": ["技术学习者","暖男","阳光"]
}
2.更新数据
PUT /xing/user/3
{
"name": "xiaomei",
"age": 29,
"desc": "职业前台",
"tags": ["旅游","美女","会聊"]
}
POST更新
POST /xing/user/2/_update
{
"doc": {
"desc": "使用E滑步"
}
}
3.简单的查询
GET xing/user/2 ##使用id查询
GET xing/user/_search?q=name:itxing ##name精确匹配
复杂操作
排序、分页、高亮、模糊查询、精准查询
GET xing/user/_search
{
"query": {
"match": {
"name": "itxing"
}
}
}
查询自定义字段的信息
GET xing/user/_search
{
"query": {
"match": {
"name": "itxing"
}
},
"_source": ["name","desc"]
}
对匹配的结果进行升序(asc)或降序(desc)排序,以及对数据分页,起始页以及每页显示的数据条数。
GET xing/user/_search
{
"query": {
"match": {
"name": "itxing"
}
},
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from": 0,
"size": 1
}
使用rust风格的分页: /search/{current}/{pagesize}
多条件查询,使用布尔值进行查询
must命令:多个条件全部符合,是一个且的关系
GET xing/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "itxing"
}
},
{
"match":{
"age": 26
}
}
]
}
}
}
should命令:多个条件只要符合一个就将其返回,是一个或的关系
must_not命令: 多个命令不符合的,相当于非的关系
过滤器
GET xing/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "itxing"
}
}
],
"filter": [
{
"range": {
"age": {
"lt": 26
}
}
}
]
}
}
}
gt 大于
gte 大于等于
lt 小于
lte 小于等于
匹配多个条件,多个条件使用空格分开
GET xing/user/_search
{
"query": {
"match": {
"tags": "男 技术"
}
}
}
精确查询
term命令:直接通过倒排序索引指定的词条进程精确查找的
关于分词:term直接查询精确的值 match会使用分词器解析(先分析文档,然后再通过分析的文档进行查询)
两个类型(重要)
text类型和keyword类型
//该分词不会将text中的内容拆分进行处理
GET _analyze
{
"analyzer": "keyword",
"text": "itxing学java"
}
//该分词将每个字符拆分进行处理
GET _analyze
{
"analyzer": "standard",
"text": "itxing学java"
}
keyword类型的字段不会被分词器解析
多个值精确匹配解析
GET testdb/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"t1": "22"
}
},
{
"term": {
"term": {
"t2": "25"
}
}
}
]
}
}
}
高亮查询
GET xing/user/_search
{
"query": {
"match": {
"name": "itxing学java"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
自定义高亮条件
GET xing/user/_search
{
"query": {
"match": {
"name": "itxing学java"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}