1.介绍与安装
1.1.ElasticStack核心
The Elastic Stack,包括 Elasticsearch、Kibana、Beats 和Logstash(也称为ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。
ES(ElaticSearch)是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
1.2.ES And Solr
目前流行的两个搜索引擎软件(Elasticsearch和 Solr)都是基于Lucene
搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作修改、添加、保存、查询等等都十分类似。
Lucene
是Apache
软件基金会Jakarta
项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在 Java开发环境里
Lucene
是一个成熟的免费开源工具。Lucene
是目前最受欢迎的免费Java信息检索程序库。但
Lucene
只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。
Elasticsearch和 Solr对比
Elasticsearch
- 虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。
- 提交者来自单个公司
- 增长迅速,更稳定
- 文档组织良好,但缺乏好的示例和清晰的配置说明
- 如果
Elasticsearch
管理不当,这种易于部署和使用可能会成为一个问题。 - 如果应用使用的是
JSON
,那么Elasticsearch
是一个更好的选择。 - 易于安装且非常轻巧
Solr
- 拥有更大,更成熟的用户,开发者和贡献者社区。
- 贡献者和提交者来自许多不同的组织
- 更成熟
- 是一个非常有据可查的产品,具有清晰的示例和API用例场景
Solr
的schema.xml
和solrconfig.xml
有很好的文档记录。
为什么选择Elasticsearch
- 易于使用,在新开发者中更受欢迎,一个下载和一个命令就可以启动一切。
- 除了搜索文本之外还需要它来处理分析查询
- 需要分布式索引
- 需要良好可伸缩性和以及性能分布式环境
- 需要监控和指标
1.3.安装
安装和其他软件一样,常规安装
安装后目录
目录 | 含义 |
---|---|
bin | 可执行脚本目录 |
config | 配置目录 |
jdk | 内置 JDK 目录 |
lib | 类库 |
logs | 日志目录 |
modules | 模块目录 |
plugins | 插件目录 |
bin目录下的elasticsearch.bat
文件为启动ES服务
9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http协议 RESTful 端口。
问题
启动失败,通过路径访问追踪错误,如果是“空间不足”,修改config/jvm.options
配置文件
# 设置JVM初始内存为1G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
# Xms represents the initial size of total heap space
# 设置JVM最大可用内存为1G
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
Elasticsearch
是使用java开发的,7.8 版本的ES需要JDK版本1.8以上,默认安装包带有jdk环境,如果系统配置了JAVA_HOME,那么使用系统默认的JDK,如果没有配置使用自带的JDK
1.4.数据格式
Elasticsearch
是面向文档型数据库,一条数据在这里就是一个文档。
Elasticsearch
存储文档数据和关系型数据库MySQL
存储数据进行类比
ES
里的Index
可以看做一个库,而Types
相当于表(在7.x版本中已经被删除),Documents
则相当于表的行。
2.基本操作
2.1.HTTP中使用索引操作
2.1.1.创建索引
http://ip地址:9200/创建的索引名字
使用PUT方式请求
注意:创建索引库的分片数默认1片,在7.0之前的Elasticsearch
版本中,默认5片
如果重复添加索引,会返回错误信息
2.1.2.获取单个索引
http://ip地址:9200/要查询的索引名字
使用GET方式请求
2.1.3.获取全部索引
http://ip地址:9200/_cat/indices?v
使用GET方式请求
_cat:查看
indices:表示索引
2.1.4.删除索引
http://ip地址:9200/要删除的索引名字
使用DELETE方式请求
2.2.HTTP中使用文档操作
2.2.1.创建文档
请求路径
http://ip地址:9200/索引名字/要创建的文档名字
请求方式:POST
请求体内容(JSON格式)
{
"title":"电饭煲",
"price":399.00
}
上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。
如果想要自定义唯一性标识,需要在创建时指定
http://ip地址:9200/索引名字/文档名字/指定id
注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
2.2.2.查看单个文档
请求路径
http://ip地址:9200/索引名字/要查看的文档名字/id
请求方式:GET
2.2.3.查询所有文档
请求路径
http://ip地址:9200/索引名字/_search
请求方式:GET
2.2.4.修改文档所有内容
请求路径
http://ip地址:9200/索引名字/文档名字/id
请求方式:POST
请求体内容(JSON格式)
{
"title":"电饭煲",
"price":499.00
}
2.2.5.修改文档局部内容
请求路径
http://ip地址:9200/索引名字/_update/id
请求方式:POST
请求体内容(JSON格式)
{
"doc":{
"price":3000.00
}
}
查询
2.2.6.删除文档
逻辑删除
请求路径
http://ip地址:9200/索引名字/文档名字/id
请求方式:DELETE
2.2.7.条件删除文档
请求路径
http://ip地址:9200/索引名字/_delete_by_query
请求方式:POST
请求体内容(规则):
详细在2.4
2.3.HTTP中使用映射操作
创建索引需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
2.3.1.创建映射
请求路径
http://ip地址:9200/索引名字/_mapping
请求方式:PUT
请求头内容为规则
{
"properties": {
"字段1":{
"type": "text",
"index": true
},
"字段2":{
"type": "text",
"index": false
},
"字段3":{
"type": "long",
"index": false
}
}
type(类型):
String 类型
text:可分词
keyword:不可分词,数据会作为完整字段进行匹配
Numerical:数值类型
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
Date:日期类型
Array:数组类型
Object:对象
index:是否索引,默认为true,不进行任何配置,所有字段都会被索引。
true:字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
store:是否将数据进行独立存储,默认为 false
原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
analyzer:分词器,这里的ik_max_word即使用ik分词器
2.3.2.查看映射
请求路径
http://ip地址:9200/索引名字/_mapping
请求方式:GET
2.3.3.索引映射关联
请求路径
http://ip地址:9200/索引名字
请求方式:PUT
请求体内容
2.4.HTTP中使用高级查询
2.4.1.查询所有文档
{
"query": {
"match_all": {}
}
}
- query:查询对象,里面可以有不同的查询属性
- match_all:查询所有
2.4.2.匹配查询
{
"query": {
"match": {
"字段名" : "查询内容"
}
}
}
- match:匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
2.4.3.字段匹配查询
{
"query": {
"multi_match": {
"query": "查询内容",
"fields": ["字段名1","字段名2"]
}
}
}
- multi_match:与match类似,不同的是它可以在多个字段中查询。
2.4.4.关键字精确查询
{
"query": {
"term": {
"字段名":{
"value":"查询内容"
}
}
}
- term:精确的关键词匹配查询,不对查询条件进行分词。
2.4.5.多关键字精确查询
{
"query": {
"terms": {
"字段名":["查询内容1","查询内容2"]
}
}
}
- terms:和term查询一样,但它可以指定多值进行匹配。
2.4.6.指定查询字段
方式1:_source
{
"_source": ["返回字段1","返回字段2"],
"query": {
{
查询条件
}
}
}
- 默认情况下,
Elasticsearch
在搜索的结果中,会把文档中保存在_source
的所有字段都返回。 - 如果我们只想获取其中的部分字段,我们可以添加
_source
的过滤
方式2:includes与excludes
- includes:指定想要显示的字段
- excludes:指定不想要显示的字段
{
"_source":{
"includes": ["字段1","字段2"] 或者
"excludes": ["字段1","字段2"]
},
"query": {
{
查询条件
}
}
}
2.4.7.组合查询
{
"query": {
"bool": {
"must": [
{
查询条件
}
],
"must_not": [
{
查询条件
}
],
"should": [
{
查询条件
}
]
}
}
- bool:把各种其它查询通过
must
(必须 )、must_not
(必须不)、should
(应该)的方式进行组合
2.4.8.范围查询
{
"query": {
"range": {
"字段名": {
"gte": 大于等于,
"lte": 小于等于
}
}
}
-
range:查询找出那些落在指定区间内的数字或者时间
操作符 说明 gt 大于> gte 大于等于>= lt 小于< lte 小于等于<=
2.4.9.模糊查询
{
"query": {
"fuzzy": {
"字段名": {
"value": "查询内容"
}
}
}
}
- 返回包含与搜索字词相似的字词的文档
- 编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括
- 更改字符(box → fox)
- 删除字符(black → lack)
- 插入字符(sic → sick)
- 转置两个相邻字符(act → cat)
- 为了找到相似的术语,
fuzzy
查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。 - 然后查询返回每个扩展的完全匹配。通过
fuzziness
修改编辑距离。 - 一般使用默认值AUTO:根据术语的长度生成编辑距离
2.4.10.单字段排序
{
"query": {
查询条件
},
"sort": [{
"字段名": {
"order":"desc"
}
}
}
- sort:按照不同的字段进行排序,并且通过
order
指定排序的方式。- desc:降序
- asc:升序。
2.4.11.多字段排序
{
"query": {
查询条件
},
"sort": [{
"字段名1": {
"order":"排序方式"
},
"字段名2": {
"order":"排序方式"
}
}
}
2.4.12.高亮查询
{
"query": {
查询条件
},
"highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {
"字段名": {}
}
}
}
-
ES可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用match查询的同时,加上一个
highlight
属性- pre_tags:前置标签
- post_tags:后置标签
- fields:需要高亮的字段
- title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空
2.4.13. 分页查询
{
"query": {
查询条件
},
"from": 0,
"size": 2
}
- from:当前页的起始索引,默认从 0 开始。
from = (pageNum - 1) * size
- size:每页显示多少条
2.4.14.聚合查询
{
"aggs":{
"聚合函数名字":{
"max(聚合函数)":{
"field":"字段名"
}
},
}
- 聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的group by
- 还有其他的聚合,例如取最大值、平均值等等。
2.4.15.桶聚合查询
{
"aggs":{
"名字":{
"terms":{
"field":"字段"
}
}
},
}
2.5.java中使用索引操作
2.5.1.添加依赖
2.5.2.创建索引
2.5.3.查看索引
2.5.4.删除索引
2.6.java中使用文档操作
2.6.1.添加依赖
准备一个User类
2.6.2.创建文档
2.6.3.修改文档
2.6.4.查询文档
2.6.5.删除文档
2.6.6.批量新增
2.6.7.批量删除
2.7.java中使用高级查询
2.7.1.查询所有
2.7.2.精确查询
2.7.3.分页查询
2.7.4.数据排序
2.7.5.过滤字段
2.7.6.组合查询
2.7.7.范围查询
2.7.8.模糊查询
2.7.9.高亮查询
这里没显示是因为这个是网页的显示效果,需要在网页才能看到
2.7.10.聚合查询
其他的操作都在
举例一个