一、前言检索功能是应用中非常常见的功能而开源的Elasticsearch是全文搜索引擎的首选Elasticsearch是一个底层基于Lucene的分布式搜索服务Lucene是开
一、前言
检索功能是应用中非常常见的功能 而开源的Elasticsearch是全文搜索引擎的首选
Elasticsearch是一个底层基于Lucene的分布式搜索服务 Lucene是开源软件工具包 并不能直接使用
而Elasticsearch相当于是对其的封装 且提供了Restful风格的API 采用多shard(分片)的方式保证数据安全 还提供了自动resharding的功能
github等大型的站点也采用了Elasticsearch作为其搜索服务引擎
Elasticsearch可以快速存储 搜索和分析海量数据
二、安装
用Docker的方式安装
首先 要下载Elasticsearch的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:6.7.0
然后是启动容器
Elasticsearch默认使用9200
端口进行web通信 分布式情况下Elasticsearch各个节点之间通信使用9300
端口
docker run -d -p 9200:9200 -p 9300:9300 --name ES01 02982be5777d
然后可在浏览器访问ip:9200
若出现如下数据 则启动成功:
若出现9200端口无法访问的情况
请参看鄙人另一篇博客:完美解决虚拟机安装Elasticsearch报错:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase
三、使用
Elasticsearch是【面向文档】的
这就意味着 它存储的是整个对象或文档
Elasticsearch不仅是存储文档 而且会索引每个文档的内容 使之可以被检索
在Elasticsearch中 可对文档进行索引 检索 排序和过滤——而不是仅仅对行列数据
这是一种完全不同的思考数据的方式 也是Elasticsearch能支持复杂全文检索的原因
Elasticsearch使用JSON(Javascript Object Notation)作为文档的序列化格式
JSON 序列化为大多数编程语言所支持 并且已经成为NoSQL领域的标准格式 它简单 简洁 易于阅读 有轻量级和跨平台的优势
基本概念:
存储数据到Elasticsearch的行为叫做【索引】 但在索引一个文档之前 需要先确定将文档存储在哪里
(这里的索引是动词
索引一个文档 就是存储一个文档到一个 索引中以便被检索和查询
类似于SQL语句中的INSERT关键词)
一个Elasticsearch集群可以包含多个[索引] 相应的每个索引可以包含多个[类型]
这些不同的类型存储着多个[文档] 每个文档又有多个[属性]
(这里的索引是名词 类似于传统关系型数据库中的一个数据库 是一个存储关系型文档的地方)
若用MySQL作比较 就是:
- Elasticsearch的的索引相当于MySQL的数据库
- Elasticsearch的类型相当于MySQL的表
- Elasticsearch的文档相当于MySQL的记录
- Elasticsearch的属性相当于MySQL的字段
注:在Elasticsearch6.0及以上的版本不允许一个索引下面有多个类型
1、增删改查
①、添加
要实现添加其实很简单
只需要发送一个PUT
请求即可往指定索引的指定类型里存入一个文档
语法:
PUT请求 ----> ip:端口/索引名称/类型名称/编号
内容:
{要添加的JSON数据
}
例:
PUT请求 ----> ip:端口/zjitc/student/1
{"id" : "1","name" : "陈涛"
}
②、获取/查询
同样的 只需要发送一个GET
请求即可获取一个指定文档:
语法:
GET请求 ----> ip:端口/索引名称/类型名称/编号
例:
GET请求 ----> ip:端口/zjitc/student/1
③、删除
发送一个DELETE
请求即可删除一个指定文档
语法:
DELETE请求 ----> ip:端口/索引名称/类型名称/编号
例:
DELETE请求 ----> ip:端口/zjitc/student/3
④、判断是否存在
发送一个HEAD
请求即可判断是否存在指定文档:
语法:
HEAD请求 ----> ip:端口/索引名称/类型名称/编号
例:
HEAD请求 ----> ip:端口/zjitc/student/3
不会有返回数据 若存在该数据 则返回200
若不存在 则返回404
⑤、更新
PUT
还能用于更新文档
语法:
PUT请求 ----> ip:端口/索引名称/类型名称/编号
内容:
{JSON数据
}
例:
PUT请求 ----> ip:端口/zjitc/student/1
{"id" : "1","name" : "王王涛"
}
2、高级搜索
①、搜索全部
使用_search
例:
GET请求 ----> ip:端口/zjitc/student/_search
②、条件搜索
命令行语法
使用_search?q=属性名:属性值
例:
GET请求 ----> ip:端口/zjitc/student/_search?q=id:2
能够根据相关性的得分将结果进行排序 类似于Redis的SortedSet
查询表达式语法
轻量搜索(命令行语法)可以通过命令非常方便地进行临时性的搜索 但它有自身的局限性
Elasticsearch提供了一个丰富灵活的查询语言 叫做【查询表达式】 它支持构建更加复杂和健壮的查询
单条件搜索:
语法:
POST请求 ----> ip:端口/索引名称/类型名称/_search
内容:
{"query" : {"match" : {"搜索条件key" : "搜索条件value"}}
}
例:
POST请求 ----> /zjitc/student/_search
{"query" : {"match" : {"id" : "1"}}
}
复杂搜索(多条件搜索):
通过添加filter来进行过滤查询结果
语法:
POST请求 ----> ip:端口/索引名称/类型名称/_search
内容:
{"query" : {"bool": {"must": {"match" : {"首选搜索条件key" : "首选搜索条件value" }},"filter": {"range" : {"次选搜索条件key" : { "判断符" : 次选搜索条件value } }}}}
}
例:
POST请求 ----> ip:端口/zjitc/student/_search
{"query" : {"bool": {"must": {"match" : {"name" : "涛" }},"filter": {"range" : {"num" : { "gt" : 1 } }}}}
}
③、全文搜索
只要目标字段包含搜索的条件中的值 都能查询出来
语法:
POST请求 ----> ip:端口/索引名称/类型名称/_search
内容:
{"query" : {"match" : {"搜索条件key" : "搜索条件value"}}
}
例:
POST请求 ----> ip:端口/zjitc/student/_search
{"query" : {"match" : {"about" : "rock climbing"}}
}
④、短语搜索
精确匹配一系列单词或短语
仅匹配同时包含“单词1”和“单词2” 并且 二者以短语“单词1 单词2”的形式紧挨着的记录
语法:
POST请求 ----> ip:端口/索引名称/类型名称/_search
内容:
{"query" : {"match_phrase" : {"搜索条件key" : "搜索条件value"}}
}
例:
POST请求 ----> ip:端口/zjitc/student/_search
{"query" : {"match_phrase" : {"hobby" : "watch TV"}}
}
在上述例子中 只会匹配hobby属性的值带有连着的watch TV的文档
若带有watch或TV 都不会匹配到
⑤、高亮搜索
在每个搜索结果中高亮部分文本片段 以便让用户知道为何该文档符合查询条件
语法:
POST请求 ----> ip:端口/索引名称/类型名称/_search
内容:
{"query" : {"match_phrase" : {"搜索条件key" : "搜索条件value"}},"highlight": {"fields" : {"要高亮的属性名" : {}}}
}
例:
POST请求 ----> ip:端口/zjitc/student/_search
{"query" : {"match_phrase" : {"name" : "涛"}},"highlight": {"fields" : {"name" : {}}}
}