从永远到永远-ElasticSearch

news2024/11/23 19:01:04

ElasticSearch

  • 1.概述
  • 2.入门
    • 1.官方地址
    • 2.RESTful
    • 3.倒排索引
    • 4.http请求操作
      • 1.索引操作
      • 2.document操作
        • 1.基本操作
        • 2.多条件查询
        • 3.区间查询
        • 4.完全匹配
        • 5.高亮显示
        • 6.聚合查询
        • 7.映射关系
    • 5.JAVA API
      • 1.index操作
      • 2.doc操作
        • 1.基础操作
        • 2.批量操作
        • 3.复杂查询

1.概述

结构化数据、非结构化数据、半结构化数据
lasticsearch 是什么
The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。

Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。

它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
全文搜索引擎
Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

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

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

搜索的数据对象是大量的非结构化的文本数据。
文件记录量达到数十万或数百万个甚至更多。
支持大量基于交互式文本的查询。
需求非常灵活的全文搜索查询。
对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎 。
这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

Elasticsearch 应用案例
GitHub: 2013 年初,抛弃了 Solr,采取 Elasticsearch 来做 PB 级的搜索。 “GitHub 使用Elasticsearch 搜索 20TB 的数据,包括 13 亿文件和 1300 亿行代码”。
维基百科:启动以 Elasticsearch 为基础的核心搜索架构
百度:目前广泛使用 Elasticsearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部 20 多个业务线(包括云分析、网盟、预测、文库、直达号、钱包、 风控等),单集群最大 100 台机器, 200 个 ES 节点,每天导入 30TB+数据。
新浪:使用 Elasticsearch 分析处理 32 亿条实时日志。
阿里:使用 Elasticsearch 构建日志采集和分析体系。
Stack Overflow:解决 Bug 问题的网站,全英文,编程人员交流的网站。

2.入门

1.官方地址

官网地址
官方文档
下载页面
docker安装

2.RESTful

RESTful:
RESTful详解

3.倒排索引

正排索引(传统)

idcontent
1001my name is zhang san
1002my name is li si

倒排索引

keywordid
name1001, 1002
zhang1001

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

4.http请求操作

1.索引操作

###### 索引
#查看所有索引
GET _cat/indices?v
#创建索引
PUT index_sample
#查看索引
GET index_sample
#删除索引
DELETE index_sample

2.document操作

1.基本操作

#添加数据 不指定id时,自动生成的id,每次返回不一样,操作不是幂等性操作,不能使用PUT
POST index_sample/_doc
{
  "id":1001,
  "name":"小明"
}
######  doc操作
#指定id时 执行多次返回的id都是相同的,所以时幂等性操作,可以使用PUT
POST index_sample/_doc/10001
{
  "id":1001,
  "name":"小明"
}
#或者
POST index_sample/_create/1002
{
  "id":1002,
  "name":"小明"
}
#查询 主键查询
GET index_sample/_doc/10001
#查询 所有
GET index_sample/_search

#全量更新
PUT index_sample/_doc/10001
{
    "id" : 1001,
    "name" : "小明2"
}
#局部更新 非幂等性
POST index_sample/_update/10001
{
    "doc": {
      "name":"小刚"
    }
}

#删除
DELETE index_sample/_doc/1002

2.多条件查询

#### 匹配多个条件
## 条件且
GET index_sample/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小明"
          }
        },
        {
          "match": {
            "desc": "2"
          }
        }
      ]
    }
  }
}
## 条件或者
GET index_sample/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "小明"
          }
        },
        {
          "match": {
            "desc": "我是小明"
          }
        }
      ]
    }
  }
}

3.区间查询

GET index_sample/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}

4.完全匹配

GET index_sample/_search
{
  "query": {
    "match_phrase": {
      "desc": "你有点2"
    }
  }
}

5.高亮显示

GET index_sample/_search
{
  "query": {
    "match_phrase": {
      "desc": "小明"
    }
  },
  "highlight": {
    "fields": {
      "desc": {}
    }
  }
}

6.聚合查询

一言以蔽之,聚合查询就是对查到的数据进行统计分析(分组、最大小值、平均值等)
参考

