前言
安装完 ES 、并了解完 ES 的相关概念后,这篇文章我们来深入学习一下 ES 的基本操作。ES 就像一个数据库,我们把数据存储在 ES 当中,在需要用的时候在进行查询。你也许会问,那么为什么不使用 MySQL 进行数据的存储与查询呢?因为 MySQL 使用 LIKE 这样的关键字进行搜索,通常这是低效的,而且没办法满足我们的多字段搜索需求;而 ES 则是利用了倒排索引的方法,将搜索的关键字与数据进行关联,让我们可以快速检索到数据。下面我们开始来如何使用 ES 存储和搜索数据之旅。
数据的存储与搜索
ES 存储的基本单位是文档(Document),文档是存储在索引(index)当中的,一个索引当中通常会包含多份文档,ES 当中可以存储多个索引,索引就是具有相同特性的文档的集合:比如公司人员的信息的索引、商品信息的索引等。以图书馆的书籍的存储与检索为例:每本书的信息用一个文档进行表示,多本书的话就是多份文档,而这些文档存储在哪呢?答案是存在索引当中。所以,刚开始时,我们必须要创建一个索引,才能往里面添加文档。ES 采用 RESTful 风格 API 对数据进行操作,我们可以在 Kibana 中使用相关的命令进行数据的存储与查询。
以下是一些常用的命令。
获取集群或者节点的信息
# 获取集群的健康信息
GET _cluster/health
# 获取节点状态信息
GET _nodes/stats
索引创建与查询
# 查看所有的索引
GET /_cat/indices?v
# 创建一个索引,用于存储文档
PUT index_name
文档创建、更新、删除
# 添加文档,自动生成主键
POST index_name/_doc
{
"field": "value"
}
# 添加文档,文档 ID 由用户设置,如果文档存在,则进行覆盖
PUT index_name/_doc/document_id
{
"field": "value"
}
# 添加文档,如果文档存在,则报错给出提示信息
PUT index_name/_create/document_id
{
"field": "value"
}
# 更新指定文档对应的字段和内容
POST index_name/_update/document_id
{
"doc": {
"field1": "value",
"field2": "value",
}
}
# 删除指定文档
DELETE index_name/_doc/id
文档的搜索与查询
- 简单查询
# 根据文档id读取索引中的文档
GET index_name/_doc/document_id
# 根据区间查询
GET index_name/_search
{
"query": {
"match": {
"field": {
"gte": "lowest value",
"lte": "highest value"
}
}
}
}
# 全文搜索,会对 search terms 进行分词,根据分词找到匹配的数据
GET index_name/_search
{
"query": {
"match": {
"field": {
"query": "search terms"
}
}
}
}
# 短语搜索,将短语当成一个整体进行完全匹配,比如匹配商品的标签
GET index_name/_search
{
"query": {
"match_phrase": {
"field": {
"query": "search phreas"
}
}
}
}
解释一下什么是分词:ES中的分词指将文本文档划分成一个一个的词条(Term)或符号的过程。分词的主要作用是将文本分割成词条,进行倒排索引,以供搜索。如下面使用 ik 分词器
进行分词的结果:
- 组合查询
# Bool Query
- must: defines all queries(criteria) a document MUST match to be returned as hits
返回所有条件都符合的搜索结果:必需要符合条件1和条件2...
GET index_name/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field1": "value"
}
},
{
"match": {
"field2": "value"
}
}
]
}
}
}
- must_not: defines queries(criteria) a document MUST NOT match to be included in the search results
符合某种条件的结果不返回
GET index_name/_search
{
"query": {
"bool": {
"must": {
"match_phrase": {
"field1": "value"
}
},
"must_not":[ # 符合这个条件的结果不返回
{
"match": {
"field2": "value"
}
}
]
}
}
}
- should: "nice to have" queries(criteria)
符合条件的结果会有更高的得分,会展示在搜索结果的更前面
GET news_headlines/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field1": "value"
}
}
],
"should":[
{
"match_phrase": {
"field2": "value"
}
}
]
}
}
}
- filter: 过滤符合条件的结果
GET news_headlines/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"field": "value"
}
}
],
"filter":{ # 筛选出符合这个时间区间的结果
"range":{
"date": {
"gte": "begin time",
"lte": "end time"
}
}
}
}
}
}
参考
- https://www.knowi.com/blog/what-is-elastic-search/
- https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html
个人博客:https://www.kangpeiqin.top
欢迎与我交流,关注公众号(sunny的技术小屋),获取更多技术相关知识