ElasticSearch初级篇

x33g5p2x  于2020-11-02 转载在 ElasticSearch  
字(9.5k)|赞(0)|评价(0)|浏览(880)

1、ElasticSearch概述

1.1 什么是搜索?

百度:当想找寻任何信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象)。百度 != 搜索

1)互联网的搜索:电商网站,招聘网站,新闻网站,各种app;

2)IT系统的搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理。

搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到同这个关键字相关的某些信息。

1.2****用数据库做搜索

用数据库来做搜索,是很不靠谱的。通常来说,在数据量变大之后,性能就会相应地变得非常差。用数据库来做搜索,如下图所示。

1.3 全文检索和Lucene

**(1)**全文检索,倒排索引

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文搜索引擎数据库中的数据。全文检索使用到的关键技术便是倒排索引,倒排索引的基本原理,如下图所示。

**(2)**Lucene

Lucene,其实就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们在用java进行程序开发的时候,引入Lucene jar,然后基于Lucene的api去进行开发就可以了。

1.4 什么是ElasticSearch?

ElasticSearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库,要想发挥其强大的作用,需使用Java并要将其集成到你的应用程序中。Lucene非常复杂,需要深入的了解检索相关知识来理解它是如何工作的。ElasticSearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的Restful API让全文搜索变得简单并隐藏Lucene的复杂性。

关于ElasticSearch有一个传说,一个程序员失业了,陪着自己老婆去英国伦敦学习厨师课程。程序员在失业期间想给老婆写一个菜谱搜索引擎,觉得Lucene实在太复杂了,就开发了一个封装了Lucene的开源项目,compass。后来程序员找到了工作,是做分布式的高性能项目,觉得compass不够,就写了ElasticSearch,让Lucene变成了分布式的系统。一句话对ElasticSearch进行总结:ElasticSearch是一个实时分布式搜索和分析引擎,它用于全文搜索、结构化搜索和分析。

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

