elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
文章目录
- 前言
- 一、基本概念
- 1. Node节点 与 Cluster集群
- 2. Index 索引
- 3. Document文档
- 4. Type类型
- 5. 逻辑对比
- 6. 物理设计
- 二、ES的命令风格
- 三、新建和删除index索引
- 四、分词器使用和学习
- 1. 理论学习
- 2. 使用kibana测试
- 五、数据操作
- 1. 创建索引
- 2. 字段类型总结
- 3. 查看规则信息
- 4. 系统命令
- 5 添加数据
- 6. 修改数据
- a. PUT修改(不推荐)
- b. _update修改(推荐)
- 7. 删除
- 7. 简单查询
- 8.复杂查询
- 9 过滤结果
- 10. 排序
- 11. 分页查询
- 12. 布尔查询
- 13. 过滤器
- 14. 空格 匹配多个条件
- 15. term 精确查询
- i. term分析
- ii. 两个类型 text keyword 细节分析
- a. 6版本创建索引,指定规则
- b. 7版本创建索引,指定规则
- c. **添加数据**
- d. `elasticsearch-head` 的Google插件,查看 `testdb` 索引数据
- e. `elasticsearch-head` 的Google插件,查看 `testdb` 映射规则
- f. 默认分词器测试:keyword
- g. 默认分词器测试:standard
- h. term 精确查找 text类型
- i. term 精确查找 keyword 类型
- j. 对h和i的测试进行 总结
- 16. 多个词精确拼配
- a. 添加多数
- b. 查看`elasticsearch-head` 的Google插件,查看 `testdb` 索引数据和映射规则。
- c. term 精确查询
- 17. 高亮显示
前言
- 首先本文借鉴了 阮一峰老师的博文 和 哔哩哔哩上狂神老师 的视频,在此感谢。
- 本文使用 kibana操作命令。
elasticsearch和kibana都是6.4.2版本
- elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
- elasticsearch学习二:使用springboot整合TransportClient 进行搭建elasticsearch服务
- elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
- elasticsearch学习四:使用springboot整合 rest 进行搭建elasticsearch服务
- elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
一、基本概念
全文搜索
属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。- 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
- Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。
Elastic 是 Lucene 的封装
,提供了 REST API 的操作接口,开箱即用
。
1. Node节点 与 Cluster集群
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
2. Index 索引
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
GET /_mapping?pretty=true
3. Document文档
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
{"user": "张三","title": "工程师","desc": "数据库管理"
}
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
4. Type类型
Document 可以分组,比如 weather
这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id
字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products
和logs
)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
下面的命令可以列出每个 Index 所包含的 Type。(和上面截图一样)
GET /_mapping?pretty=true
根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
5. 逻辑对比
上面说的 集群,节点,索引,类型,文档,分片(底层封装),映射
是什么呢?
怎么区分对比 非关系型数据库 elasticsearch 和 关系型数据库呢,elasticsearch是面向文档的
如下:对关系型数据库和elasticsearch客观的对比!
关系数据库 | 非关系数据库 |
---|---|
数据库 database | 索引 index |
表 table | type(7版本彻底被弃用) |
行 rows | document |
字段 column | field |
elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)。
6. 物理设计
elasticsearch 在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器间迁移。
集群的默认名称为 elasticsearch。
一个集群至少有一个节点,而一个节点就是一个 elasticsearch 进程,节点可以有多个索引默认的,如果你创建索引,那么索引将会有5个分片(primary shard,又称为主分片)构成的,每一个主分片会有一个副本(replica shard,又称赋值分片)
索引呗分为多个分片,没份分片是一个Lucene 的索引,所以一个elasticsearch索引是由多个Lucene索引组成的。因为elasticsearch使用Lucene作为底层。
二、ES的命令风格
一种软件架构风格,而不是标准,只是提供了一组设计原理和约束条件,它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
基本RESTFUL 命令说明:
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有文档 |
PUT
:一般为创建 索引、类型、文档POST
:添加数据,创建索引、类型,查询DELETE
:删除索引、文档GET
:查询
三、新建和删除index索引
- 创建索引index
PUT /weather
等价于
curl -X PUT 'localhost:9200/weather'
服务器返回一个 JSON 对象,里面的acknowledged字段表示操作成功。
- 然后,发出 DELETE 请求,删除这个 Index。
DELETE /weather
等价于
curl -X DELETE 'localhost:9200/weather'
四、分词器使用和学习
elasticsearch的查询,是通过分词器先进行分词,然后再使用倒排索引去匹配查询。
1. 理论学习
分词:即把一段中文或者别的划分为一个个的关键词, 我们在搜索时候, elasticsearch 分词器会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作
,默认的中文分词是将每字看成一个词,比如“我爱冯凡利” 会被分为“我”,“爱”,“冯”,“凡”,“利”,这显然是不符合要求的,所以我们需要安装中文分词器 ik 来解决这个问题。
ES默认的分词是英文分词,对中文分词支持的并不好。如果要使用中文,建议使用ik分词器!所以我们就需要安装ik中文分词。
IK提供了两个分词算法:ik_smart
和 ik_max_word
,其中 ik_mart 为最少切分,ik_max_word为最新粒度划分!一会我们测试!
安装在第一篇博客中已经介绍,传送门:elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
2. 使用kibana测试
ik_mart 为最少切分
ik_max_word为最新粒度划分,穷尽词库的可能。
输入
超级喜欢冯安晨java
发现问题:冯安晨被分开了,
这种自己需要的词,需要自己加到我们的分词器的字典中!
ik分词器增加自己的配置!
- ik分词器自定义配置,已经单写了一个博客:elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
设置完后,再来执行:
- 以后需要自己配置的分词就可以在自己定义的
dic
文件中进行配置即可!
五、数据操作
1. 创建索引
- 创建索引方式1,单纯创建索引
PUT /索引名
- 创建索引方式2,创建索引并添加数据,字段类型系统默认给出
这种方式会直接创建出索引名、类型、id,还会添家数据PUT /索引名/~类型名~/文档id {请求体}
- 案例
PUT /test1/type1/1 {"name": "冯安晨","age": 18 }
这样创建完索引、类型、id后,还添加了一个数据。
- 创建索引方式3,创建索引并指定字段类型
创建索引,指定类型名称,并指定字段(field)类型
PUT /test2 {"mappings": {"type2": {"properties": {"name": {"type": "text"},"age": {"type": "long"},"birthday": {"type": "date"}}}} }
2. 字段类型总结
那么上面的 name
这个字段用不用指定类型呢,毕竟我们关系型数据库是需要指定类型的!!
字符串类型
text、keyword
数值类型
long、integer、short、byte、double、float、half float、scaled float
日期类型
date
布尔值类型
boolean
二进制类型
binary
等等。。。
3. 查看规则信息
也就是获取看一下上面命令创建的详细情况
- GET 命令
GET /test1
:查看索引信息
如果自己的文档字段没有指定,那么 ES 会给我们默认配置字段类型!就是上面的test1
索引,没有指定字段类型,所以ES 默认指定类型。
4. 系统命令
通过 elasticsearch 命令查看 ES 的各种信息! 通过
GET _cat/
可以获得 ES 的当前很多信息!
GET _cat/indices/?v
:查看 索引情况
- 其他命令。
5 添加数据
默认指定数据的类型
PUT /fenganchen/user/1
{"name": "冯凡利","age": 18,"desc": "一顿操作猛如虎,一看工资2500","tags": ["技术宅", "温暖", "直男"]
}
6. 修改数据
a. PUT修改(不推荐)
像添加一样,进行修改,但是这个修改类似于覆盖,如果缺少一个字段,则消失一个字段
查看
GET /fenganchen/user/1
(下面讲)
修改
PUT /fenganchen/user/1 {"name": "冯凡利123","age": 18,"desc": "一顿操作猛如虎,一看工资2500","tags": ["技术宅", "温暖", "直男"] }
_version 代表被修改的次数
查看确认
GET /fenganchen/user/1
b. _update修改(推荐)
- 修改
POST fenganchen/user/1/_update
{"doc": {"name": "冯凡利java"}
}
2. 查看
7. 删除
7. 简单查询
GET fenganchen/user/1
- 简单条件查询
GET /fenganchen/user/_search?q=name:冯凡利 (报错,还未找到原因)GET /fenganchen/user/_search?q=age:18
8.复杂查询
- 多添加几个数据
PUT /fenganchen/user/2
{"name": "张三","age": 17,"desc": "法外狂徒张三","tags": ["技术宅", "温暖", "渣男"]
}PUT /fenganchen/user/3
{"name": "李四","age": 30,"desc": "mmp 不知怎么形容了","tags": ["靓女", "旅游", "唱歌"]
}
query关键字
:查询
match关键字
:匹配,这里的有很多选择,如:match_all:匹配全部,bool:返回布尔值,exists:是否存在等等。GET fenganchen/user/_search {"query": {"match": {"name": "冯凡利"}} }
3. 再添加一个数据,便于查询测试:
PUT /fenganchen/user/4
{"name": "冯凡利前端","age": 3,"desc": "一顿操作猛如虎,一看工资2500","tags": ["技术宅", "温暖", "直男"]
}
- 再次查询:如下图
hits:包括索引和文档信息、查询结果总数、查询出来具体文档
max_score:最大分数,这是下面数据中最大的匹配分数值,也是最合适的
_score:可以通过它来判断谁更加符合结果,每个数据中都有这个属性
_source:数据对象信息关键字。
9 过滤结果
不想显示那么多字段,只想显示其中的 name
和 desc
字段,可以使用 数据对象信息关键字 :_source
来限定显示的字段。
GET fenganchen/user/_search
{"query": {"match": {"name": "冯凡利"}},"_source": ["name", "desc"]
}
我们之后使用java操作es,所有的方法和对象就是这里面的key:这个key也就是 hits、score等关键字
10. 排序
GET fenganchen/user/_search
{"query": {"match": {"name": "冯凡利"}},"sort": [{"age": {"order": "asc"}}]
}
11. 分页查询
GET fenganchen/user/_search
{"query": {"match": {"name": "冯凡利"}},"sort": [{"age": {"order": "desc"}}],"from": 0,"size": 1
}
from: 从第几个数据开始
size:返回多少条数据(单页面的数据)
数据下标还是从0开始,和学的所有数据结构是一样的!
/search/{current}/{pagesize}
12. 布尔查询
- must(and) ,所有的条件都要符合,类似于:
where id=1 and name=xxx
GET fengfanli/user/_search {"query": {"bool": {"must": [{"match": {"name": "冯凡利"}},{"match": {"age": "18"}}]}} }
- should(or) ,所有的条件都要符合,类似于:where id=1 orname=xxx
GET fenganchen/user/_search {"query": {"bool": {"should": [{"match": {"name": "冯凡利"}},{"match": {"age": "18"}}]}} }
- ** must_not( not)** ,所有的条件都要符合,类似于:
where id != 1
GET fenganchen/user/_search {"query": {"bool": {"must_not": [{"match": {"age": 3}}]}} }
13. 过滤器
- 普通匹配查询
包含 冯凡利 字符串的都会被查找出来GET fenganchen/user/_search {"query": {"bool": {"must": [{"match": {"name": "冯凡利"}}]}} }
- 加入过滤器,进行过滤
filter
关键字,对查询的数据进行过滤。gt
大于gte
大于等于lt
小于lte
小于等于
GET fenganchen/user/_search {"query": {"bool": {"must": [{"match": {"name": "冯凡利"}}],"filter": {"range": {"age": {"gt": 3}}}}} }
上面的语句 便是对 查询出来的语句 进行过滤,过滤出
age 大于3 的数据
14. 空格 匹配多个条件
match 关键字 空格
多个条件,使用空格隔开
只要瞒住其中一个结果就可以查出
这个时候可以通过 _score 分值进行基本的判断
下面的查询语句意思:在tags 字段中找到有 男、技术 的数据给查询出来
GET fenganchen/user/_search
{"query": {"match": {"tags": "男 技术"}}
}
15. term 精确查询
i. term分析
term 查询
是直接通过倒排索引指定的词条进程精确的查找的!
关于分词
:
term :直接查询 精确的
match :会使用分词器解析!(先分析文档,然后再通过分析进行查询!)
ii. 两个类型 text keyword 细节分析
两个类型 text keyword 不能被分词器使用
text类型
:可以被分词
keyword类型
:不可以被分词
先创建索引,并指定属性规则,如下:
a. 6版本创建索引,指定规则
elasticsearch 6.X 创建索引 必须要指定类型,feng_type 就是索引的类型名称
```json
PUT testdb
{"mappings": {"feng_type": {"properties": {"name": {"type": "text"},"desc": {"type": "keyword"}}}}
}
```
b. 7版本创建索引,指定规则
elasticsearch 7.x 创建索引 不用指定类型,因为7版本废弃了类型关键词(这里不再演示,我这里使用的是 6.4.2 版本。)
```json
PUT testdb
{"mappings": {"properties": {"name": {"type": "text"},"desc": {"type": "keyword"}}}
}
```
c. 添加数据
```json
PUT testdb/feng_type/1
{"name": "冯凡利java name","desc": "冯凡利java desc"
}PUT testdb/feng_type/2
{"name": "冯凡利java name","desc": "冯凡利java desc2"
}
```
添加文档 1
添加文档 2
d. elasticsearch-head
的Google插件,查看 testdb
索引数据
e. elasticsearch-head
的Google插件,查看 testdb
映射规则
索引情况,能查看索引的 setting 详情
,和 mapperings 映射规则
包括类型、属性情况。
可以看到,name 属性 是 text 类型
的,desc 是 keyword 类型
的。
f. 默认分词器测试:keyword
KeywordAnalyzer 把整个输入作为一个单独词汇单元
,方便特殊类型的文本进行索引和检索。针对邮政编码,地址等文本信息使用关键词分词器进行索引项建立非常方便。
使用默认的 keyword
分词器进行分词,(说一下,ik分词器是中文分词器),这里看的出来没有被分析
g. 默认分词器测试:standard
英文的处理能力同于StopAnalyzer,支持中文采用的方法为单字切分。他会将词汇单元转换成小写形式,并去除停用词和标点符号。
使用默认的 standard
分词器进行分词,,这里看的出来被分析了
h. term 精确查找 text类型
i. term 精确查找 keyword 类型
j. 对h和i的测试进行 总结
testdb
索引中的 :
name
字段为 text类型
,
desc
字段为 keyword类型
。
但是 term 分别对其 精确查找时,却发现:
- 查找text类型的name字段时时,只要包含就好,也就是text类型可以被分词器解释
- 查找keyword 类型的 desc 字段时,必须全包含才行,也就是keyword类型把整个输入作为一个单独词汇单元 去匹配被分词器解释。
16. 多个词精确拼配
a. 添加多数
PUT testdb/feng_type/3
{"t1": "22","t2": "2020-4-6"
}PUT testdb/feng_type/4
{"t1": "33","t2": "2020-4-7"
}
b. 查看elasticsearch-head
的Google插件,查看 testdb
索引数据和映射规则。
- 索引数据
- 映射规则
c. term 精确查询
17. 高亮显示
- 高亮关键字:highlight
GET fenganchen/user/_search
{"query": {"match": {"name": "冯凡利"}},"highlight": {"fields": {"name": {}}}
}
- 自定义搜索高亮
GET fenganchen/user/_search
{"query": {"match": {"name": "冯凡利"}},"highlight": {"pre_tags": "<p class='key style='color:red'>","post_tags": "</p>", "fields": {"name": {}}}
}
这些 mysql也可以做,只是mysql效率比较低
- 匹配
- 按照条件匹配
- 精确匹配
- 区间范围匹配
- 多条件查询
- 高亮查询
elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)相关推荐
- 全文搜索引擎----ElasticSearch和Solr
全文搜索引擎 ElasticSearch 还是 Solr? 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量 ...
- 全文搜索引擎 Elasticsearch 入门概念
基本概念 Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例. 单个 Elastic 实例称为一个节点(nod ...
- 全文搜索引擎Elasticsearch,这篇文章给讲透了!(Elasticsearch技术原理及实现方式)
关于Elasticsearch的技术原理及实现方式看了两篇讲的非常好的文章,在这里分享给大家. 其中一篇是: Elasticsearch 技术分析(九):全文搜索引擎Elasticsearch,这篇文 ...
- Paper:机器学习、深度学习常用的国内/国外引用(References)论文参考文献集合(建议收藏,持续更新)
Paper:机器学习.深度学习常用的国内/国外引用(References)论文参考文献集合(建议收藏,持续更新) References 1.国外格式 [1] D. E. Rumelhart, G. E ...
- 全文搜索引擎 ElasticSearch 还是 Solr?
原文链接 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 So ...
- 全文搜索引擎Elasticsearch,这篇文章给讲透了!
于elasticsearch的深度好文. 生活中的数据 搜索引擎是对数据的检索,所以我们先从生活中的数据说起.我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据:也称作行数据,是由二 ...
- 全文搜索引擎ElasticSearch新手实战教程
全文搜索 属于最常见的需求,开源的 ElasticSearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.G ...
- 全文搜索引擎Elasticsearch入门教程
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...
- 全文搜索引擎Elasticsearch,这篇文章给讲透了
之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的 ...
- 全文搜索引擎 Elasticsearch 简介 及其与 Python 的对接实现
什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说,肯 ...
最新文章
- 我从500个技术号,选出这10个厉害的推荐给你!
- 一条进程的栈区、堆区、数据区和代码区在内存中的映射
- 安装完Visual Team System 2008 Team Explorer出错解决办法
- re-for-50-plz-50 寒假逆向生涯(6/100)
- CVPR 2019开源论文 | Rob-GAN:生成器、鉴别器以及对抗攻击者
- 结合提供者模式解析Jenkins源码国际化的实现
- oracle 存过调试 stepinto stepover stepout
- 程序员为什么热衷于造轮子,而不是硬照,升职加薪吗?
- HBase优化案例分析:Facebook Messages系统问题与解决方案
- javascript高级程序设计---document节点
- 文献阅读笔记【10】:基于小尺度分形维数的裂缝图像分割方法
- 信息传输技术主要是指计算机技术和网络技术,信息传输技术主要是指什么
- 骨传导蓝牙耳机什么牌子最好?骨传导蓝牙耳机排名
- 网络邻居没有查看工作组计算机,解决Windows 10 系统看不到网上邻居工作组里的其他计算机-win7网上邻居...
- 我的练习项目: 模拟淘宝搜索商品、添加商品到购物车功能、修改商品信息功能
- 弘辽科技:拼多多商品转化率多少正常?怎么提高?
- 2021最新微信域名链接检测工具 微信域名拦截检测接口
- android eventlog监听,Android EventLog总结
- solidworks重建模型好慢_这几个设置可以提高你的SolidWorks模型打开速度,快尝试一下...
- 用户和用户组变成了数字
热门文章
- Word中规范输入大写的中文日期(转)
- DFS判断回路及回路个数
- 洛谷 P4234 LCT + 排序 + 枚举
- Xcode8注释快捷键不能使用
- 辩证法——自然观、自然科学方法论和科学观
- python实现ORC/文字识别之pytesseract
- linux mono 安装步骤,如何在Ubuntu 18.04上安装Mono
- 放苹果问题(组合数学经典)
- 如何安装SQL server 2005 开发版
- DCOM配置出错: 不小心删除DCOM配置中,“我的电脑”属性的Everyone权限导致......