ElasticSearch简写ES,ES是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。

应用场景

  • 我们常见的商城商品的搜索
  • 日志分析系统(ELK)
  • 基于大量数据(数千万的数据)需要快速调查、分析并且并将结果可视化的业务需求

安装并运行ES

Java环境安装

Elastic 需要 Java 8 环境。如果你的机器还没安装 Java,可以参考JAVA安装

ElasticSearch安装

安装完Java环境后,我们可以开始以下ElasticSearch安装或者根据官方文档安装

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
unzip elasticsearch-5.5..zip
cd elasticsearch-5.5./

进入解压目录之后,运行下面命令,启动ElasticSearch

./bin/elasticsearch

如果此时报以下错误

错误一
OpenJDK -Bit Server VM warning: If the number of processors is expected to increase from one, thenyou should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

打开: elasticsearch-5.5.1/config/jvm.options

在末尾添加:

-XX:-AssumeMP
错误二
OpenJDK -Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, , ) failed; error='Cannot allocate memory' (errno=)

先执行:

sysctl -w vm.max_map_count=

再打开elasticsearch-5.5.1/config/jvm.options

-Xmx512m
-Xms512m
错误三
[--27T15::,][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

原因:elasticsearch自5版本之后,处于安全考虑,不允许使用root用户运行。

解决:创建一个普通用户,将elasticsearch 安装目录权限修改一下,切换至普通用户运行elasticsearch就可以了

useradd elk
chown -R elk.elk /usr/local/share/applications/elasticsearch-5.5.
su - elk
cd /usr/local/share/applications/elasticsearch-5.5.

重新启动

./bin/elasticsearch

如果一切正常,Elastic 就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口,会得到说明信息。

$ curl 'localhost:9200'
{
"name" : "cWyaT72",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "A7akNm1SRw2Gm-BdSBkdaw",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}

访问配置

Elastic 默认情况下,只允许本地访问,如果需要远程访问,可以修改 config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。

network.host: 0.0.0.0

上面代码中,设成0.0.0.0让任何人都可以访问。线上服务不要这样设置,要设成具体的 IP。

基本概念

Node 与 Cluster

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

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

查看Cluster Health

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

获取集群的所有节点

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

Index

Elastic会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。(一个 Index 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方)。

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

下面的命令可以查看当前节点的所有 Index。

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

Document

Index里的单条记录称为Document,多条Document构成一个Index.

Document使用JSON格式表示,如:

{
"goods_name": "空调",
"category_name": "家电分类",
"price": "3999.00"
}

同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

Type

Document是可以分组的,如goods_list这个Index ,可以按照category(家电、衣服)分类,也可以按照price(>1000、 <1000)分类。这种分组叫Type它是虚拟的逻辑分组,用于过滤Document

列出每个Index下面的Type

curl 'http://localhost:9200/_mapping?pretty=true'

根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

Index操作

新建(Create Index)

新建 Index,可以直接向 Elastic服务器发出 PUT 请求。下面的例子是新建一个名叫goods_list的 Index

curl -X PUT 'http://localhost:9200/goods_list'

服务器返回一个 JSON 对象,里面的acknowledged字段表示操作成功。

{
"acknowledged": true,
"shards_acknowledged": true
}

删除(Delete Index)

curl -X DELETE 'http://localhost:9200/goods_list'
{
"acknowledged": true
}

数据操作

上面介绍了IndexType的一些基本的概念和Index的基本操作,现在先来创建一个完整的Index结构,并对数据进行操作。

新建Index结构

curl -X PUT 'localhost:9200/goods_list' -d '
{
"mappings": {
"goods_info": {
"properties": {
"goods_name": {
"type": "keyword"
},
"category_name": {
"type": "keyword"
},
"price": {
"type": "float"
}
}
}
}
}
' {
"acknowledged": true
}

执行上面命名,重新创建一个新的Index

新增记录

向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/goods_list/goods_info发送请求,就可以新增一条商品记录。

curl -X PUT 'localhost:9200/goods_list/goods_info/1' -d '
{
"goods_name": "华为笔记本",
"category_name": "计算机",
"price": ""
}'

服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息:

{
"_index": "goods_list",
"_type": "goods_info",
"_id": "",
"_version": ,
"result": "created",
"_shards": {
"total": ,
"successful": ,
"failed":
},
"created": true
}

相信细心的你会发现/goods_list/goods_info/1,后面多了一个1,这个1是该条记录的 ID。可以是任意字符串

新增记录的时候,也可以不指定 Id,这时要改成 POST 请求。

curl -X POST 'localhost:9200/goods_list/goods_info' -d '
{
"goods_name": "洗衣机",
"category_name": "家电",
"price": "899.99"
}'

如果没有指定ID,那么Elastic会随机生成一串字符串作为ID

{
"_index": "goods_list",
"_type": "goods_info",
"_id": "AWub5f7FFq1D5epJJhqT",
"_version": ,
"result": "created",
"_shards": {
"total": ,
"successful": ,
"failed":
},
"created": true
}

查看记录

curl 'localhost:9200/goods_list/goods_info/1?pretty=true'

上面代码请求查看/goods_list/goods_info/1这条记录,URL 的参数pretty=true表示以易读的格式返回。

返回的数据中,found字段表示查询成功,_source字段返回原始记录:

{
"_index" : "goods_list",
"_type" : "goods_info",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"goods_name" : "华为笔记本",
"category_name" : "计算机",
"price" : ""
}
}

如果 ID不正确,就查不到数据,found字段就是false

curl 'localhost:9200/goods_list/goods_info/2?pretty=true'

ID=2并不存在,所以会返回以下结果:

{
"_index" : "goods_list",
"_type" : "goods_info",
"_id" : "",
"found" : false
}