结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select /* from products where category_id='日化用品'。

数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些。

2、ElasticS****earch适用场景

ElasticSearch不仅仅是Lucene和全文搜索引擎,它还提供了:分布式的实时文件存储,每个字段都被索引并可被搜索;实时分析的分布式搜索引擎;可以扩展到上百台服务器,处理PB级结构化或非结构化数据。总结ElasticSearch适用于的场景,如下。

维基百科,类似于百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐;
*
The Guardian(国外新闻网站),类似于搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+ 社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜);
*
Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案;
*
国内:站内搜索(电商,招聘,门户等等),IT系统搜索(OA,CRM,ERP等等),数据分析(ES热门的一个使用场景);
*
GitHub(开源代码管理),搜索上千亿行代码。

3、ElasticSearch****特点

(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司;

(2)ElasticSearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,结合在了一起,才形成了独一无二的ES;Lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat);

(3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂;

(4)数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;ElasticSearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。

4、ElasticSearch核心概念

4.1 近实时(NRT)

ElasticSearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒左右);

4.2 集群(cluster)

一个集群就是由一个或多个节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的;

4.3 节点(node)

集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群;

4.4 索引(index)

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database的概念。在一个集群中,如果你想,可以定义任意多的索引。

4.5 类型(Type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念;

4.6 文档(document)

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的文档,当然,也可以拥有某个订单的文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。 在一个index/type里面,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。文档类似于关系型数据库中Record(记录)的概念。实际上一个文档除了用户定义的数据外,还包括_index、_type和_id字段。

4.7 字段(field)

Field是ElasticSearch的最小数据单位。一个document里面有多个field,每个field就是一个数据字段,如下图所示,document中的每一行就是一个field。

product document

{

"product_id": "1",

"product_name": "高露洁牙膏",

"product_desc": "高效美白",

"category_id": "2",

"category_name": "日化用品"

}

4.8 映射-约束(mapping)

数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。创建Mapping的代码示例如下图所示,这样就创建了一个名为blog的Index,Type不用单独创建,在创建Mapping 时指定就可以。Mapping用来定义Document中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。

client.indices.putMapping({

    index : 'blog',

    type : 'article',

    body : {

        article: {

            properties: {

                id: {

                    type: 'string',

                    analyzer: 'ik',

                    store: 'yes',

                },

                title: {

                    type: 'string',

                    analyzer: 'ik',

                    store: 'no',

                },

                content: {

                    type: 'string',

                    analyzer: 'ik',

                    store: 'yes',

                }

            }

        }

    }

});

4.9 ElasticSearch与数据库的****类比

关系型数据库(比如Mysql)

非关系型数据库(ElasticSearch)数据库Database

索引Index表Table

类型Type数据行Row

文档Document数据列Column

字段Field约束 Schema

映射Mapping

4.10ES存入数据和搜索数据机制

(1)索引对象(blog):存储数据的表结构 ,任何搜索数据,存放在索引对象上;

(2)映射(mapping):数据如何存放到索引对象上,需要有一个映射配置, 包括:数据类型、是否存储、是否分词等;

(3)文档(document):一条数据记录,存放在索引对象上;

(4)文档类型(type):一个索引对象,存放多种类型数据,数据用文档类型进行标识。

5、ElasticSearch安装配置

5.1 单节点

ElasticSearch官方下载地址:https://www.elastic.co/products/elasticsearch,如下图所示。

这里以elasticsearch-5.6.1.tar.gz安装包为例,进行ElasticSearch的安装和配置。将elasticsearch-5.6.1.tar.gz安装包上传到主机hadoop221的/root/tools目录中,运行命令tar -zxvf elasticsearch-5.6.1.tar.gz -C /root/training/,将elasticsearch-5.6.1.tar.gz安装包解压到/root/training/目录下,进入到/root/training/elasticsearch-5.6.1目录下,运行mkdir data,创建数据目录,如果当前目录下没有logs目录,则运行mkdir logs,创建logs目录,该版本已经有该logs目录,则不需要再创建了。

进入到/root/training/elasticsearch-5.6.1/config目录下,运行vi elasticsearch.yml,编辑修改配置文件,注意需要留有空格,参考如下。

/#cluster.name: my-application,修改为cluster.name: es

/#node.name: node-1,修改为node.name: node1

/#path.data: /path/to/data,修改为

path.data: /root/training/elasticsearch-5.6.1/data

/#path.logs: /path/to/logs,修改为

path.logs: /root/training/elasticsearch-5.6.1/logs

/#bootstrap.memory_lock: true,修改为bootstrap.memory_lock: false

增加bootstrap.system_call_filter: false

/#network.host: 192.168.0.1,修改为network.host: hadoop221

/#http.port: 9200,修改为http.port: 9200

新增discovery.zen.ping.unicast.hosts: ["192.168.142.221"]这一行内容

保存退出。返回到/root/training/elasticsearch-5.6.1目录下,如果现在直接运行命令bin/elasticsearch,试图启动ElasticSearch,则会报错误信息,原因是:这是出于系统安全考虑设置的条件,由于ElasticSearch可以接收用户输入的脚本并且执行,为了系统安全考虑, 建议创建一个单独的用户用来运行ElasticSearch。org.elasticsearch.bootstrap.StartupException:

java.lang.RuntimeException: can not run elasticsearch as root。

运行命令 useradd es,创建es用户,再运行命令chown -R es:es /root/training/elasticsearch-5.6.1/,将/root/training/

elasticsearch-5.6.1/目录中所有文件设置为es所属用户和所属组。

现在切换到es用户来启动ElasticSearch,还会报如下错误

ERROR: [2] bootstrap checks failed

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

运行命令 sudo vi /etc/security/limits.conf进行编辑,在文件末尾添加如下内容:

/* soft nofile 65536

/* hard nofile 131072

/* soft nproc 2048

/* hard nproc 4096

再运行命令sudo vi /etc/security/limits.d/20-nproc.conf进行编辑,如果/* soft nproc 1024中是1024,则修改为2048或4096,当前系统中该值是4096,则保持不变即可。运行命令sudo vi /etc/sysctl.conf进行编辑,在文件末尾添加如何一行内容:

vm.max_map_count=655360,保存退出后,运行sudo sysctl -p,验证是否配置成功。

做了上面这些修改配置后,再启动ElasticSearch就能够OK了,输出的部分log信息如下图所示。

如果是运行命令 bin/elasticsearch -d,则会以后台启动的方式启动ElasticSearch。再运行命令curlhttp://192.168.142.221:9200,可看到如下输出的log信息,进一步验证了ElasticSearch启动成功。

{

  "name" : "node1",

  "cluster_name" : "es",

  "cluster_uuid" : "dq-PHgFxS0uhCy7_7gNJNQ",

  "version" : {

    "number" : "5.6.1",

    "build_hash" : "667b497",

    "build_date" : "2017-09-14T19:22:05.189Z",

    "build_snapshot" : false,

    "lucene_version" : "6.6.1"

  },

  "tagline" : "You Know, for Search"

}

5.2 ElasticSearch集群

将elasticsearch-5.6.1.tar.gz安装包上传到主机hadoop222的/root/tools目录中,运行命令tar -zxvf elasticsearch-5.6.1.tar.gz -C /root/training/,将elasticsearch-5.6.1.tar.gz安装包解压到/root/training/目录下,进入到/root/training/elasticsearch-5.6.1目录下,运行mkdir data,创建数据目录,如果当前目录下没有logs目录,则运行mkdir logs,创建logs目录,该版本已经有该logs目录,则不需要再创建了

进入到/root/training/elasticsearch-5.6.1/config目录下,运行vi elasticsearch.yml,编辑修改配置文件,注意需要留有空格,参考如下。

添加node.data: true这一行内容

/#cluster.name: my-application,修改为cluster.name:es

/#node.name: node-1,修改为node.name: node1

/#path.data: /path/to/data,修改为

path.data: /root/elasticsearch-5.6.1/data

/#path.logs: /path/to/logs,修改为

path.logs: /root/training/elasticsearch-5.6.1/logs

/#bootstrap.memory_lock: true,修改为bootstrap.memory_lock: false

增加bootstrap.system_call_filter: false

/#network.host: 192.168.0.1,修改为network.host: hadoop222

/#http.port: 9200,修改为http.port: 9200

注意:/#discovery.seed_hosts: ["host1", "host2"],单机模式是修改为

discovery.seed_hosts: ["hadoop222"],集群模式需要注释掉这行,因为启用了discovery.zen.ping.unicast.hosts。

将/#discovery.zen.ping.unicast.hosts: ["host1", "host2"],修改为

discovery.zen.ping.unicast.hosts: ["hadoop222", "hadoop223", "hadoop224"]这一行内容

运行命令 sudo vi /etc/security/limits.conf进行编辑,在文件末尾添加如下内容:

/* soft nofile 65536

/* hard nofile 131072

/* soft nproc 2048

/* hard nproc 4096

再运行命令sudo vi /etc/security/limits.d/20-nproc.conf进行编辑,如果/* soft nproc 1024中是1024,则修改为2048或4096,当前系统中该值是4096,则保持不变即可。运行命令sudo vi /etc/sysctl.conf进行编辑,在文件末尾添加如何一行内容:

vm.max_map_count=655360,保存退出后,运行sudo sysctl -p,验证是否配置成功。

运行命令scp -r /root/training/elasticsearch-5.6.1/ root@hadoop223:/root/training/和scp -r /root/training/elasticsearch-5.6.1/ root@hadoop224:/root/training/,将hadoop222节点上安装好的elasticsearch,拷贝到hadoop223和hadoop224节点的/root/training/目录中。

运行命令 useradd es,创建es用户,再运行命令chown -R es:es /root/training/elasticsearch-5.6.1/,将/root/training/

elasticsearch-5.6.1/目录中所有文件设置为es所属用户和所属组

对于主机hadoop223和hadoop224的配置是类似的,需要按照上面创建es用户,并修改/root/training/elasticsearch-5.6.1/目录及文件为es所属用户和所属组,同时需要修改hadoop223上elasticsearch的配置文件,node.name: node2,network.host: hadoop223;修改hadoop224上elasticsearch的配置文件,node.name: node3,network.host: hadoop224;如此便可以正常启动ElasticSearch集群了,分别在主机hadoop222、hadoop223和hadoop224上启动ElasticSearch程序即可。在主机hadoop222上启动ES,输出log信息如下图所示。

在谷歌Chrome浏览器中安装ElasticSearch Head插件后,可查看ElasticSearch集群的运行状态,如下图所示。

6 ElasticSearch基础编程

ElasticSearch提供了多种多样的API可供开发者使用,下面举一些常用的编程实例。

(1)初始化客户端并连接到ES服务器

(2)使用ES提供的客户端创建索引

(3)使用ES提供的客户端删除索引

(4)通过JSON字符串创建文档数据

(5)通过Map数据结构创建文档数据

(6)通过ES提供的数据构建器创建文档数据

(7)搜索文档数据(单个索引)

(8)搜索文档数据(多个索引)

(9)更新文档数据(Update)

(10)、设置mapping映射

相关文章