ElasticSearch之HTTP请求的简单操作

一、什么是ElasticSearch

Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

二、Elasticsearch入门

1. 下载

下载路径
官方文档

2.解压并启动

在这里插入图片描述
注意两个端口号:
(1)9300为ElasticSearch集群组件使用的端口号
(2)9200位浏览器访问的RestFul风格的端口

3.通过9200访问服务

看到该页面则说明启动成功
在这里插入图片描述

4.可能导致启动失败的原因

  1. 7.8以后的ElasticSearch需要JDK1.8以上,如果系统环境变量配置过JAVAHOME的话会优先使用系统配置的JDK,若系统没配置JAVAHOME则会使用自带的JDK
  2. 启动后闪退则修改/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

三、使用前必了解知识点

1.什么是RESTful

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI(Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和DELETE。
在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径,以及对资源进行的操作(增删改查)。

2.为什么要使用Postman

如果直接通过浏览器向 Elasticsearch 服务器发请求,那么需要在发送的请求中包含HTTP 标准的方法,而 HTTP 的大部分特性且仅支持 GET 和 POST 方法。所以为了能方便地进行客户端的访问,可以使用 Postman 软件。Postman 提供功能强大的 Web API 和 HTTP 请求调试。软件功能强大,界面简洁明晰、操作方便快捷,设计得很人性化。Postman 中文版能够发送任何类型的 HTTP 请求 (GET, HEAD, POST, PUT…),不仅能够表单提交,且可以附带任意类型请求体。

3.数据格式

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比。
在这里插入图片描述
ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个type,Elasticsearch 7.X 中, Type 的概念已经被删除了。

4.正向索引和倒排索引

用两张表格来简单区别一下

  1. 正向索引
idcontent
1001my name is zhangsan
1002my name is lisi
  1. 倒排索引
    这种情况下表(ElasticSearch的type)的概念已经逐渐弱化,现在这种概念已经被删除了。
keywordcontent
name1001,1002
zhang1001

5.常用的四种请求方式

GET、Delete、 POST、 PUT,其中GET、Delete和PUT这三种请求方式执行的结果是幂等的,简单来说就是每次执行的结果都是相同的,而POST是不幂等的,每次执行的结果不一定是一样的。
其中HEAD也是幂等的。

四、索引的操作

1.创建索引

  1. 创建一个shopping的索引,PUT方式下的127.0.0.1:9200/shopping
    在这里插入图片描述
  2. 如果重复创建
    在这里插入图片描述
  3. 如果使用不具有幂等性的POST方式创建

在这里插入图片描述

2.获取索引的相关信息

  1. 查询指定索引信息,GET方式下的127.0.0.1:9200/shopping
    在这里插入图片描述
  2. 查询所有索引的信息
    在这里插入图片描述

3.删除索引

  1. 删除指定索引,DELETE方式下的127.0.0.1:9200/shopping_1
    在这里插入图片描述
    再次查询发现的确删除成功
    在这里插入图片描述

五、文档操作

1.创建文档(自动生成id)

在指定索引shopping下创建文档:在POST方式下访问127.0.0.1:9200/shopping/_doc,因为创建时会创建一个id给文档,所有必须使用不具有幂等作用的post,如果我们给文档设定了指定id时则可以用其他方式。

{
  "name" : "PNING",
  "age": 18,
  "hobbies" :  ["eat","run"]
}

这种情况下如果重复运行则会创建多个具有不同id的文档
在这里插入图片描述

2.创建文档(指定id)

在指定索引shopping下创建文档:在POST方式下访问127.0.0.1:9200/shopping/_doc/1

{
  "name" : "PNING_1",
  "age": 18,
  "hobbies" :  ["eat","run"]
}

这种情况下如果重复运行则全量修改(可以理解为数据部分被覆盖)该id文档下的数据包括版本号。

  1. 使用POST创建
    在这里插入图片描述
  2. 使用PUT创建
    在这里插入图片描述

3.查询文档数据

  1. 查询指定id文档数据,在GET方式下访问127.0.0.1:9200/shopping/_doc/2,即可查询shopping索引下id为2的文档数据
    在这里插入图片描述

  2. 查询所有文档数据
    (1)URL方式:在GET方式下访问127.0.0.1:9200/shopping/_search,即可查询shopping索引下所以的文档数据
    在这里插入图片描述
    (2.)请求体方式:在GET方式下访问127.0.0.1:9200/shopping/_search

4. 修改文档数据

  1. 全量修改(覆盖存储的数据)
    使用指定id创建文档的方式(PUT和POST都可以),即可全量修改上一次的数据,因为我不小心多点了一次,所以版本现在是3
    在这里插入图片描述
  2. 局部数据修改(修改指定数据):在POST方式下访问127.0.0.1:9200/shopping/_update/1即可修改shopping索引下id为1的文档数据
{
    "doc" :{
          "hobbies" :  ["play"]
    }
}

在这里插入图片描述

六、删除文档

在DELETE方式下访问127.0.0.1:9200/shopping/_doc/1001即可删除shopping索引下id为1001的文档数据
在这里插入图片描述

七、条件查询

1.单条件查询

  1. URL查询:127.0.0.1:9200/shopping/_search?q=hobbies:play,查询shopping索引下hobbies内容为play的数据
    在这里插入图片描述
  2. 请求体查询(分页查询部分数据并进行排序)
    127.0.0.1:9200/shopping/_search?q=hobbies:play,查询shopping索引下hobbies内容为play的数据,从第0条开始,一页5条,展示资源为hobbies字段,按年龄进行降序排序
{
    "query" : {
        "match" : {
            "hobbies" : "eat"
        }
    },
    "from" : 0,
    "size" : 5,
    "_source" : ["hobbies"],
    "sort" : {
        "age" : {
            "order":"desc"
        }
    }
}

在这里插入图片描述

2.多条件查询

127.0.0.1:9200/shopping/_search?q=hobbies:play,查询shopping索引下hobbies内容为eat或者名字为PNING的数据,并且筛选出age大于1
的那部分
注意:should属性为或,如果要且的话需要将should改为must

{
    "query" : {
        "bool" : {
            "should" : [
                {
                    "match" : {
                        "hobbies" : "eat"
                    }
                },
                {
                  "match" : {
                        "name" : "PNING"
                   } 
                }
            ],
            "filter" : {
                "range" : {
                    "age" :{
                        "gt" : 1
                    }
                }
            }
        }
    }
}

在这里插入图片描述

3.精确查询(仅对于中文)

如果是英文,则需要完全一致才会被查询出来,但如果为中文的话,我们上述的查询都只会变成模糊查询,例如查询华米商品时候,不仅会查询出华米本身的商品,还会把名字中带华和带米商品全部查询出来

{
    "query" :{
        "match_phrase" : {
            "name" : "王亮"
        }
    },
    "highlight" : {
        "fields" : {
            "name" : {}
        }
    }
}

此时查询出来的就只是单纯的模糊查询了,后面的是将查询出来的姓名高亮显示
在这里插入图片描述

4.聚会查询

  1. 分组统计数量
{
   "aggs" : {                         //聚合操作
        "ages_group" : {               //随意取名字
            "terms" : {               //分组
                "field" : "age"       //分组字段
            }
        }
   },
   "size" : 0   					  //不看原始数据,只看统计结果
}

在这里插入图片描述

  1. 求平均值
{
   "aggs" : {                        //聚合操作
        "ages_avg" : {               //随意取名字
            "avg" : {                //请平均值
                "field" : "age"      //请平均值字段
            }
        }
   },
   "size" : 0   //不看原始数据,只看统计结果
}

在这里插入图片描述

八.映射关系(条件限制)

  1. 创建索引POST方式下127.0.0.1:9200/user
  2. 添加映射,在PUT方式下127.0.0.1:9200/user/_mapping
{
    "properties" : {
        "name" : {
            "type" : "text",           //可以分词查找,就是满足一个字就可以查找出来
            "index" : true              //可以通过索引查询到
        },
        "sex" : {
            "type" : "keyword",         //必须完全匹配
            "index" : true              //可以通过索引查询到
        },
        "telephone" : {
            "type" : "keyword",         //必须完全匹配
            "index" : false             //不可以通过索引查询到
        }
    }
}
  1. 可以通过GET方式查询 127.0.0.1:9200/user/_mapping
    在这里插入图片描述
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 是的,Elasticsearch可以通过HTTP API进行批量插入操作。你可以通过以下步骤进行批量插入: 1. 准备数据:将要插入的数据格式化为JSON格式,并按照ES要求的格式进行组织。每个文档应该包括一个唯一的ID。 2. 使用Bulk API进行批量插入:将准备好的数据通过HTTP POST请求发送到ES的Bulk API中。Bulk API允许在单个请求中插入多个文档。请求的URL应该是ES的索引URL加上`_bulk`路径。例如,如果你要将数据插入名为`my_index`的索引,那么请求的URL应该是`http://localhost:9200/my_index/_bulk`。 3. 解析响应:ES会返回一个JSON格式的响应,包含每个文档的插入状态和任何错误信息。 以下是一个示例批量插入的Python代码: ```python import requests import json # 准备数据 data = [ {"index": {"_index": "my_index", "_id": "1"}}, {"title": "Article 1", "content": "This is the first article."}, {"index": {"_index": "my_index", "_id": "2"}}, {"title": "Article 2", "content": "This is the second article."}, {"index": {"_index": "my_index", "_id": "3"}}, {"title": "Article 3", "content": "This is the third article."} ] # 发送请求 url = "http://localhost:9200/my_index/_bulk" headers = {"Content-Type": "application/json"} response = requests.post(url, headers=headers, data=json.dumps(data)) # 解析响应 if response.status_code == 200: results = json.loads(response.text) for item in results["items"]: if item["index"]["status"] == 201: print(f"Document {item['index']['_id']} inserted successfully.") else: print(f"Error inserting document {item['index']['_id']}: {item['index']['error']}") else: print(f"Error: {response.text}") ``` 在这个示例中,我们将三个文档插入到名为`my_index`的索引中。每个文档都有一个唯一的ID,因此我们可以在解析响应时识别每个文档的插入状态。 ### 回答2: Elasticsearch是一个基于Lucene的开源搜索引擎,采用分布式的方式来存储和检索数据。在Elasticsearch中,可以使用HTTP的方式来进行数据的批量插入。 通过HTTP的方式批量插入数据是利用Elasticsearch的RESTful API来实现的。具体的步骤如下: 1. 准备要插入的数据:在批量插入之前,首先需要准备好要插入的数据,并将其组织成特定的格式。一般情况下,使用JSON格式来表示数据,并按照批量插入的要求进行格式化。 2. 构建HTTP请求:使用任意的HTTP客户端,可以通过POST方法向Elasticsearch的_bulk API发送批量插入请求。该API允许一次性插入多条数据,并且支持同时插入到多个索引中。 3. 发送HTTP请求:将构建好的HTTP请求发送到Elasticsearch的_bulk API的URL地址上。可以使用 curl 命令或者其他HTTP客户端工具来发送请求。 4. 处理响应结果:Elasticsearch将返回一个包含每条插入操作的结果的响应。可以通过解析响应结果来获取插入操作的状态、成功与否等信息。 需要注意的是,在进行批量插入时,为了提高性能,可以一次性插入多条数据。但是,如果插入的数据量过大,可能会导致请求超时或者负载过大。因此,建议在进行批量插入时,适当控制每次插入的数据量,选择合适的插入策略。 总而言之,通过HTTP的方式批量插入数据是利用Elasticsearch的RESTful API来实现的。通过准备数据、构建HTTP请求、发送请求以及处理响应结果等步骤,可以方便地实现数据的批量插入。 ### 回答3: Elasticsearch是一个开源的搜索引擎,可以通过多种方式向其索引数据,其中一种方式是通过HTTP的方式进行批量插入。 使用HTTP的方式批量插入数据到Elasticsearch,需要通过发送HTTP请求来与Elasticsearch的REST API进行交互。具体步骤如下: 1. 构建批量插入请求体:批量插入请求体是一个包含多个插入操作的JSON数组。每个插入操作包含两部分:操作类型和操作数据。操作类型可以是"index"、"create"、"update"或"delete",具体看需求。操作数据是要插入的文档数据。 2. 发送HTTP请求:将构建的批量插入请求体发送给Elasticsearch的_bulk接口,使用HTTP的POST方法发送请求。 3. 解析返回结果:Elasticsearch将返回一个JSON响应,包含每个插入操作的结果。可以根据需要解析响应结果,了解每个操作的执行情况。 需要注意的是,批量插入请求体的大小是有限制的,一般建议不要一次性插入过多的数据,以免造成请求过大。 通过HTTP的方式批量插入数据相对简单,适用于一次性插入较少量的数据。如果需要高效地插入大量数据,可以考虑使用Elasticsearch提供的更高级的客户端API,如Java API或Python API,这些API可以更好地利用Elasticsearch的分布式特性来提高插入性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值