ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式
1.什么是ES
**ES** 全称 **ElasticSearch** 是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来。
Lucene是公认的迄今为止的最好用的搜索引擎库,但是他所提供的API对于我们使用者来说,是非常苦恼的,常要花费大量时间去熟悉学习。ES的出现就很好的解决了这个问题,良好的封装,易用的API,链式书写方式,开瓶即饮。
2.ES特点
**ES** 虽然是以Lucene核心库开发的,但是却不是以它作为核心,**ES** 的贴点体现在:*分布式实时文件存储,每个字段皆能索引* *集群,可扩展(理论上无上限)**高度集成的服务(RESTful风格的API,各语言客户端)**易学易用,开瓶即饮*
3.ES安装
3.1下载
[ES官方下载地址:](https://www.elastic.co/downloads/elasticsearch)
ES安装环境只依赖JDK,以5.2.2版本为例,下载对应的文件即可
3.2安装
将压缩包解压,然后在解压后的目录下找到*bin*文件夹,点击名为**elasticsearch.bat** 文件运行。
测试是否安装成功:访问:http://localhost:9200/
![安装成功:](https://img-blog.csdnimg.cn/2018110517350745.png)**注意**:如果本机内存过小,或者磁盘空间不足会启动失败,手动修改*config*文件夹下**jvm.options**文件中的参数。打开**jvm.options**文件,搜索-Xms,得到结果如下:
################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
# '#'代表的是注释, -Xms 最小占用内存 -Xm最大占用内存 如果修改,默认启动时为2gb 这里可以修改一下
-Xms200m
-Xmx200m
辅助管理工具Kibana5
这里介绍一款辅助学习工具,避免了使用cmd的尴尬场景
[Kibana5.2.2下载地址:](https://www.elastic.co/downloads/kibana)
- 解压并编辑config/kibana.yml,设置elasticsearch.url 的值为已启动的ES
- 启动Kibana5 : bin\kibana.bat
- 默认访问地址:http://localhost:5601
- 菜单:
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性
ES使用
ES数据管理
ES文档
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
ES存储的一个员工文档的格式示例:
{_index : “crm”,_type : “user”,就_id : 1, _source : {"email": "nxh@itsource.cn","name": "倪先华","info": {"addr": "四川省成都市","age": 30,"interests": [ "美食", "美女" ]},"join_date": "2016-06-01"}}
尽管原始的 employee对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在ES中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。
文档的必须三个节点:
- _index : “crm”, 文档存储位置(索引)
- _type : “user”,文档映射类型
- _id : 1,文档唯一标识(可以自定义也可以自动生成)
ES文档的CRUD
以员工对象为例,,类比传统的数据库来看:
- 关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列Column
- Elasticsearch -> 索引库Indices -> 类型Types -> 文档Documents -> 字段Fields
ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
//这里使用Kibana5编写的
# 创建crm
PUT crm# 保存数据
POST crm/user/1
{"age" : 1,"name": "fq"
}# 取值 (_source查看源数据)
GET crm/user/1//展示结果
{"_index": "crm","_type": "user","_id": "1","_version": 3,"found": true,"_source": {"age": 1,"name": "fq"}
}/*
这个API 似乎 允许你修改文档的局部,但事实上Elasticsearch
遵循与之前所说完全相同的过程,这个过程如下:
1. 从旧文档中检索JSON
2. 修改它
3. 删除旧文档
4. 索引新文档
*/
# 存在修改,不存在创建(先删除在创建)
POST crm/user/1
{"age" : 2,"name": "fqq"
}
# 取值(_source只看源数据)
GET crm/user/1/_source//展示结果
{"age": 2,"name": "fqq"
}# 删除文档
DELETE crm/user/1
//查询会查询不到,没有结果返回# 获取所有文档
GET _search# 分页查询
/*和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数:
size : 每页条数,默认 10
from : 跳过开始的结果数,默认 0
*/
GET _search?size=5&from=10
DSL查询与过滤
概念
由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。
//查询字符串模式:同样是使用Kibana5GET itsource/employee/_search?q=fullName:倪先华DSL模式:GET itsource/employee/_search{"query" : {"match" : {"fullName" : "倪先华"}}}
DSL查询
使用DSL查询,必须要传递query参数给ES。
GET _search{"query": YOUR_QUERY_HERE}# 实例一个完整查询/*查询公司员工性别为女的员工,并按照加入时间降序、年龄升序排列,最终返回第21条至30条数据(只返回名字、年龄和email字段)*/GET itsource/employee/_search{"query": {"match": {"sex":"女"}},"from": 20, "size": 10," _source": ["fullName", "age", "email"],"sort": [{"join_date": "desc"},{"age": "asc"}]}
DSL过滤
DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:
DSL过滤查询文档的方式更像是对于我的条件“有”或者“没有”,而DSL查询语句则像是“有多像”。
DSL过滤和DSL查询在性能上的区别:
- 过滤结果可以缓存并应用到后续请求。
- 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
- 过滤语句可有效地配合查询语句完成文档过滤。
原则上,使用DSL查询做全文本搜索或其他需要进行相关性评分的场景,其它全用DSL过滤
使用方式
{"query": {"bool": {# 必须条件"must": [{"match": {"description": "search" }}],# 过滤条件 "filter": {"term": {"tags": "lucene"}}}}
}//① 全匹配(match_all)
//普通搜索(匹配所有文档):
{"query" : {"match_all" : {}}
}
//如果需要使用过滤条件(在所有文档中过滤,红色部分默认可不写):
{"query" : {"bool" : {"must" : [{"match_all":{}}],"filter":{....}}}
}
/*② 标准查询(match和multi_match)
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符:*/
{"query": {"match": {"fullName": "Steven King"}}
}
//上面的搜索会对Steven King分词,并找到包含Steven或King的文档,然后给出排序分值。//如果用 match 下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed的字符串时,它将为你搜索你给定的值,如:
{ "match": { "age": 26 }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}//multi_match 查询允许你做 match查询的基础上同时搜索多个字段:
{"query":{"multi_match": {"query": "Steven King",
"fields": [ "fullName", "title" ]
}
}
}
/*上面的搜索同时在fullName和title字段中匹配。
提示:match一般只用于全文字段的匹配与查询,一般不用于过滤。*///③单词搜索与过滤(Term和Terms)
{"query": {"bool": {"must": { "match_all": {} }, "filter": { "term": { "tags": "elasticsearch" } } } }
}
//Terms搜索与过滤
{"query": {"terms": {"tags": ["jvm", "hadoop", "lucene"],"minimum_match": 2}}
}
//minimum_match:至少匹配个数,默认为1/*④ 组合条件搜索与过滤(Bool)
组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。
例如:查询爱好有美女,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人。*/
{"query": {"bool": {"must": [{"term": {"hobby": "美女"}}],"should": [{"term": {"hobby": "游戏"}},{"term": {"hobby": "运动"}}],"must_not": [{"range" :{"birth_date":{"lt": "1990-06-30"}}} ],"filter": [...],"minimum_should_match": 1}}
}
//提示: 如果 bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有 must子句,那么没有 should子句也可以进行查询。
/*
⑤ 范围查询与过滤(range)
range过滤允许我们按照指定范围查找一批数据:*/
{"query":{"range": {"age": {"gte": 20,"lt": 30}}}
}
//上例中查询年龄大于等于20并且小于30。
//gt:> gte:>= lt:< lte:<=/*⑥ 存在和缺失过滤器(exists和missing)*/
{"query": {"bool": {"must": [{"match_all": {}}],"filter": {"exists": { "field": "gps" }}}}
}
/*提示:exists和missing只能用于过滤结果。
⑦ 前匹配搜索与过滤(prefix)
和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’*/
{"query": {"prefix": {"fullName": "倪"}}
}
//上例即查询姓倪的所有人。/*⑧ 通配符搜索(wildcard)
使用*代表0~N个,使用?代表1个。*/
{"query": {"wildcard": {"fullName": "倪*华"}}
}
ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式相关推荐
- 分布式全文搜索引擎ElasticSearch
认识ElasticSearch 为什么要使用ElasticSearch 虽然全文搜索领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. 但是,Lucene只是一个库.想要 ...
- Elasticsearch(全文搜索引擎)
Elasticsearch 一. 简介 Elasticsearch是一个搜索引擎,它底层是基于Lucene来实现的. Lucene是一个Java库,它存在着一定的问题,如果项目的开发语言不是J ...
- ES(Elasticsearch)全文搜索引擎(最全)入门基本语法与在SpringBoot中的实战
注:本文较长,根据个人情况有些内容可以跳过,前面是基本的概述,中间是一些基于es的一个可视化工具进行操作,代码实现在最下边: 一.认识Elasticsearch 1.1.为什么要使用Elasticse ...
- 分布式全文搜索引擎——Elasticsearch
1.安装Elasticsearch a.下载:从官网下载 Elasticsearch,地址:https://www.elastic.co/cn/downloads/past-releases#elas ...
- ElasticSearch全文搜索引擎
一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以知道,ES的特点就在于灵活的搜索,其实E ...
- 一文看懂-ElasticSearch全文搜索引擎
一文看懂-ElasticSearch全文搜索引擎 一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以 ...
- ElasticSearch——全文搜索引擎
一.为什么需要全文搜索引擎? 首先先来了解一个概念,在我们生活中一般来说有两种数据:结构化数据.非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据: 非结构化 ...
- Elasticsearch实战---------相关名词介绍
ElasticSearch 分布式的搜索引擎和数据分析引擎 应用场景 1.可以处理海量数据 2.elk 优点 1.ES有分片的概念,一个大的索引会被自动分成多个分片来进行存储数据,使用分布式的架构对分 ...
- 为什么要用全文搜索引擎:全文搜索引擎 VS 数据库管理系统
正文一:Full Text Search Engines vs. DBMS 发表于2009年 正文二:Elasticsearch - A High-Performance Full-Text Sea ...
最新文章
- 第十二周项目三-数组类运算的实现
- mockito_Eclipse的Mockito模板
- Caused by: android.os.NetworkOnMainThreadException错误解决办法
- 多线程 java 实例_Java多线程实例学习
- PyTorch 1.0 中文官方教程:PyTorch 介绍
- JavaScript 必会的知识点
- hihocoder-Week195-奖券兑换
- wps linux 字体目录在哪个文件夹,WPS OFFICE怎么添加字体?(我下载的字体文件应当放那个文件夹?)...
- adb 黑域app_黑域ADB报错解决方法
- 游戏数据分析-玩家战力分析
- 手把手教你解决U盘快捷方式病毒
- 22.信息系统安全管理-策略7定.方案.安全体系架构.PKI.PMI
- 假期培训总结——初三寒假
- 用PS把一张图片变成素描画
- DeepLearning学习笔记(1)“调参之路”_ by HZC
- 分析股票怎么进行量化交易?
- pythonl练习1
- 2023年医院常用医疗设备维修培训计划
- 【Flutter实现表格上下左右滚动】
- node.js 安装,详细步骤教程
热门文章
- 【bzoj4715】囚人的旋律 dp
- html5果树,这5种阳台果树,产量高好养活,当年就能结果,再也不买水果吃了
- Unity3D显示中文字体
- 喜欢玩手游的小姐姐注意了!高颜值游戏专属低延迟蓝牙耳机推荐
- 计算机内存不足怎样解决,怎么解决电脑内存不足的问题
- Canence第11篇之Allegro16.6铺铜设置及删除死铜的方法
- linux系统基本命令实验原理,《操作系统原理与Linux》实验一 Linux基本命令.doc
- 10月15日深圳见!开放原子开源基金会·区块链工作组成立大会来了
- Linux内核第一宏:container_of
- Windows10 Edge 浏览器不能访问网页