目录
1、ElasticSearch简介
ElasticSearch:一个开源的分布式搜索和分析引擎
Elastic有一条完整的产品线:
Elasticsearch 分布式的搜索和分析引擎构建在Apache Lucene库之上
Kibana 数据可视化和仪表盘的工具
Logstash 数据收集,转换和传输工具
这三个就是大家常说的ELK技术栈
2、ElasticSearch特点
-
分布式,无需人工搭建集群
-
Restful风格,一切API都遵循Rest原则,容易上手
-
近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
Elasticsearch和MySQL的区别
数据模型:Elasticsearch 是一个基于 Lucene 的搜索引擎,MySQL 是一个关系型数据库管理系统(RDBMS)
索引和搜索:Elasticsearch 使用倒排索引作为主要的索引结构。MySQL 使用 B+树作为主要的索引结构。
性能和扩展性:Elasticsearch 是一个面向搜索(search)的数据库系统,它支持近实时(near real-time)的索引和查询,以保证数据操作的及时性和灵活性。MySQL 是一个面向事务(transaction)的数据库系统,它支持 ACID 特性(原子性、一致性、隔离性、持久性),以保证数据操作的正确性和完整性。
倒排索引
创建倒排索引是对正向索引的一种特殊处理,流程如下:
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash表结构索引
3、操作索引
3.1.基本概念
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
对比关系:
索引(indices)------------------Databases 数据库
类型(type)----------------------Table 数据表
文档(Document)-------------Row 行
字段(Field)---------------------Columns 列
详细说明:
概念 | 说明 |
---|---|
索引库(indices) | indices是index的复数,代表许多的索引, |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
是不是与Lucene和solr中的概念类似。
另外,在SolrCloud中,有一些集群相关的概念,在Elasticsearch也有类似的:
-
索引集(Indices,index的复数):逻辑上的完整索引
-
分片(shard):数据拆分后的各个部分
-
副本(replica):每个分片的复制
4、查询
我们从4块来学查询:
-
基本查询
-
_source
过滤 -
结果过滤
-
高级查询
-
排序
3.1.基本查询:
基本语法
GET /索引库名/_search
{
"query":{
"查询类型":{
"查询条件":"查询条件值"
}
}
}
这里的query代表一个查询对象,里面可以有不同的查询属性
-
查询类型:
-
例如:
match_all
,match
,term
,range
等等
-
-
查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解
3.1.1 查询所有(match_all)
示例:
GET /aa/_search
{
"query":{
"match_all": {}
}
}
-
query
:代表查询对象 -
match_all
:代表查询所有
3.1.2 匹配查询(match)
示例:
GET /aa/_search
{
"query":{
"match":{
"xxx":"xxx"
}
}
}
3.1.4 词条匹配(term)
term
查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串
GET /aa/_search
{
"query":{
"term":{
"xxx":"xxx"
}
}
}
3.1.5 多词条精确匹配(terms)
terms
查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:
GET /aa/_search
{
"query":{
"terms":{
"xxx":[xxx,xxx,xxx]
}
}
}
3.2.结果过滤
默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source
的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source
的过滤
3.2.1.直接指定字段
示例:
GET /blb/_search
{}
{
"_source": ["xxx","xxx"],
"query": {
"term": {
"xxx": "xxx"
}
}
}
3.2.2.指定includes和excludes
我们也可以通过:
-
includes:来指定想要显示的字段
-
excludes:来指定不想要显示的字段
二者都是可选的。
示例:
GET /blb/_search
{
"_source": {
"includes":["xxx","xxx"]
},
"query": {
"term": {
"xxx": "xxx"
}
}
}
与下面的结果将是一样的:
GET /aa/_search
{
"_source": {
"excludes": ["xxx"]
},
"query": {
"term": {
"xxx": "xxx"
}
}
}
3.3 高级查询
3.3.1 布尔组合(bool)
bool
把各种其它查询通过must
(与)、must_not
(非)、should
(或)的方式进行组合
GET /aa/_search
{
"query":{
"bool":{
"must": { "match": { "xxx": "xxx" }},
"must_not": { "match": { "xxx": "xxx" }},
"should": { "match": { "xxx": "xxx" }}
}
}
}
3.3.2 范围查询(range)
range
查询找出那些落在指定区间内的数字或者时间
GET /aa/_search
{
"query":{
"range": {
"xxx": {
"gte": 1000.0,
"lt": 2800.00
}
}
}
}
range
查询允许以下字符:
操作符 | 说明 |
---|---|
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
3.5 排序
3.4.1 单字段排序
sort
可以让我们按照不同的字段进行排序,并且通过order
指定排序的方式
GET /aa/_search
{
"query": {
"match": {
"xxx": "xxx"
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
3.4.2 多字段排序
假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:
GET /blb/_search
{
"query":{
"bool":{
"must":{ "match": { "XXX": "xxxx" }},
"filter":{
"range":{"price":{"gt":2000,"lt":3000}}
}
}
},
"sort": [
{ "price": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}