Elasticsearch 概述

  • The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。
  • Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

Elasticsearch 是什么

  • https://www.elastic.co
  • Elasticsearch是一个(近乎)实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据, 它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的,它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
  • Elasticsearch是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架.

全文搜索引擎

  • Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

  • 一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。

  • 基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:

    • 搜索的数据对象是大量的非结构化的文本数据。
    • 文件记录量达到数十万或数百万个甚至更多。
    • 支持大量基于交互式文本的查询。
    • 需求非常灵活的全文搜索查询。
    • 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
    • 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
  • 为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎

  • 这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

Lucene

  • Lucene是Apache Jakarta家族中的一个开源项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎、索引引擎和部分文本分析引擎。

  • Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具,是目前最为流行的基于 Java 开源全文检索工具包

  • 数据总体分为两种:

    • 结构化数据: 指具有固定格式或有限长度的数据,如数据库、元数据等。
    • 非结构化数据: 指不定长或无固定格式的数据,如邮件、word文档等磁盘上的文件。
  • 对于结构化数据的全文搜索很简单,因为数据都是有固定格式的,例如搜索数据库中数据使用SQL语句即可。

  • 对于非结构化数据,有以下两种方法:

    1. 顺序扫描法(Serial Scanning)
    2. 全文检索(Full-text Search)
  • 顺序扫描法如果要找包含某一特定内容的文件,对于每一个文档,从头到尾扫描内容,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件,因此速度很慢。

  • 全文检索将非结构化数据中的一部分信息提取出来,重新组织,使其变得具有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

    • 例如字典的拼音表和部首检字表就相当于字典的索引,通过查找拼音表或者部首检字表就可以快速的查找到我们要查的字。
  • 这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)

Elasticsearch And Solr

  • Lucene 是 Apache 软件基金会 Jakarta 项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在 Java 开发环境里 Lucene 是一个成熟的免费开源工具。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免费 Java 信息检索程序库。但 Lucene 只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。
  • 目前市面上流行的搜索引擎软件,主流的就两款:Elasticsearch 和 Solr, 这两款都是基于 Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作 修改、添加、保存、查询等等都十分类似。
  • 在使用过程中,一般都会将 Elasticsearch 和 Solr 这两个软件对比,然后进行选型。这两个搜索引擎都是流行的,先进的的开源搜索引擎。它们都是围绕核心底层搜索库 - Lucene 构建的 - 但它们又是不同的。像所有东西一样,每个都有其优点和缺点:
特征 solr/SolrCloud ElasticSearch
社区和开发者 Apache 软件基金和社区支持 单一商业实体及员工
节点发现 Apache Zookeeper 自身带有分布式协调管理功能

Elasticsearch Or Solr

  • Elasticsearch 和 Solr 都是开源搜索引擎,那么我们在使用时该如何选择呢?

  • Google 搜索趋势结果表明,与 Solr 相比,Elasticsearch 具有很大的吸引力,但这并不意味着 Apache Solr 已经死亡。虽然有些人可能不这么认为,但 Solr 仍然是最受欢迎的搜索引擎之一,拥有强大的社区和开源支持。

  • 与 Solr 相比,Elasticsearch 易于安装且非常轻巧。此外,你可以在几分钟内安装并运行 Elasticsearch。但是,如果 Elasticsearch 管理不当,这种易于部署和使用可能会成为一个问题。基于 JSON 的配置很简单,但如果要为文件中的每个配置指定注释,那么它不适合您。总的来说,如果你的应用使用的是 JSON,那么 Elasticsearch 是一个更好的选择。否则,请使用 Solr,因为它的 schema.xml 和 solrconfig.xml 都有很好的文档记录。

  • Solr 拥有更大,更成熟的用户,开发者和贡献者社区。ES 虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。Solr 贡献者和提交者来自许多不同的组织,而 Elasticsearch 提交者来自单个公司。

  • Solr 更成熟,但 ES 增长迅速,更稳定。

  • Solr 是一个非常有据可查的产品,具有清晰的示例和 API 用例场景。 Elasticsearch 的文档组织良好,但它缺乏好的示例和清晰的配置说明。

