大数据015——Elasticsearch深入

2023-05-16

1. Elasticsearch 核心概念

1.1 cluster

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个重要概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一 个节点的通信和与整个es集群通信是等价的。

  • 主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。
  • 只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。
  • 默认情况下es会自动发现同一网段内的节点,自动组成集群。
  • 集群状态查看 :http://node01:9200/_cluster/health?pretty

1.2 shards

代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

  • 可以在创建索引库的时候指定

    – curl -XPUT ‘node01/test1/’ -d’{“settings”:{“number_of_shards”:3}}’

在这里插入图片描述

  • 默认是一个索引库有5个分片

    – number_of_shards: 5

1.3 replicas

代表索引副本,es可以给索引设置副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

  • 可以在创建索引库的时候指定

    – curl -XPUT ‘node01:9200/test2/’ -d’{“settings”:{“number_of_replicas”:2}}’

在这里插入图片描述

  • 默认是一个分片有1个副本 (总共有两片)

    – number_of_replicas: 1

1.4 recovery

代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

1.5 gateway

代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的 s3云存储服务。

如果需要将数据落地到hadoop的hdfs需要先安装插件 elasticsearch/elasticsearch-hadoop 。

1.6 discovery.zen

代表es的自动发 现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

如果是不同网段的节点如何组成es集群 :

  • 禁用自动发现机制

    – discovery.zen.ping.multicast.enabled: false

  • 设置新节点被启动时能够发现的主节点列表

    – discovery.zen.ping.unicast.hosts: [“192.168.1.191", " 192.168.1.192"]

1.7 Transport

代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、 memcached、zeroMQ等的传输协议(通过插件方式集成)。

2. Elasticsearch中的settings和mappings

2.1 settings 索引库默认配置

例如:分片数量,副本数量;

  • 查询默认配置:
[root@node01 ~]# curl -XGET http://node01:9200/mydoc/_settings?pretty
{
  "mydoc" : {
    "settings" : {
      "index" : {
        "creation_date" : "1548425875227",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "8gT7jufeSp6q6789LRuBNA",
        "version" : {
          "created" : "2040599"
        }
      }
    }
  }
}

  • 设置分片、副本数量(在创建的时候设置):
curl -XPUT http://node01:9200/helloword/ -d '{
"settings":
    {
        "number_of_shards":3,
        "number_of_replicas":2
    }
}'

2.2 Mapping 索引库默认配置

Mapping 是对索引库中索引的字段名称及其数据类型进行定义,类似于关系数据库中表建立时要定义字段名及其数据类型那样,(和solr中的schme类似)不过es 的mapping比数据库灵活很多,它可以动态添加字段。一般不需要要指定 mapping都可以,因为es会自动根据数据格式定义它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。

  • 查询索引库的mapping信息

    curl -XGET http://node01:9200/mydoc/employee/_mapping?pretty

    [root@node01 ik]# curl -XGET http://node01:9200/mydoc/employee/_mapping?pretty
    {
      "mydoc" : {
        "mappings" : {
          "employee" : {
            "properties" : {
              "about" : {
                "type" : "string"
              },
              "address" : {
                "type" : "string"
              },
              "age" : {
                "type" : "long"
              },
              "first_name" : {
                "type" : "string"
              },
              "last_name" : {
                "type" : "string"
              }
            }
          }
        }
      }
    }
    
  • mappings修改字段相关属性

    – 例如:字段类型,使用哪种分词工具。

3. Elasticsearch 的 java API

3.1 参数设置

@Before
public void client() throws UnknownHostException, IllegalAccessException, InstantiationException {
    Map<String, String> map = new HashMap<String, String>();
    // 1. 设置集群名称,默认是elasticsearch
    map.put("cluster.name", "myes");
    Settings.Builder settings = Settings.builder().put(map);
	// 2. 通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信
    client = TransportClient.builder().settings(settings).build();
	// 3. 设置es集群机器的ip地址及通讯端口
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node01"), 9300));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node02"), 9300));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("node03"), 9300));

}

