少点代码,多点头发

本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。

https://github.com/midou-tech/articles

看文章有两点需要注意:

  • 本公号讲解的Elasticsearch是基于7.7.0版本,你们在阅读一些相关书籍和博客注意版本,不同版本很多概念会有出入。

  • 文章写作过程中会经常将Elasticsearch简写为Es,阅读过程中需要注意。

一般学习一个新的技术或者产品,第一步就是用起来。什么设计理论,框架源码,都别和我谈,先run起来。这也是在公司看别人项目的绝招。

用起来,有一个很明显的点,是你能感受到他,不然天天看理论知识,看源码会让你觉得你好像懂了,但又心里没底,最终会导致你走火入魔。

今天龙叔的主题就是 学Es,先run起来,用起来之后在去探索内部更多问题和原理。


Elasticsearch

Elasticsearch安装

Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

Elasticsearch 需要 Java 8 环境。如果你的机器还没安装 Java,可以在网上找个教程安装,注意要保证环境变量JAVA_HOME正确设置。

安装完 Java,就可以跟着 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html 安装 Elasticsearch。我这里就直接下载压缩包比较简单。

#mac和linux上安装教程一样的
# 下载
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
$ shasum -a 512 -c elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
#解压
$ tar -xzf elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ cd elasticsearch-7.7.0/

接着,进入解压后的目录,运行下面的命令,启动 Elasticsearch。

$ ./bin/elasticsearch

如果一切正常,那可能是run起来了,Es默认打开9200端口。测试下是否启动成功,用 curl 工具测试(这个工具后面会写一篇文章介绍,还有上面用的wget),也可以在浏览器访问。

$ curl localhost:9200 #测试命令
{
"name" : "MacBook-Pro.local",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Z1NxCjE4T6CgTjZmpAVe_A",
"version" : {
"number" : "7.7.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
"build_date" : "2020-05-12T02:01:37.602180Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。

收到这样一个JSON对象,说明启动成功。

安装整体没什么压力,java环境装好,基本就是开箱即用。程序员最喜欢使用这样的中间件,开箱即用,从不管箱子里面是啥。

基本概念

本来run起来就准备说搞点数据进去,在和Es进行交互起来,但是正在准备写数据进索引的时候,发现不对劲。

可能有人根本不知道什么是索引?什么Document。于是 就来了,先普及下基本概念。

节点(Node) 与集群( Cluster)

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。

单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

索引(Index)

Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index),也经常称之为倒排索引。查找数据的时候,直接查找该索引。

Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

文档(Document)

Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

写点数据进Es

基本概念已经有了,知道查找是通过倒排索引进行的,所以数据肯定是存放在索引里面的。

我们现在要写数据进Es,其实就是把数据写到Es的索引(index)中,前面已经把Es启动起来了,并没有创建索引。

今天写数据就不写代码了,利用ES的一些封装很好的接口,直接命令行操作,后期在用代码写数据进Es。

先创建一个index ,使用curl 工具在命令行操作,这是一个put请求。

$curl -X PUT 'localhost:9200/user'

查看索引是否以及创建成功

$ curl -X GET 'http://localhost:9200/_cat/indices?v'

这个get请求可以查看当前节点的所有索引

妥妥的已经创建成功

顺便说下,删除一个索引的命令,DELETE参数表示删除

$curl -X DELETE 'localhost:9200/user'

到这里索引已经创建好了,可以写点数据进去了。使用接口 /index/_doc/id ,/索引名/_doc/doc_id

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/1' -d '
{
"name": "龙跃十二",
"title": "工程师",
"desc": "一个分享互联网技术和心路历程的star"
}'

查看当前索引下的所有数据

$ curl 'localhost:9200/user/_search?pretty=true

到这里基本我们已经可以写数据到指定索引了,生产场景不会这么写数据的,都是用代码写海量数据进ES的,这就几条数据也没什么搜索性能可谈的。

我之前工作中日志数据都是TB级别的写到Es中,当遇到这种数据量的搜索时才会感受到搜索引擎的魅力,才会意识到Es的重要性。

这里主要是练手和跑通流程,所以造了一些数据到Es中

和ES进行交互

其实写数据进Es已经是一种交互了,在讲一些其他的交互接口

目前讲的交互方式主要是通过原生的请求的方式,还没有上升到界面操作,后期在学习的过程中会展现出来。

查询交互

使用 GET 方法,直接请求/Index/_search,就会返回所有记录。

$ curl 'localhost:9200/user/_search?pretty=true'
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "龙跃十二",
"title" : "工程师",
"desc" : "一个分享互联网技术和心路历程的star"
}
},
{
"_index" : "user",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "三y",
"title" : "工程师",
"desc" : "只有光头才能变得更强"
}
},
{
"_index" : "user",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "敖丙",
"title" : "工程师",
"desc" : "一个互联网苟且偷生的工具人"
}
}
]
}
}

上面代码中,返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下。

  • total:返回记录数,本例是2条。
  • max_scor:最高的匹配程度,本例是1.0。
  • hits:返回的记录组成的数组。

返回的记录中,每条记录都有一个_score字段,表示匹配的程序,默认是按照这个字段降序排列。