###  聚合查询
#按年龄分组 不展示具体数据
GET bank/_search
{
  "aggs": {
    "group_agg": {
      "terms": {
        "field": "age",
        "size": 5
      }
    }
  },
  "size": 0
}
#年龄平均值 不展示具体数据
GET bank/_search
{
  "aggs": {
    "avg_agg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}
#其他详见API

7.映射关系

### 映射
PUT index_sample_mapping
# 创建映射
PUT index_sample_mapping/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "index": true
    },
    "gender": {
      "type": "keyword",
      "index": true
    },
    "tel": {
      "type": "text",
      "index": false
    }
  }
}
# 查询映射
GET index_sample_mapping/_mapping
# 测试数据
PUT index_sample_mapping/_create/1001
{
  "name": "小明",
  "gender": "男生",
  "tel": "1111111"
}
PUT index_sample_mapping/_create/1002
{
  "name": "小红",
  "gender": "女生",
  "tel": "2222222"
}
# 支持分词
GET index_sample_mapping/_search
{
  "query": {
    "match": {
      "name": "小"
    }
  }
}
# 关键字字段,不支持分词,必须全文匹配
GET index_sample_mapping/_search
{
  "query": {
    "match": {
      "gender": "男生"
    }
  }
}
# 不支持索引,查询失败
GET index_sample_mapping/_search
{
  "query": {
    "match": {
      "tel": "111"
    }
  }
}

5.JAVA API

1.index操作

public class IndexSample {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client =
                new RestHighLevelClient(
                        RestClient.builder(new HttpHost("192.168.2.111", 9200, "http"))
                );
        //创建索引
        CreateIndexRequest userIndexRequest = new CreateIndexRequest("user");
        IndicesClient indices = client.indices();
        CreateIndexResponse createIndexResponse = indices.create(userIndexRequest, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.isAcknowledged());
        //查看索引
        GetIndexRequest getIndexRequest = new GetIndexRequest("user");
        GetIndexResponse getIndexResponse = indices.get(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());
        //删除索引
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");
        AcknowledgedResponse acknowledgedResponse = indices.delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(acknowledgedResponse.isAcknowledged());
        //关闭客户端
        client.close();
    }

2.doc操作

1.基础操作

public interface ElasticSearchTask {

    /**
     * 使用接口做部分操作
     *
     * @param client es客户端
     */
    void doSth(RestHighLevelClient client) throws IOException;
}