3.2 创建索引库

    /**
     * 创建索引库
     */
    @Test
    public void createIndexBase() {
    	// 1. 设置索引库名称
        IndicesExistsResponse actionGet = client.admin().indices().prepareExists("test").execute().actionGet();
		// 2. 判断是否存在
        if (actionGet.isExists()) {
            System.out.println("test索引库已存在。。");

            client.admin().indices().prepareDelete("test").execute();
        }
        Map<String, String> map = new HashMap<>();
		// 3. 设置索引库的副本数于分片数
        map.put("number_of_replicas", "2");
        map.put("number_of_shards", "3");
		// 4. 执行创建
        client.admin().indices().prepareCreate("test").setSettings(map).execute();
           
    }

3.3 添加索引

    /**
     * 添加索引
     */
    @Test
    public void addIndex() {
        // 1. 创建map形式的数据
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("name", "bin");
        hashMap.put("age", 28);
        hashMap.put("gender", "male");
        hashMap.put("describe", "lyp is good");

        // 2. 这里指定 id 添加索引
//        IndexResponse response = client.prepareIndex("test", "employee", "79").setSource(hashMap).execute()
//                .actionGet();
		// 3. 这里未指定 id ,则系统会随机生成id
        IndexResponse response1 = client.prepareIndex("test", "employee").setSource(hashMap).execute().actionGet();
        
        System.out.println(response1.getId());//打印随机生成的id
    }

输出:

gender ->male
name ->bin
describe ->lyp is good
age ->28

3.4 更新索引

    /**
     * 更新
     *
     * @throws Exception
     */
    @Test
    public void update() throws Exception {
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("test");
        updateRequest.type("employee");
        updateRequest.id("79");
        Map<String, Object> map = new HashMap<>();
        // 对没有的字段添加, 对已有的字段更新
        map.put("age", "25");
        map.put("date", "2018-01-01");
        updateRequest.doc(map);
        
//        updateRequest.doc(
//                XContentFactory.jsonBuilder()
//                        .startObject()
//                        // 对没有的字段添加, 对已有的字段更新
//                        .field("age", "26")
//                        .field("city", "shanghai")
//                        .endObject());


        client.update(updateRequest);


    }