删除记录

curl -X DELETE 'localhost:9200/goods_list/goods_info/1'

PS:这里先不要删除这条记录,后面还要用到。

更新记录

curl -X PUT 'localhost:9200/goods_list/goods_info/1' -d '
{
"user" : "华为笔记本",
"title" : "计算机",
"desc" : ""
}'

更新记录就是使用 PUT 请求,重新发送一次数据。

{
"_index": "goods_list",
"_type": "goods_info",
"_id": "",
"_version": ,
"result": "updated",
"_shards": {
"total": ,
"successful": ,
"failed":
},
"created": false
}

返回结果里面,有几个字段发生了变化:

"_version" : ,
"result" : "updated",
"created" : false

数据查询

返回所有记录


curl 'localhost:9200/goods_list/goods_info/_search'
{
"took": ,
"timed_out": false,
"_shards": {
"total": ,
"successful": ,
"failed":
},
"hits": {
"total": ,
"max_score": ,
"hits": [
{
"_index": "goods_list",
"_type": "goods_info",
"_id": "AWub5f7FFq1D5epJJhqT",
"_score": ,
"_source": {
"goods_name": "洗衣机",
"category_name": "家电",
"price": "899.99"
}
},
{
"_index": "goods_list",
"_type": "goods_info",
"_id": "",
"_score": ,
"_source": {
"user": "华为笔记本",
"title": "计算机",
"desc": ""
}
}
]
}
}

 

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

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

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

总结

这里主要介绍了Elastic的安装、基本概念以及数据的基本操作,在下一章带来Elastic的分词和全文搜索以及相关的技术点。

原文地址

https://github.com/WilburXu/b...

ElasticSearch 连载一 基础入门的更多相关文章

  1. Elasticsearch(一)基础入门

    介绍 Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以前所未有的速度和规模,去探索你的数据. 它被用作全文检索.结构化搜索.分析以及这三个功能的组合: Elasticsearc ...

  2. Elasticsearch: 权威指南---基础入门

    1.查看方式:GETURL:http://10.10.6.225:9200/?pretty pretty 在任意的查询字符串中增加pretty参数.会让Elasticsearch美化输出JSON结果以 ...

  3. ElasticSearch 连载二 中文分词

    ElasticSearch 连载二 中文分词 上一章ElasticSearch 连载一 基础入门 对Elastic的概念.安装以及基础操作进行了介绍. 那是不是有童鞋会有以下几个问题呢? 什么是中文分 ...

  4. Elasticsearch 基础入门

    原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...

  5. Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】

    前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...

  6. ElasticSearch基础入门学习笔记

    前言 本笔记的内容主要是在从0开始学习ElasticSearch中,按照官方文档以及自己的一些测试的过程. 安装 由于是初学者,按照官方文档安装即可.前面ELK入门使用主要就是讲述了安装过程,这里不再 ...

  7. ELKStack的基础入门和中文指南

    一.ELKStack的中文指南 redhat系列配置repo源 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch vi / ...

  8. Logstash 基础入门

    原文地址:Logstash 基础入门博客地址:http://www.extlight.com 一.前言 Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力.它可以统一过滤来自不同源的 ...

  9. Kibana 基础入门

    原文地址:Kibana 基础入门 博客地址:http://www.extlight.com 一.前言 Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作.Kibana ...

随机推荐

  1. jQuery 控制網頁捲軸移動 & Ignore link '#' method jump action

    $('a.gotoheader').click(function(){ // 讓捲軸移動到 0 的位置 $(); // ignore link "#" method return ...

  2. box-sizing:border-box 将元素的内边距和边框都设定在宽高内计算

    http://www.w3school.com.cn/cssref/pr_box-sizing.asp box-sizing: content-box|border-box|inherit; 值 描述 ...

  3. docker之容器日志存储位置及把运行日志记录至文件

    参考:https://www.cnblogs.com/YatHo/p/7866029.html docker启动后日志会在以下位置 /var/lib/docker/containers/容器ID/容器 ...

  4. bootstrap:时间日期日历控件(datetimepicker)

    https://blog.csdn.net/qq_33368846/article/details/82223676 Bootstrap datetimepicker控件的使用 1.支持日期选择,格式 ...

  5. golang 学习 (八)协程

    一: 进程.线程 和 协程 之间概念的区别:        对于 进程.线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法)    (补充: 抢占式调度与非抢占(轮询 ...

  6. transform-transition-animation(1)

    网布就是我们的屏幕,x轴沿屏幕平行的水平方向,y轴沿屏幕平行的垂直方向,z轴沿与屏幕垂直方向. rotateX(angle), rotateY(angle), rotateZ(angle), rota ...

  7. [转帖]TPC-C解析系列01_TPC-C benchmark测试介绍

    TPC-C解析系列01_TPC-C benchmark测试介绍 http://www.itpub.net/2019/10/08/3334/ 学习一下. 自从蚂蚁金服自研数据库OceanBase获得TP ...

  8. Vue.js 2.x 混入

    Vue.js 2.x mixins 混入 混入(mixins)是一种分发vue组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身 ...

  9. CentOS6.8 克隆

    克隆 克隆前,先将上面安装好并且设置好的系统关机 (1) 右键centos -->管理->克隆->下一步->下一步->完整克隆 ->克隆名称起名有意义点就行-> ...

  10. Qt4 和 Qt5 模块的分类

    Qt5 与 Qt4 其中的一个区别是底层架构进行了改变,Qt5 引入了更加详细的模块化的概念,将众多功能细分到几个模块之中,Qt4 则是一种粗略的划分.本文主要对 Qt5 和 Qt4的模块进行一个简单 ...