Es的查询语法还有很多,后面在结合实战项目的时候会讲解其他语法,你也可以看下官网语法介绍 官网查询语法

数据操作交互

新增一条doc记录的语法示例如下,可以不用指定doc_id的,Es会默认有一个doc_id。

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
"name": "敖丙",
"title": "工程师",
"desc": "一个互联网苟且偷生的工具人"
}'

删除一条doc记录的语法是 /Index/_doc/doc_id

$ curl -X DELETE  'localhost:9200/user/_doc/1'

更新一条记录的语法示例

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
"name": "三太子敖丙",
"title": "工程师",
"desc": "一个互联网苟且偷生的工具人"
}'

总结一下

本篇文章,我们把Es从官网下载下来,可以run起来,可以写数据进去,可以查询,学习了一些简单的交互语法。

当然Es的魅力不在于此,Es的魅力之一在于可以对海量数据进行高效的检索。

下篇文章出一个关于Es的写作大纲,方便大家在看的过程中有一个整理的轮廓。

Es整个知识点我也是边学边写,有什么不对的地方,还希望大佬们尽管指出来。


龙跃十二

Elasticsearch 别管原理,先run起来的更多相关文章

  1. 【分布式搜索引擎】Elasticsearch分布式架构原理

    一.相关概念介绍 1)集群(cluster) 一个集群(cluster)由一个或多个节点组成. 这些节点具有相同的cluster.name,它们协同工作,分享数据和负载.当加入新的节点或者删除一个节点 ...

  2. Elasticsearch安装、原理学习总结

    ElasticSearch ElasticSearch概念 Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎. 什么是Elastic Stack Elastic Sta ...

  3. 从查询重写角度理解elasticsearch的高亮原理

    一.高亮的一些问题 elasticsearch提供了三种高亮方式,前面我们已经简单的了解了elasticsearch的高亮原理; 高亮处理跟实际使用查询类型有十分紧密的关系,其中主要的一点就是muti ...

  4. elasticsearch学习笔记--原理介绍

    前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...

  5. Elasticsearch学习总结--原理篇

    一.概念 1.1 官方文档 以下总结自ElasticSearch的官方文档以及自己的一些实践,有兴趣的可以直接阅读官方文档: https://www.elastic.co/guide/en/elast ...

  6. Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理

    前言 创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据.新增的业务数据,我们根据 Mapping 来生 ...

  7. 十分钟搞懂Elasticsearch数字搜索原理

    更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森 前言 Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对于字段类型是 ...

  8. Elasticsearch 分片路由原理指定分片存储查询

    Elasticsearch 项目中使用到Es的父子结构.在数据填充之后,查看每个节点的数据分布情况,发现有的节点数据多,有的节点少的情况,在未使用Es父级结构之前,每个节点的数据分布还算平均,如下图: ...

  9. Elasticsearch的架构原理剖析

    Elasticsearch 是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建.Elasticsearch 看名字就能大概了解下它是一个弹性的搜索引擎 ...

随机推荐

  1. 说一说JS的IIFE

    1. 定义IIFE: Immediately Invoked Function Expression,意为立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数.对比一下,这是不采用IIFE时 ...

  2. 全网最全Docker命令详解

    由于最近在学习Docker,在这里把有关Docker的命令做一个集合,方便后面查看: # docker --help Usage: docker [OPTIONS] COMMAND [arg...] ...

  3. 虚拟机安装配置(VMware与CentOS安装)

    VMware下载地址: https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html centO ...

  4. 06.drf(django)的权限

    默认配置已经启用权限控制 settings 'django.contrib.auth', 默认 migrate 会给每个模型赋予4个权限,如果 ORM 类不托管给django管理,而是直接在数据库中建 ...

  5. MyCat垂直分库

    一.什么是垂直分库 将一类功能的表从一个实例切分到另一个实例,横向扩展实例,增加写负载 目标:将1个实例的4类表拆分多4个实例中 二.垂直切分步骤 2.1收集分析业务模块间的关系,能分几个库 2.2全 ...

  6. Java的集合(一)

    转载:https://blog.csdn.net/hacker_zhidian/article/details/80590428 Java集合概况就三个:List.set和map list(Array ...

  7. search(16)- elastic4s-内嵌文件:nested and join

    从SQL领域来的用户,对于ES的文件关系维护方式会感到很不习惯.毕竟,ES是分布式数据库只能高效处理独个扁平类型文件,无法支持关系式数据库那样的文件拼接.但是,任何数据库应用都无法避免树型文件关系,因 ...

  8. Aizu - 2224

    题目链接:https://vjudge.net/problem/Aizu-2224 题目大意: 先给出 N 个点的坐标(x,y),这N个点之间有且只有M条边,接下来给出 M 条边的两端点,每条边对应的 ...

  9. 阿里云部署Java开发环境

    阿里云部署Java网站和微信开发调试心得技巧(上) 本文主要是记录在阿里云服务器从零开始搭建Java执行环境并且部署web project的过程,方面以后查阅. 一.申请阿里云服务器 购买阿里云服务器 ...

  10. [JavaWeb基础] 007.Struts2的配置和简单使用

    1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架,用于快速开发Java Web应用.Struts实现的重点在C(Controller), ...