3.5 查询索引

    /**
     * 查询
     */
    @Test
    public void search() {
        //指定从test,mydoc索引库里查询

        SearchRequestBuilder builder = client.prepareSearch("test", "mydoc");
        //指定从employee,ikType,blog,这三个type里面查询
        builder.setTypes("employee", "ikType", "blog");
        //设置分页,从第0个开始,返回3个。
        builder.setFrom(0);
        builder.setSize(3);

        String key = "bin";
        //设置从name和content字段里查询
        builder.setQuery(QueryBuilders.multiMatchQuery(key, "name", "content","first_name"));
  
         builder.addSort("age", SortOrder.DESC); //设置排序字段,默认的话会根据相关性打分。
        // builder.setPostFilter(QueryBuilders.rangeQuery("age").from(24).to(28)); 设置过滤
        // 开始查询。
        SearchResponse searchResponse = builder.get();
        //获取查询的返回信息
        SearchHits hits = searchResponse.getHits();

        //一共有多少个符合条件的查询结果
        System.out.println("总共查询到了:" + hits.getTotalHits());

        //获取查询到的结果数组
        SearchHit[] hits2 = hits.getHits();

        for (SearchHit searchHit : hits2) {

            System.out.println("分数:" + searchHit.getScore());

            Map<String, Object> source = searchHit.getSource();
            System.out.println("id ->" + searchHit.getId());
            System.out.println("index -> " + searchHit.index());
            for (String s : source.keySet()) {
                System.out.println(s + "->" + source.get(s));
            }
            System.out.println("--------");
        }

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据015——Elasticsearch深入 的相关文章

  • AI 入门怎么学?这份学习指南请收好!

    万事开头难 xff01 AI 入门对很多初学 AI 的同学来说是一大难题 搜集了一大堆入门资料 xff0c Python 数学 深度学习应有尽有 xff0c 但就是无从下手 xff0c 总是在第一章与放弃之间徘徊 那么 xff0c AI 应
  • 为什么越厉害的大厂,校招越不看重考试成绩?

    前几天赵同学告诉我 xff0c 他没有通过那家心仪的公司笔试 赵同学成绩不错 xff0c 每次都是专业前五 xff0c 但笔试中有一道 银行家算法实现 题 xff0c 他一点也没写出来 这就是大厂招聘不看重成绩单的原因 xff1a 招人是为
  • 我的2011——毕业之年的总结与彷徨

    题记 眼看2011即将成为过去 xff0c 难得在这最后的时刻 xff0c 抽点时间 xff0c 倒上一杯热茶 xff0c 回忆这一年的浮浮沉沉 这一年 xff0c 我和所有毕业生一样 xff0c 离开了呆了四年的大学校园 呆腻了校园的生活
  • centos安装anaconda教程

    1 更新yum 命令 xff1a sudo yum update 2 安装anaconda 2 1 查看anaconda对应python版本 我选的3 8版 Old package lists Anaconda documentation
  • Android布局 -- Navigation实现底部导航栏

    底部导航栏加页卡的切换 xff0c 很多App采用这种布局设计 xff0c 在以前的开发中 xff0c 需要自定义底部导航栏以及使用FragmentTransaction来管理Fragment的切换 xff0c 代码量较大 xff0c 而使
  • ViewModelProviders is deprecated

    原有的创建ViewModel的方法 xff1a viewModel 61 ViewModelProviders of this get ViewModel class 提示ViewModelProviders过时 改为 xff1a view
  • Android Fragment退出 返回上一个Fragment与直接退出

    例如应用底部有两个导航按钮A与B xff0c 刚进入的时候显示为第一个AFragment xff0c 点击B切换到BFragment 如果需求是在BFragment点击返回键回到AFragment xff0c 需要配置 app defaul
  • Android基础 -- 子线程可以修改UI吗?

    子线程可以修改UI吗 xff1f 为什么会产生这样的问题 xff0c 可能是因为在开发过程中遇到了 34 Only the original thread that created a view hierarchy can touch it
  • leetcode 417. 太平洋大西洋水流问题

    https leetcode cn com problems pacific atlantic water flow 思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域 DFS public List lt
  • Android模拟器检测常用方法

    在Android开发过程中 xff0c 防作弊一直是老生常谈的问题 xff0c 而模拟器的检测往往是防作弊中的重要一环 xff0c 接下来有关于模拟器的检测方法 xff0c 和大家进行一个简单的分享 1 传统的检测方法 传统的检测方法主要是
  • RecyclerView 隐藏部分分割线

    在项目中遇到复杂点的RecyclerView xff0c 可能会有隐藏部分分割线的需求 xff0c 例如item1和item3之间的分割线隐藏 xff0c item4和item5之间的分割线隐藏等 在看了文档里的ItemDecoration
  • 浅谈去中心化应用

    1 中心化应用 现在我们所使用的应用基本上都是中心化的应用 xff0c 什么是中心化应用呢 xff0c 举个栗子 xff0c 我们在天猫买东西的时候 xff0c 需要先付款给支付宝 xff0c 然后卖家发货 xff0c 我们确认收货之后 x
  • Java二分搜索树及其添加删除遍历

    对于树这种结构 xff0c 相信大家一定耳熟能详 xff0c 二叉树 二分搜索树 AVL树 红黑树 线段树 Trie等等 xff0c 但是对于树的应用以及编写一棵解决特定问题的树 xff0c 不少同学都会觉得不是一件简单的事情 xff0c
  • 游戏平台SDK设计和开发之旅——XSDK功能点梳理

    做游戏开发或者相关工作的同学 xff0c 可能都知道 xff0c 在游戏上线之前 xff0c 需要将游戏分发到各大渠道平台 xff0c 比如九游 xff0c 百度 xff0c 360 xff0c 华为等等 其中和技术相关的事情 xff0c
  • 谈谈 GitHub 开放私有仓库一事的影响

    GitHub 此次宣布免费开放私有仓库 xff0c 在我看来有以下几点影响 xff1a 缓和与同类产品间的竞争压力小部分个人项目由开源转闭源微软在技术社区中的企业形象进一步强化为未来的企业服务预热 下面根据以上几点 xff0c 我来简单谈下
  • 每天坚持刷 LeetCode 的人,究竟会变得有多强... 学习技巧都藏在这几个公众号里面了......

    信息爆炸时代 xff0c 与其每天被各种看过就忘的内容占据时间 xff0c 不如看点真正对你有价值的信息 xff0c 下面小编为你推荐几个高价值的公众号 xff0c 它们提供的信息能真正提高你生活的质量 人工智能爱好者社区 专注人工智能 机
  • 超酷炫!智能无人机中文教程重磅上线!

    前 言 对于大多数无人机爱好者来说 xff0c 能自己从头开始组装一台无人机 xff0c 之后加入 AI 算法 xff0c 能够航拍 xff0c 可以目标跟踪 xff0c 是心中的梦想 并且 xff0c 亲自从零开始完成复杂系统 xff0c
  • B 站硬件大佬又在 GitHub 上开源了一款神器...

    公众号关注 GitHubDaily 设为 星标 xff0c 每天带你逛 GitHub xff01 转自量子位 这次 xff0c 野生钢铁侠稚晖君带着他的硬核项目又来了 上次自制纯手工打造 AI 小电视 xff0c 播放量就超过 300 万
  • 用 C 语言来刷 LeetCode,网友直呼:那是真的牛批...

    公众号关注 GitHubDaily 设为 星标 xff0c 每天带你逛 GitHub xff01 大家好 xff0c 我是小 G 如果你是计算机科班出身 xff0c 那么 C 语言 xff0c 估计是你在初入编程时 xff0c 最早接触的编
  • 【pytorch torchvision源码解读系列—3】Inception V3

    框架中有一个非常重要且好用的包 xff1a torchvision xff0c 顾名思义这个包主要是关于计算机视觉cv的 这个包主要由3个子包组成 xff0c 分别是 xff1a torchvision datasets torchvisi

随机推荐

  • 【pytorch torchvision源码解读系列—5】DenseNet

    pytorch框架中有一个非常重要且好用的包 xff1a torchvision xff0c 顾名思义这个包主要是关于计算机视觉cv的 这个包主要由3个子包组成 xff0c 分别是 xff1a torchvision datasets to
  • Eclipse使用JDBC方式连接SQLServer2016

    Eclipse使用JDBC方式连接SQLServer2016 今天下午在查找很多JDBC连接SQL时发现大多数都是2012甚至更久以前的版本 xff0c 所以就此把步骤记录下来 xff0c 以免自己下次使用又忘记了 在连接的时候 xff0c
  • 魔改《自动化学报》Latex模板

    想用latex写一个中文文档 xff0c 看上了 自动化学报 的模板 xff0c 感觉不错 xff0c 下载下来在本地的tex live上编译 xff0c 报了一大串错 xff1b 上传到overleaf xff0c 还是报错 xff1b
  • TX2安装jetpack

    目前官网支持的下载为JetPack L4T 3 2 1 linux x64 b23和JetPack L4T 3 3 linux x64 b39 首先使用具有Ubuntu16 04的host主机 xff08 我使用的是个人笔记本 xff0c
  • TF-IDF算法

    TF IDF算法 TF IDF term frequency inverse document frequency 是一种用于信息检索与数据挖掘的常用加权技术 xff0c 常用于挖掘文章中的关键词 xff0c 而且算法简单高效 xff0c
  • 大数据009——MapReduce

    分布式离线计算框架MapReduce MapReduce是一种编程模型 Hadoop MapReduce采用Master slave 结构 只要按照其编程规范 xff0c 只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序
  • MapReduce实例——wordcount(单词统计)

    1 MR实例开发整体流程 最简单的MapReduce应用程序至少包含 3 个部分 xff1a 一个 Map 函数 一个 Reduce 函数和一个 main 函数 在运行一个mapreduce计算任务时候 xff0c 任务过程被分为两个阶段
  • MapReduce实例——好友推荐

    1 实例介绍 好友推荐算法在实际的社交环境中应用较多 xff0c 比如qq软件中的 你可能认识的好友 或者是Facebook中的好友推介 好友推荐功能简单的说是这样一个需求 xff0c 预测某两个人是否认识 xff0c 并推荐为好友 xff
  • Hadoop源码分析——JobClient

    1 MapReduce作业处理过程概述 当用户使用Hadoop的Mapreduce计算模型来进行处理问题时 xff0c 用户只需要定义所需的Mapper和Reduce处理函数 xff0c 还有可能包括的Combiner Comparator
  • 大数据010——Hive

    1 Hive 概述 Hive 是建立在 Hadoop 上的数据仓库基础构架 它提供了一系列的工具 xff0c 可以用来进行数据提取转化加载 xff08 ETL xff09 xff0c 这是一种可以存储 查询和分析存储在 Hadoop 中的大
  • 大数据011——Sqoop

    1 Sqoop 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具 它是用来从关系数据库如 xff1a MySQL xff0c Oracle到Hadoop的HDFS xff0c 并从Hadoop的文件系统导出数据到关系数
  • 大数据012——HBase

    1 HBase 简介 HBase Hadoop Database xff0c 是一个高可靠性 高性能 面向列 可伸缩 实时读写的分布式数据库 xff1b 在Hadoop生态圈中 xff0c 它是其中一部分且利用Hadoop HDFS作为其文
  • Hadoop源码分析——MapReduce输入和输出

    Hadoop中的MapReduce库支持集中不同的格式的输入数据 例如 xff0c 文本模式的输入数据的每一行被视为一个key value键值对 key是文件的偏移量 xff0c value是那一行的内容 另一种常见的格式是以key进行排序
  • 大数据013——Flume

    1 Flume 简介 Flume是由Cloudera软件公司提供的一个高可用的 xff0c 高可靠的 xff0c 分布式的海量日志采集 聚合和传输的系统 xff0c 后与2009年被捐赠了apache软件基金会 xff0c 为hadoop相
  • Hadoop源码分析——计算模型MapReduce

    MapReduce 是一个计算模型 xff0c 也是一个处理和生成超大数据集的算法模型的相关实现 用户首先创建一个Map函数处理一个基于key value pair的数据集合 xff0c 输出中间的基于 key value pair 的数据
  • 从SDLC到DevSecOps的转变

    OSSTMM 根据开源安全测试方法手册OSSTMM Open Source Security Testing Methodology Manual 的表述 安全测试包括但不限于以下几种做法 漏洞扫描 安全扫描 渗透测试 风险评估 安全审核
  • 大数据014——Storm 简介及入门案例

    分布式实时数据处理框架 Storm 1 Storm简介与核心概念 1 1 Storm 简介 全称为 Apache Storm xff0c 是一个分布式实时大数据处理系统 它是一个流数据框架 xff0c 具有最高的获取率 它比较简单 xff0
  • Hive与HBase整合详解

    参考之前小节的大数据010 Hive与大数据012 HBase成功搭建Hive和HBase的环境 xff0c 并进行了相应的测试 xff0c 并且在大数据011 Sqoop中实现Hive HBase与MySQL之间的相互转换 xff1b 本
  • 大数据015——Elasticsearch基础

    1 Elasticsearch 简介 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析 引擎 设计用于云计算中 xff0c 能够达到实时搜索 xff0c 稳定 xff0c 可靠 xff0c 快速 xff0c 安装使用
  • 大数据015——Elasticsearch深入

    1 Elasticsearch 核心概念 1 1 cluster 代表一个集群 xff0c 集群中有多个节点 xff0c 其中有一个为主节点 xff0c 这个主节点是可以通过选举产生的 xff0c 主从节点是对于集群内部来说的 es的一个重