那么,到底是 Solr 还是 Elasticsearch ?

  • 有时很难找到明确的答案。无论您选择 Solr 还是 Elasticsearch,首先需要了解正确的用例和未来需求。总结他们的每个属性。
  • 由于易于使用,Elasticsearch 在新开发者中更受欢迎。一个下载和一个命令就可以启动一切。

  • 如果除了搜索文本之外还需要它来处理分析查询,Elasticsearch 是更好的选择

  • 如果需要分布式索引,则需要选择 Elasticsearch。对于需要良好可伸缩性和以及性能分布式环境,Elasticsearch 是更好的选择。

  • Elasticsearch 在开源日志管理用例中占据主导地位,许多组织在 Elasticsearch 中索引它们的日志以使其可搜索。

  • 如果你喜欢监控和指标,那么请使用 Elasticsearch,因为相对于 Solr,Elasticsearch 暴露了更多的关键指标

Elasticsearch 应用案例

  • GitHub: 2013 年初,抛弃了 Solr,采取 Elasticsearch 来做 PB 级的搜索。“GitHub 使用 Elasticsearch 搜索 20TB 的数据,包括 13 亿文件和 1300 亿行代码”。

  • 维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。

  • SoundCloud:“SoundCloud 使用 Elasticsearch 为 1.8 亿用户提供即时而精准的音乐搜索服务”。

  • 百度:目前广泛使用 Elasticsearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部 20 多个业务线(包括云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大 100 台机器,200 个 ES 节点,每天导入 30TB+ 数据。

  • 新浪:使用 Elasticsearch 分析处理 32 亿条实时日志。

  • 阿里:使用 Elasticsearch 构建日志采集和分析体系。

  • Stack Overflow:解决 Bug 问题的网站,全英文,编程人员交流的网站。

Elasticsearch的特性

  • ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性:
    1. 分布式索引、搜索。
    2. 索引自动分片、负载均衡。
    3. 自动发现机器、组建集群。
    4. 支持Restful 风格接口。
    5. 配置简单等。
    6. 海量数据的存储。

Elasticsearch框架图

节点Node

  • 一个Elasticsearch的运行实例,集群的其中一个构成单元。

正排索引

  • 维护文档id到内容、单词的关联关系,例如

    文档id 文档内容
    1 中国驻洛杉矶领事馆遭到枪击 嫌犯已自首
    2 韩国警察平均每天扣1艘中国渔船

倒排索引

  • 维护单词到文档id的关联关系,例如

    单词 文档id
    中国 1,2
    韩国 2
    洛杉矶 1

Elsaticsearch的数据结构

  • Es对数据的存储采用是:

  • Index(索引)——Mysql(Table)

  • Document(文档)——-Mysql(Table中一行数据)

  • 选择索引(Es7.0后 ,彻底遗弃type,只有索引和文档),存储的数据就叫文档

  • 一个索引只存储一种类型的数据

文档Document

  • 用户存储在es中的数据文档,相当于mysql的表中的一行,Json结构形式,由字段组成,常见数据类型如下:

    1
    2
    3
    4
    5
    6
    字符串: text、keyword,text是分词,keyword是不分词的
    数值型: long、integer、short、byte、double、float、half_float、scaled_float
    布尔: boolean
    日期: date
    二进制: binary
    范围类型: integer_range、float_range、long_range、double_range、date_range

文档的元数据: 用于标注文档的相关信息

1
2
3
4
5
6
7
_index: 文档所在的索引名
_type: 文档所在的类型名
_id: 文档唯一id
_score: 相关性算分
_uid: 组合id,有_type和_id组成(从6.x开始_type不再起作用,同_id一样)
_source: 文档的原始json数据,可以从这里获取每个字段的内容
_all: 整合所有字段内容到该字段,默认下禁用

索引 Index

  • 由具有相同字段的文档列表组成,相当于mysql中的表。

  • 每个索引都有自己的mapping定义,用于定义字段名和类型

  • 索引中存储着具有相同结构的文档

Elasticsearch总结

  • ES可以实现海量数据的存储(PB级别)、实现快速搜索(倒排索引)、实现统计分析(热词分析)

  • 高并发下的海量数据的存储方案:

  • 基于ES可以实现全站搜索、海量数据存储,也可以结合其他工具提供日志分析。

    1. 通过beat收集日志,经过分析然后同步到Elasticsearch,在Kibana中提供web界面可视化。

    2. beat结合logstash可以更加丰富数据。

Docker安装ES

Docker安装Elasticsearch

  1. 创建并运行容器

    1
    docker run -d --name es9200 -e "discovery.type=single-node" -p 9200:9200 elasticsearch:7.12.1
  2. 访问测试

  • 如果启动容器报错:

    1
    2
    # 这个错误意思: 当前默认可用内存太小了,需要设置的大一点
    max virtual monery xxxx [65530] is to low
  • 在服务器上执行下面的命令:

    1
    2
    3
    4
    5
    6
    7
    vim /etc/sysctl.conf
    # 输入:
    vm.max_map_count=655300
    # 重新加载
    sysctl -p
    # 重新启动容器:
    docker start es9200

Docker安装kibana

  • kibana: 是一个免费且开放的用户界面,能够让对 Elasticsearch 数据进行可视化,还可以进行各种操作,跟踪查询负载,到理解请求如何流经整个应用,都能轻松完成。

  • ELK:标准化日志平台

    • E:Elasticsearch 作为日志存储和分析框架,
    • L:Logstash 作为日志采集框架,获取日志存储到Es,
    • K:Kibana 可视化网站,可以通过网页操作ES
  • 目前的日志服务推荐: 云解决方案:

    • 阿里云-日志服务(SLS): 行业领先的日志大数据解决方案,一站式提供数据收集、清洗、分析、可视化和告警功能。全面提升海量日志处理能力,实时挖掘数据价值,智能助力研发/运维/运营/安全等场景
  1. 查询es的地址

    1
    2
    docker inspect es9200
    # 查看Networks 下的 bridge 的 IPAddress
  2. 创建并运行容器

    1
    docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.1
  3. 修改配置文件

    1
    2
    3
    4
    docker exec -it kibana5601 bash
    vi config/kibana.yml
    # 更改es的地址

  4. 访问测试

安装IK中文分词

  • IK中文分词器 可以实现中文的分词
  1. 下载分词器 https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.1.1

    • 需要和es的版本对应,es:7.1.1 所以: ik:V7.1.1
  2. 上传并设置映射

    1
    docker cp /usr/local/elasticsearch-analysis-ik-7.1.1.zip es9200:/usr/share/elasticsearch/plugins
  3. 解压IK分词

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    docker exec -it es9200 bash

    mkdir /usr/share/elasticsearch/plugins/ik

    mv /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.1.1.zip /usr/share/elasticsearch/plugins/ik

    cd /usr/share/elasticsearch/plugins/ik

    unzip elasticsearch-analysis-ik-7.1.1.zip

    rm -rf elasticsearch-analysis-ik-7.1.1.zip

    exit

    docker restart es9200
  4. 查看安装的插件

    1
    2
    docker exec -it es9200 bash
    ./bin/elasticsearch-plugin list

安装拼音插件

  1. 进入容器内部

    1
    docker exec -it es9200 bash
  2. 下载拼音插件

    1
    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.1.1/elasticsearch-analysis-pinyin-7.1.1.zip
  3. 重启和查询插件

    1
    2
    docker exec -it es9200 bash
    ./bin/elasticsearch-plugin list

windows 安装 ES

下载软件

安装软件

  • Windows 版的 Elasticsearch 的安装很简单,解压即安装完毕,注意文件夹路径一定不能包含空格,解压后的 Elasticsearch 的目录结构如下

    目录 含义
    bin 可执行脚本目录
    config 配置目录
    jdk 内置 JDK 目录
    lib 类库
    logs 日志目录
    modules 模块目录
    plugins 插件目录
  • 解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务

    • 注意9300 端口为 Elasticsearch 集群间组件的通信端口,
    • 9200 端口为浏览器访问的 http 协议 RESTful 端口。
  • 打开浏览器(推荐使用谷歌浏览器),输入地址:http://localhost:9200,测试结果

可选操作

  • 注册成服务

    • 将ES的安装目录下bin加入到环境变量path中 D:\elasticsearch-7.8.0\bin

      1
      2
      3
      4
      5
      6
      7
      8
      # 注册成服务
      elasticsearch-service.bat install es
      # 启动服务
      net start es
      # 关闭服务
      net stop es
      # 注销服务
      elasticsearch-service.bat remove
  • 7.x自带了jdk,我们可以手动设置jdk: 修改bin\elasticsearch-env.bat

    • 在if defined JAVA_HOME前加入 set JAVA_HOME=E:\elastic\elasticsearch-7.6.2\jdk

安装kibana

  • 最新的Kibana稳定版可以在下载页面找到,其他版本的可以在以往发布页面找到。

  • 下载同es相同版本的kibana, 默认情况下,解压后将得到一个kibana-7.15.0-windows-x86_64文件夹,我们称其为$KIBANA_HOME目录。打开Windows平台的命令行或您喜欢的终端程序,cd进入$KIBANA_HOME目录

  • 通过配置文件配置Kibana

    • 默认情况下,Kibana将从$KIBANA_HOME/config/kibana.yml文件中加载配置

    • 设置elasticsearch地址,多个以逗号分隔

      1
      elasticsearch.hosts: ["http://localhost:9200"]
    • 设置国际化,中文

      1
      i18n.locale: "zh-CN"
  • 命令行启动Kibana

    1
    .\bin\kibana.bat
  • 默认情况下,Kibana启动后将在前台运行并输出标准日志,可以通过Ctrl-C来停止Kibana的运行。

  • 访问 http://localhost:5601/

安装IK分词器

  • ElasticSearch 默认采用标准分词器(StandardAnalyzer), 单个字分词 ,效果很差。

  • 所以我们需要用第三方中文分词器IK-analyzer,Lucene的IK分词器早在2012年已经没有维护了,现在我们要使用的是在其基础上维护升级的版本,并且开发为Elasticsearch的集成插件了,与Elasticsearch一起维护升级,版本也保持一致。下载地址如下: https://github.com/medcl/elasticsearch-analysis-ik/releases

  • 只需将其解压即可使用,我们在elasticsearch的目录下找到plugins文件夹,然后新建ik文件夹,将其文件解压到ik文件夹即可。

  • 然后重启elasticsearch即可在日志看到ik被导入了

    1
    [2021-10-14T17:09:43,979][INFO ][o.e.p.PluginsService     ] [CN5XXXXRF] loaded plugin [analysis-ik]
  • 自增扩展词和停用词文件: 在ik目录下的config目录下有个IKAnalyzer.cfg.xml文件

    • 双击进去即可看到在哪里配置自己的停用词典文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
      <properties>
      <comment>IK Analyzer 扩展配置</comment>
      <!--用户可以在这里配置自己的扩展字典 -->
      <entry key="ext_dict"></entry>
      <!--用户可以在这里配置自己的扩展停止词字典-->
      <entry key="ext_stopwords"></entry>
      <!--用户可以在这里配置远程扩展字典 -->
      <!-- <entry key="remote_ext_dict">words_location</entry> -->
      <!--用户可以在这里配置远程扩展停止词字典-->
      <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
      </properties>

可能问题

  • Elasticsearch 是使用 java 开发的,且 7.8 版本的 ES 需要 JDK 版本 1.8 以上

  • 默认安装包带有 jdk 环境,如果系统配置 JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK。

  • 双击启动窗口闪退,通过路径访问追踪错误,如果是“空间不足”,请修改 config/jvm.options 配置文件

    1
    2
    3
    4
    5
    6
    # 设置 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

CentOS8 安装 ES

软件下载

软件安装

  1. 将下载的软件解压缩

    1
    2
    3
    4
    5
    6
    # 创建目录
    mkdir /opt/module
    # 解压缩
    tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module
    # 改名
    mv /opt/module/elasticsearch-7.8.0 /opt/module/elasticsearces
  2. 创建用户

    • 因为安全问题,Elasticsearch 不允许 root 用户直接运行,所以要创建新用户,在 root 用户中创建新用户
    1
    2
    3
    4
    5
    useradd es #新增 es 用户
    passwd es #为 es 用户设置密码

    userdel -r es #如果错了,可以删除再加
    chown -R es:es /opt/module/es #文件夹所有者
  3. 修改配置文件 (root 用户下)

    • 修改 /opt/module/es/config/elasticsearch.yml 文件

      1
      2
      3
      4
      5
      6
      # 加入如下配置
      cluster.name: elasticsearch
      node.name: node-1
      network.host: 0.0.0.0
      http.port: 9200
      cluster.initial_master_nodes: ["node-1"]
    • 修改 /etc/security/limits.conf

      1
      2
      3
      4
      # 在文件末尾中增加下面内容
      # 每个进程可以打开的文件数的限制
      es soft nofile 65536
      es hard nofile 65536
    • 修改/etc/security/limits.d/20-nproc.conf

      1
      2
      3
      4
      # 操作系统级别对每个用户创建的进程数的限制
      # 注:* 带表 Linux 所有用户名称,用户退出后重新登录生效
      * hard nproc 4096
      * soft nproc 4096
1
2
3
4
5
6

- 修改 /etc/sysctl.conf

```sh
# 在文件中增加下面内容
# 一个进程可以拥有的 VMA(虚拟内存区域)的数量,默认值为 65536 vm.max_map_count=655360
  • 重新加载 sysctl

    1
    sysctl -p
1
2
3
4
5
6
7
8
9
10
11

### 启动软件

- 使用 ES 用户启动

```shell
cd /opt/module/es/
#启动
bin/elasticsearch
#后台启动
bin/elasticsearch -d
  • 启动时,会动态生成文件,如果文件所属用户不匹配,会发生错误,需要重新进行修改用户和用户组

    1
    chown -R es:es /opt/module/es #文件夹所有者

测试软件

  • 访问失败查看防火墙是否放行 9200 端口

    1
    2
    3
    4
    5
    6
    7
    #暂时关闭防火墙
    systemctl stop firewalld

    #关闭防火墙,永久性生效,重启后不会复原
    systemctl enable firewalld.service
    #关闭防火墙,永久性生效,重启后不会复原
    systemctl disable firewalld.service

Kibana可视化操作ES

查看索引

  1. 查看索引管理器

  2. 为索引设置可视化, 设置可视化之后,就可以通过Kibana进行可视化的操作

Elasticsearch基本应用

  • ES存储数据的,常用的操作: 增删改查
  • Java程序操作ES的方式: 1.原生 Transport 2.Spring Data Elasticsearch

RestfulApi操作ES

  • 打开开发者工具

  • 常用的Restful API:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #创建索引
    PUT /es211
    #删除索引
    DELETE /es211
    #创建索引
    PUT /es211-lx
    #设置索引的Mapping格式,定义文档格式
    PUT /es211-lx/_mapping
    {
    "properties": {
    "_class": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "id": {
    "type": "long"
    },
    "name":{
    "type":"text"
    },
    "sex":{
    "type":"text"
    },
    "ctime":{
    "type":"date"
    }
    }
    }

    #新增文档
    POST /es211-lx/_doc/1
    {
    "id":1,
    "name":"帅帅",
    "sex":"男人",
    "ctime":"2020-05-11"
    }
    POST /es211-lx/_doc/2
    {
    "id":2,
    "name":"琪琪",
    "sex":"女人",
    "ctime":"2020-05-11"
    }
    #修改文档
    PUT /es211-lx/_doc/2
    {
    "id":2,
    "name":"琪琪",
    "sex":"女生",
    "ctime":"2020-05-11"
    }
    #查询单个文档
    GET /es211-lx/_doc/2
    #删除文档
    DELETE /es211-lx/_doc/2

Thransport

  • Thransport是Es官方推荐的一种用法,可以在Java代码实现对es的CRUD操作

  • 使用步骤:

    1. 依赖jar包

      1
      2
      3
      4
      5
      6
      7
      8
      <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>transport</artifactId>
      </dependency>
      <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      </dependency>
    2. 编写代码,实现操作

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      public static void main(String[] args) throws IOException {
      //1.实例化客户端对象 连接服务器
      RestHighLevelClient client = new RestHighLevelClient(
      RestClient.builder(new HttpHost("39.105.189.141",
      9200, "http")));
      //2.实现操作
      //新增或修改数据 如果_id存在就是修改,不存在就是新增
      Student student=new Student(3,"双奔","man");
      IndexResponse response1=client.
      index(new IndexRequest("es2008").//设置要操作的索引名称
      id(student.getId()+"").//为_id赋值 唯一
      source( //设置操作的数据源
      JSON.toJSONString(student),
      XContentType.JSON),
      RequestOptions.DEFAULT);
      System.err.println(response1.status().toString());
      // //删除
      DeleteResponse response2=client.delete(
      new DeleteRequest("es2008","1"),RequestOptions.DEFAULT);
      System.err.println(response2.status().toString());
      //修改
      Student student2=new Student(3,"Double Ben","WoMan");
      UpdateResponse response3=client.update(new UpdateRequest("es2008","3").
      doc(JSON.toJSONString(student2),XContentType.JSON),
      RequestOptions.DEFAULT);
      System.err.println(response3.status().toString());
      //查询
      GetResponse response4=client.get(new GetRequest("es2008","2"),RequestOptions.DEFAULT);
      System.err.println(response4.getSourceAsString());
      //3.关闭
      client.close();
      }
    3. 运行测试, 查看操作是否成功