elasticsearch基础操作

说明:本文内容基于elasticsearch7.15.1版本进行操作

1什么是elasticsearch

Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
  Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。
  为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。
  当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:

一个分布式的实时文档存储,每个字段可以被索引与搜索;
一个分布式实时分析搜索引擎;
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。
由于Elasticsearch的功能强大和使用简单,维基百科、卫报、Stack Overflow、GitHub等都纷纷采用它来做搜索。现在,Elasticsearch已成为全文搜索领域的主流软件之一。

2 Elasticsearch基本概念

全文搜索(Full-text Search)
  全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
  在全文搜索的世界中,存在着几个庞大的帝国,也就是主流工具,主要有:

Apache Lucene
Elasticsearch
Solr
Ferret

2.1 节点 & 集群(Node & Cluster)

Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个Elasticsearch实例。单个Elasticsearch实例称为一个节点(Node),一组节点构成一个集群(Cluster)。

2.2 分片和副本(shard & replica)

⼀个索引可以存储超出单个结点硬件限制的⼤量数据。⽐如,⼀个具有10亿⽂档的索引占据1TB的磁盘 空间,⽽任⼀节点都没有这样⼤的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问 题,Elasticsearch提供了将索引划分成多份的能⼒,这些份就叫做分⽚。当你创建⼀个索引的时候,你 可以指定你想要的分⽚的数量。每个分⽚本身也是⼀个功能完善并且独⽴的“索引”,这个“索引”可以被 放置到集群中的任何节点上。
分片很重要,主要有两⽅⾯的原因:
1)允许你⽔平分割/扩展你的内容容 量。
2)允许你在分⽚(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提⾼性能/吞吐量。

2.3 索引(Index)

Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库里的数据库的概念。另外,每个Index的名字必须是小写。

2.4 类型(type)

在⼀个索引中,你可以定义⼀种或多种类型。⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有⼀组共同字段的⽂档定义⼀个类型。 类似数据库表 在7.0之后,类型只有⼀种 _doc。

2.5文档(Document)

Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。类似于数据库中的每条数据。

2.6 文档元数据(Document metadata)

文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。

2.7 字段(Fields)

每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。
  在 Elasticsearch 中,文档(Document)归属于一种类型(Type),而这些类型存在于索引(Index)中,下图展示了Elasticsearch与传统关系型数据库的类比:


9419034-4f8eb4926bc326de.png

3 操作

Elasticsearch提供了多种交互使用方式,包括Java API和RESTful API ,本文主要介绍RESTful API 。所有其他语言可以使用RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。甚至,你还可以使用 curl 命令来和 Elasticsearch 交互。
  一个Elasticsearch请求和任何 HTTP 请求一样,都由若干相同的部件组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

返回的数据格式为JSON,因为Elasticsearch中的文档以JSON格式储存。其中,被 < > 标记的部件:

部件 说明
VERB 适当的 HTTP 方法 或 谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE。
PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)
HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (如果请求需要的话)

对于HTTP方法,它们的具体作用为:

HTTP方法 说明
GET 获取请求对象的当前状态
POST 改变对象的当前状态
PUT 创建一个对象
DELETE 销毁对象
HEAD 请求获取对象的基础信息

说明:以下内容实用elasticsearch-head操作内容见截图(es版本为7.15.1)

3.1创建索引

索引名称app_user
索引内容 用户包含的内容有:
主键id,姓名user_name,身份证号码id_card,性别sex,职业occupation
创建索引

{
           "settings":{
              "number_of_shards":5,
              "index.refresh_interval": "5s"
           },
           "mappings":{
              "properties":{
                 "id":{
                    "type":"keyword"
                 },
                 "user_name":{
                    "type":"text"
                 },
                 "id_card":{
                     "type":"text"
                 },
                 "sex":{
                    "type":"keyword"
                 },
                 "occupation":{
                    "type":"keyword"
                 }
              }
      }
}
创建索引.png

显示创建成功,查看创建的索引


展示索引.png

3.2 插入文档

当需要设置数据id的时候我们需要在数据中传入需要设置的id
首先查询索引为空


查询索引为空.png
{
"id": "001",
"user_name": "花胡子",
"id_card": "001",
"sex": "男",
"occupation": "dba"
}

当需要设置数据id的时候我们需要在数据中传入需要设置的id如下图所示:

app_user/_doc/001
插入文档.png

当不需要id时候可以不写让他自动生成

app_user/_doc
插入文档

3.3查看插入结果

查询结果.png

3.4 修改数据

修改字段数据:一是通过PUT 直接覆盖,二是通过POST /app_user/_update/001 修改

请求url:http://111.11.11.111:9200/es的index/es的type(_doc)/要修改文档的ID/_update/
image.png

也可以进行复杂查询更新 类似

POST app_user/_update_by_query
{
  "script": {
    "source": "ctx._source['ipsub']=0" 
  },
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "ipsub"
          }
        }
      ]
    }
  }
}

3.5 删除数据

delete  app_user/_doc/001

3.6 删除索引

delete  app_user

这里做简单介绍,后续文章进行详细操作介绍。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,468评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 11,891评论 0 2
  • 今天上午陪老妈看病,下午健身房跑步,晚上想想今天还没有断舍离,马上做,衣架和旁边的的布衣架,一看乱乱,又想想自己是...
    影子3623253阅读 8,025评论 3 8

友情链接更多精彩内容