全文检索ElasticSearch(一篇就够了)
一 Elasticsearch的简介和安装
1.1 Elasticsearch是什么
Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。
ES使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
起源:Shay Banon。2004年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索引擎。封装了lucene,做出了开源项目compass。找到工作后,做分布式高性能项目,再封装compass,写出了elasticsearch,使得lucene支持分布式。现在是Elasticsearch创始人兼Elastic首席执行官。
1.2 Elasticsearch的功能
1 分布式的搜索引擎
分布式:Elasticsearch自动将海量数据分散到多台服务器上去存储和检索
2 全文检索
提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能
3 数据分析引擎(分组聚合)
最近一周笔记本电脑这种商品销量排名top10的商家有哪些?最近1个月访问量排名top3的新闻板块是哪些?
4 对海量数据进行近实时的处理
因为是分布式架构,Elasticsearch可以采用大量的服务器去存储和检索数据。可以实现秒级别的数据搜索和分析
1.3 Elasticsearch的优点
Elasticsearch的特点是它提供了一个极速的搜索体验。这源于它的高速(speed)。相比较其它的一些大数据引擎,Elasticsearch可以实现秒级的搜索,速度非常有优势。Elasticsearch的cluster是一种分布式的部署,极易扩展(scale )这样很容易使它处理PB级的数据库容量。最重要的是Elasticsearch是它搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果(relevance) 。
1.4 安装Elasticsearch Kibana
在阿里云上开放端口
9200 9300 5601
下载镜像
docker pull elasticsearch:7.4.2
docker pull kibana:7.4.2
创建ES实例
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
chmod 777 -R /mydata/elasticsearch
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms84m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
创建kibanna实例
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://外网ip:9200 -p 5601:5601 -d kibana:7.4.2
服务器重启 容器自动运行
docker update elasticsearch --restart=always
docker update kibana --restart=always
查看elasticsearch 和 kiban容器是否正在运行
docker ps
1.5 安装中文分词器
下载ik分词器
切换文件夹
cd /usr/software
/usr/software文件夹下创建ik文件夹
mkdir ik
切换到ik文件夹
cd ik
在此文件夹下 下载elasticsearch-analysis-ik-7.4.2.zip中文分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
解压安装分词器
安装unzip命令
yum install unzip解压 elasticsearch-analysis-ik-7.4.2.zip
unzip elasticsearch-analysis-ik-7.4.2.zip删除ik文件夹下的所有的zip文件(删除ik文件夹下的: elasticsearch-analysis-ik-7.4.2.zip)
rm -rf *.zip#将ik文件夹移动到 /mydata/elasticsearch/plugins文件夹下
cd ..
mv ik /mydata/elasticsearch/plugins重启下elasticsearch容器
docker restart elasticsearch
查看当前正在运行的容器,如果没有看到elasticsearch
docker ps
使用以下命令查看elasticsearch容器的日志
docker logs elasticsearch
使用kibana测试中文分词器浏览器中输入地址 http://自己的IP地址:5601/
POST _analyze
{
"analyzer": "ik_max_word",
"text": "南京市长江大桥"
}
运行结果
{"tokens" : [{"token" : "南京","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "长江大桥","start_offset" : 2,"end_offset" : 6,"type" : "CN_WORD","position" : 1},{"token" : "长江","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "大桥","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 3}]
}
1.6 扩展词典
1 cd /mydata/elasticsearch/plugins/ik/config 目录下,新增自定义词典
vim ext_dict.dic
按i键
输入: 江大桥
按"ESC"键
按:键 输入wq回车2 vi 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><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">ext_dict.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry
key="remote_ext_dict">http://192.168.211.130:8080/tag.dic</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>3 重启elasticsearch容器稍后片刻
docker restart elasticsearch
分词结果中出现了自定义分词 江大桥
{"tokens" : [{"token" : "南京","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "长江大桥","start_offset" : 2,"end_offset" : 6,"type" : "CN_WORD","position" : 1},{"token" : "长江","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "江大桥","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 3},{"token" : "大桥","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 4},{"token" : "doc","start_offset" : 6,"end_offset" : 9,"type" : "ENGLISH","position" : 5}]
1.7 Elasticsearch的基本概念
node
节点,部署Elasticsearch程序的服务器cluster
集群,多个节点组成的架构index
索引,相当于关系型数据库的databasetype
类型,对应于关系型数据库的tabledocument
文档,类似于关系型数据库的row
文档三元素
_index:文档对应的索引
_type:文档对应的类型
_ID:文档的唯一ID
二 Elasticsearch的快速实战
2.1 查看信息
GET _cat/indices 查看所有索引
GET _cat/nodes 查看所有节点
GET _cat/health 查看ES的健康状态
2.2 新增记录
PUT /索引的名字/类型的名子/主键的值
{
"field":"value",
"field":"value",
.........
}
如果要新增的这条记录在ES中不存在,下面的命令就是一个新增操作。
PUT /schools/student/1
{
"name":"scott"
}
如果要新增的这条记录在ES中存在,下面的命令就是一个更新操作。
PUT /schools/student/1
{
"name":"scott"
}
POST /索引的名字/类型的名子/主键的值
{
"field":"value",
"field":"value",
.........
}
POST 新增数据的时候,可以带id 也可以不带id。如果不带id的话,会自动生成id。如果带了id。这个id在ES中存在当前的POST操作就是一个更新的操作。如果id不存在则是一个新增的操作。
POST PUT 都可以用作新增可以用作修改。 POST 如果不指定id,会自动生成id。PUT必须指定id。
POST PUT 所带的ID相同,则执行更新操作。
乐观锁
ES中有个乐观锁的的概念
seq_no: 表示版本号。当作乐观锁来使用。
PUT /school/student/1?if_seq_no=4&if_primary_term=1
{
"name":"张三",
"age":30
}
2.3 查询记录
查询记录
GET /school/student/1
2.4 更新文档
POST /schools/student/1/_update
{
"doc":{
"name":"ford"
}
}
或者
POST /schools/student/1
{
"name":"ford"
}
或者
PUT /schools/student/1
{
"name":"ford"
}
POST 带_update进行更新的时候,会比较原来的值,如果值没有变化则不更新。
使用_update更新 doc关键字不能缺少,_update只更新指定字段的值,其他的字段不会删除。而其他的更新方式,不赋值的字段会直接删除。如下所示:
更新记录,给记录添加age属性
PUT /schools/student/1
{
"name":"ford",
"age":20
}
使用PUT命令或者是POST不带_update更新
PUT /schools/student/1
{
"name":"ford"
}
在查询此条记录
GET /schools/student/1
会发现age属性没有了。如果使用POST _update更新,则age属性还存在。
2.5 删除文档
delete /索引名/类型/_id
查询索引中的所有记录
GET /索引名/_search
{
"query": {
"match_all": {}
}
}
2.6 删除整个索引
delete /schools
2.7 映射操作
索引创建之后,等于有了关系型数据库中的database。
Elasticsearch7.x取消了索引type类型的设置。不允许指定类型,默认为_doc,但字段仍然是有的,我们需要设置字段的约束信息,叫做字段映射(mapping)Index-->DataBase
Type(_doc)-->Table
Document-->Row
字段的约束包括但不限于:
字段的数据类型
是否要存储
是否要索引
分词器
2.7.1 查看映射
GET /school/_mapping
三 Elasticsearch的高级应用
3.1 match查询 全文检索
GET /company-index/_search
{"query": {"match": {"job": "Java软件工程师"}}
}
3.2 match_phrase查询 短语查询 不用分词
GET /company-index/_search
{"query": {"match_phrase": {"job": "Java软件工程师"}}
}
3.2 multi_match查询
GET /company-index/_search
{"query": {"multi_match": {"query": "李四","fields": ["name","job"]}}
}
3.3 bool 复合查选
must
文档必须匹配这些条件才能被包含进来
must_not
文档必须不匹配这些条件才能被包含进来
should
如果文档满足should内的条件,将为该文档增加_score,否则无任何影响
filter
使用过滤模式来进行查询
term
精确查询,全文检索使用match,其他非text字段使用term。
GET /company-index/_search
{"query": {"bool": {"must": [{"match": {"job": "软件工程师"}}],"must_not": [{"match": {"name": "李四"}}],"should": [{"range": {"payment": {"gte": 9000,"lte": 20000}}}],"filter": {"term":{"_id":1}}}}
}
全文检索ElasticSearch(一篇就够了)相关推荐
- 从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路
1.引言 本文以设计淘宝网的后台架构为例,介绍从一百个并发到千万级并发情况下服务端的架构的14次演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知.文章最后汇总了一些 ...
- 面试被问到 ConcurrentHashMap答不出 ,看这一篇就够了!
本文汇总了常考的 ConcurrentHashMap 面试题,面试 ConcurrentHashMap,看这一篇就够了!为帮助大家高效复习,专门用"★ "表示面试中出现的频率,&q ...
- 新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和交流门槛,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- Matplotlib三维绘图,这一篇就够了
Matplotlib三维绘图,这一篇就够了 1. 效果图 1.1 3D线效果图 1.2 3D散点效果图 1.3 3D随机颜色散点效果图 1.4 3D散点不同mark点效果图 1.5 3D线框效果图 1 ...
- Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了
Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了 1. 单图单线 2. 单图多线不同样式(红色圆圈.蓝色实线.绿色三角等) 3. 使用关键字字符串绘图(data 可指定依赖值为: ...
- Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了
Hbase基础(特点.架构.应用场景.集群搭建.HA设计)这一篇就够了 1. Hbase特点 2. Hbase VS RDBMS 3. Hbase架构及版本选择 4. Hbase应用场景 5. Ntp ...
- Numpy掩码数组masked arrays,这一篇就够了
Numpy掩码数组masked arrays,这一篇就够了 1. 什么是掩码数组 2.示例 2.1 一个例子走进掩码数组 2.2 创建一个数组第二个值是无效的 2.3 创建一个数组所有靠近1.e20的 ...
- Java 使用itextPdf7操作pdf,写入照片这一篇就够了
Java 使用itextPdf7操作pdf,写入照片这一篇就够了 1. 效果图 1.1 M*N列图片(无边界&有边界) 1.2 图片重叠 1.3 文字背景图片 1.4 图片与文字相邻 & ...
- Matplitlib绘图入门1,这一篇就够了
Matplitlib绘图入门1,这一篇就够了 1. 绘制简单的图表(标题.标签轴.刻度轴.表说明) 2. 绘图辅助函数方法,绘制多个图(随机点绘制多个子图,点状.x状等) 3. 可交互式绘图(一图单线 ...
最新文章
- _reincarnation
- 使用阿里云Python SDK管理ECS安全组
- 深度网络pre-train对于深度网络的意义
- RMQ问题(区间求最值)
- uva 1339 题解
- 防止sql拼接的Java方法_JAVA程序防止SQL注入的方法
- 如何在屏幕实时显示键盘操作(独家分享)
- Python调用搜狗语音API实现文字转音频
- vue 日程表组件_vue 会议日程列表
- MATLAB之LU分解法(十)
- B站风清扬-Java面试总结
- 崛起的云平台,彰显信息国产化的中国力量
- Tomcat8启动不了的问题
- iOS开发---开发工具简介
- 017 | JavaWeb企业进销存管理系统源码附带毕业设计论文 | 大学生毕业设计 | 极致技术工厂
- 人员管理KPI和OKR
- 绿茶餐厅拟上市:年收入16亿,连续3年盈利,次于西贝和九毛九
- android之基于Zxing二维码扫描
- Windows程序内部运行原理(2)
- 网络虚拟化有几种实现方式_介绍几种网络营销的免费渠道推广方式
热门文章
- 京东面试官问哭的秒杀系统考点
- 图片转文字识别在线!图片转文字软件分享!​
- 飞机大战(wsad上下左右,空格发射子弹,击中敌机加一分,分数达到10,20,30难度增加,敌机飞出显示屏幕游戏失败)
- 1.3.1 Object类 equals,hashMode,toString重写, 包装类的装拆箱, 数学处理类
- Fabric代码解析第二讲,百度文库
- 2022 年 Java 面试总结,200 多页真题笔记和详解(含核心考点及 6 家大厂)
- Android性能测试工具腾讯GT的使用教程
- Python变量声明规范
- 关于vue组件封装以及插槽使用的操作
- shell 基础之cut命令