public class ElasticSearchClientUtils {
    public static void connect(ElasticSearchTask task) {
        RestHighLevelClient client =
                new RestHighLevelClient(
                        RestClient.builder(new HttpHost("192.168.2.111", 9200, "http"))
                );
        try {
            task.doSth(client);
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

public class DocSample {
    public static void main(String[] args) {
        User user = new User();
        user.setName("小明");
        user.setAge(11);
        user.setSex("男");
        ElasticSearchClientUtils.connect(e -> {
            //新增doc
            IndexRequest indexRequest = new IndexRequest();
            indexRequest.index("user").id("1001");
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(user);
            indexRequest.source(json, XContentType.JSON);
            IndexResponse indexResponse = e.index(indexRequest, RequestOptions.DEFAULT);
            System.out.println(indexResponse.getResult());
            //查询
            GetRequest getRequest = new GetRequest();
            getRequest.index("user").id("1001");
            GetResponse getResponse = e.get(getRequest, RequestOptions.DEFAULT);
            System.out.println(getResponse.getSourceAsString());
            //修改
            UpdateRequest updateRequest = new UpdateRequest();
            updateRequest.index("user").id("1001");
            updateRequest.doc(XContentType.JSON, "sex", "女");
            UpdateResponse updateResponse = e.update(updateRequest, RequestOptions.DEFAULT);
            System.out.println(updateResponse.getResult());
            System.out.println(e.get(getRequest, RequestOptions.DEFAULT).getSourceAsString());
            //删除
            DeleteRequest deleteRequest = new DeleteRequest();
            deleteRequest.index("user").id("1001");
            DeleteResponse deleteResponse = e.delete(deleteRequest, RequestOptions.DEFAULT);
            System.out.println(deleteResponse.toString());
        });
    }
}

2.批量操作

3.复杂查询


分页、条件、组合、范围、模糊、高亮

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++函数指针和回调函数

一、函数指针 在讲回调函数之前,我们需要了解函数指针。 我们都知道,C语言的灵魂是指针,我们经常使用整型指针,字符串指针,结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体但是好像我们一…

springboot+jsp学生平时作业评价系统idea

课程信息管理功能需求主要是对课程信息的管理,包括课程信息的录入、维护、删除,教师可以根据授课计划设定授课进度。学生信息管理功能需求,主要是对学生的基本信息进行管理,教师可以录入学生信息,并可以对学生信息进行维护和删除。…

linux 串口改为固定

在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式(xx 为数字或字母,name 为规则名称),例如 99-serial-ports.rules。4. 规…

PDM入门指南:一文带你了解PDM的基本知识

上一期,我们聊过PLM;这一期,我们接着聊聊PDM。在介绍之前,先回答之前客户提出的问题:上线PLM/PDM后,还需要e企拆图吗?可能需要,原因放在最后,有需要的朋友可直接跳到最后…

Java经典面试题—— 对比 Hashtable、HashMap、TreeMap 有什么不同?

典型回答 Hashtable、HashMap、TreeMap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型。 Hashtable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键和值,由于同步导致的性能开销&#xff0c…

IP 子网划分详解

文章目录 1 概述1.1 划分目的1.2 划分原则1.3 子网掩码 2 IP 子网划分示例3 网工软考真题3.1 判断网络号和主机号3.2 计算可容纳的主机数 1 概述 IP 子网划分:实际上就是设计 子网掩码 的过程。原因:由于在五类的IP地址中,网络号与主机号的的…

【dfs解决分组问题-两道例题——供佬学会!】(A元素是放在已经存在的组别中,还是再创建一个更好?--小孩子才做选择,dfs直接两种情况都试试)

问题关键就是: 一个点,可能 新开一个组 比 放到已经存在的组 更划算 因为后面的数据,我们遍历之前的点时,并不知道 所以我们应该针对每个点,都应该做出一个选择就是 新开一个元组或者放到之前的元组中,都尝…

SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言)

查看原文>>>SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言) 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…

简答题题集

简答题: 1.测试和开发如何配合工作,即测试何时介入测试工作? 测试工作应该覆盖需求分析、概要设计、详细设计、编码等前期阶段,而不应该在系统开发初步完成后才开始。 2.软件测试的对象:正确的依据应该是需求规格说明书…

【Java基础篇】数据类型与变量

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

SRC漏洞挖掘

SRC目标搜集 文章类的平台 国内漏洞响应平台(SRC)导航 - 安全客,安全资讯平台 百度搜索 首先得知道SRC厂商的关键字,利用脚本搜集一波。 比如【应急响应中心】就可以作为一个关键字。通过搜索引擎搜索一波,去重&…

【LeetCode: 343. 整数拆分 | 暴力递归=>记忆化搜索=>动态规划 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

前端三剑客

一.前端是什么: 前端主要是考虑怎样能让用户觉得用起来更舒服,考虑界面布局、交互效果、页面加载速度等等,主要是偏向用户看得见的部分,客户端(pc、手机、pad)上浏览web。网站的“前端”是与用户直接交互的…

自定义表头之数据库设计

数据库设计实现自定义列 表设计如下: 1.数据表 — 就是excel所有列数据的表 字段:(这个表根据你所需要的数据列写就可以) 案例: 2.列表 — 就是记录每个excel对应的完整列名 字段:(我这边是…

Python语法装饰器

参考: 【【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!-哔哩哔哩】 https://b23.tv/Y6Ss8cN【Python小技巧:装饰器(Decorator)-哔哩哔哩】 https://b23.tv/hacMmem x.1 Python中的Abstract…

探索云原生技术的优势和挑战

文章目录 探索云原生技术的优势和挑战一、云原生技术简介二、云原生技术的优势1. 弹性和可伸缩性2. 高可用性3. 快速迭代和部署4. 更好的安全性和可靠性 三、云原生技术的挑战1. 复杂性2. 安全风险3. 成本 四、总结 结语 探索云原生技术的优势和挑战 随着云计算技术的快速发展…

数字城市发展下的技术趋势,你知道多少?

提到数字城市、智慧城市大家都会感觉经常在耳边听到,但是要确切说出具体的概念还是有一点难度的。具体来说:数字城市是一个集合多种技术的系统,以计算机技术、多媒体技术和大规模存储技术为基础,以宽带网络为纽带,运用…

【JavaScript】ES6新特性(2)

5. 字符串扩展 5.1 includes函数 判断字符串中是否存在指定字符 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

2023年湖北安全员C证C3学历不够可以报考吗 ?个人如何报考?

2023年湖北安全员C证C3学历不够可以报考吗 &#xff1f;个人如何报考&#xff1f; 2023年建筑施工企业三类人员住建厅安全员C证报考是有一定要求的&#xff0c;很多人条件达不到是不是就不能报考&#xff0c;个人想要报考建筑安全员C证怎么去报名等一系列问题。其实都是可以解决…

云渲染与本地渲染:哪个最好?

我们过去曾指出&#xff0c;本地渲染动画和电影的 2D 或 3D 项目是一个非常耗时且计算密集型的过程。当在场景中使用未优化的几何体或在最终渲染中使用多多边形模型时&#xff0c;诸如此类的变量最终将增加完成单个渲染所需的时间和处理器能力。 为什么渲染需要这么长时间&…