当前位置:文档之家› ElasticSearch面试题

ElasticSearch面试题

ElasticSearch面试题
ElasticSearch面试题

1:es介绍

Elasticsearch是一个基于Lucene的实时的分布式搜索和分析引擎。设计用于云计算中,

能够达到实时搜索,稳定,可靠,快速,安装使用方便。基于RESTful接口。

普通请求是...get?a=1

rest请求....get/a/1

2:全文搜索的工具有哪些

Lucene Solr Elasticsearch

3:es的bulk的引用场景

1.bulk API可以帮助我们同时执行多个请求

2.create 和index的区别

如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行。

3.可以使用文件操作

使用文件的方式

vi requests

curl -XPOST/PUT localhost:9200/_bulk --data-binary @request;

bulk请求可以在URL中声明/_index 或者/_index/_type

4.bulk一次最大处理多少数据量

bulk会把将要处理的数据载入内存中,所以数据量是有限制的

最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载

一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是

5-15MB,默认不能超过100M,

可以在es的配置文件中修改这个值http.max_content_length: 100mb

5.版本控制的一个问题

在读数据与写数据之间如果有其他线程进行写操作,就会出问题,es使用版本控制才避免这种问题。

在修改数据的时候指定版本号,操作一次版本号加1。

6.es的两个web访问工具

BigDesk Plugin (作者Luká? Vl?ek) 简介:监控es状态的插件,推荐!主要提供的是节点的实时状态监控,包括jvm的情况,linux的情况,elasticsearch的情况

Elasticsearch Head Plugin (作者Ben Birch) 简介:很方便对es进行各种操作的客户端。4:核心概念

集群 cluster***

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。

es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,

你与任何一个节点的通信和与整个es集群通信是等价的。

主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。

只需要在同一个网段之内启动多个es节点,就可以自动组成一个集群。

默认情况下es会自动发现同一网段内的节点,自动组成集群。

分片 shards*

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

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

curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'

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

index.number_of_shards: 5

副本 replicas*

代表索引副本,es可以给索引设置副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。

二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

可以在创建索引库的时候指定,副本数后期可以更改。

curl -XPUT 'localhost:9200/test2/' -d'{"settings":{"number_of_replicas":2}}'

默认是一个分片有1个副本

index.number_of_replicas: 1

数据重新分布 recovery *

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

数据的持久化操作 gateway*

代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。

当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

自动发现机制 discovery.zen*

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

集群或节点与客户端交互的方式 Transport*

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

index 和rdbms中的数据库相似

type 表

document 行

field 列

5:serachType

四种搜索类型,详细介绍

分布式搜索的流程

先把查询请求发送给集群的某一个节点

某个节点把最终的结果返回给客户端

QUERY_AND_FETCH

1:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,

2:每个分片会把查询的数据(包含数据的分值,以及数据的详细内容)返回给某一个节点进行汇总,排序,然后把这些数据返回给客户端

这样客户端可能会收到(10*分片数量) 的数据

这种方案,数据量和排名都有问题。

优点:效率高,查询速度快

QUERY_THEN_FETCH(默认)

1:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,

2:每个分片会把查询的数据(包含数据的分值,以及数据ID)返回给某一个节点进行汇总,排序,取前10名

3:根据前10名的id到对应的分片查询数据的详细内容,返回给客户端

这种方案,解决了数据量的问题。

但是排名还有有问题。

(DFS:初始化散发过程)

DFS_QUERY_AND_FETCH

1:在查询之前,会把所有分片的词频和文档频率(打分依据)汇总到一块

2:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,

3:每个分片会把查询的数据(包含数据的分值,以及数据的详细内容)返回给某一个节

点进行汇总,排序,然后把这些数据返回给客户端

解决了排名的问题

还存在数据量的问题

DFS_QUERY_THEN_FETCH

1:在查询之前,会把所有分片的词频和文档频率(打分依据)汇总到一块

2:客户端把请求发送给集群中的某一个节点,这个节点会把查询请求发送给所有分片去执行,

3:每个分片会把查询的数据(包含数据的分值,以及数据ID)返回给某一个节点进行汇总,排序,取前10名

4:根据前10名的id到对应的分片查询数据的详细内容,返回给客户端

既解决了排名问题,也解决了数据量的问题

但是性能最低

总结一下,从性能考虑QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH 是最慢的。从搜索的准确度来说,DFS要比非DFS的准确度更高。

高亮补:高亮的注意事项:

高亮的内容和原始内容是分开返回的

高亮字段的内容必须在es中存储(是否存储这个属性的值必须是true)

分组:分组统计数量或者分组统计分数

删除索引库:两种方式xurl或者java api

Timeout :

6:建立索引和查询的流程

建立索引的流程:

首先根据空白符进行分割再切分关键词,去除停用词,如果有英文全部转换为小写,对切分的关键词建立索引,每个关键词都有对应的id,还有一个倒排索引队列存储该关键词出现在文档的id,在该文档出现的次数,在该文档出现的位置

查询的流程:

首先根据空白符进行分割,再切分关键词,去除停用词,如果有英文全部转换为小写,将切分后的到的关键词和索引库进行匹配

中文分词器-IK

es官方提供的分词插件对中文分词效果不是很好,可以集成ik分词,对中文分词效果比较好

如果想根据自己的规则进行分词,可以自定义分词库,自定义分词库文件必须以.dic

结尾,词库文件的编码为utf—8 without bom,一个词语一行,将自定义的文件库加入到

ES_HOME/config/ik/ 目录下,修改ik的配置文件,重启生效

7:为什么使用索引工具查询快

(使用了倒排索引的技术,大致介绍一下倒排索引,还有索引库中的词都是按照顺序排列,

后期根据一个关键词查询的时候,可以利用类似折半查找的算法,查询效率非常高)

使用了倒排索引的技术,一般我们都是这样定义id 关键词,倒排索引是关键词id正好相反,使用索引工具进行查询时,首先得到关键词,建立倒排索引表,关键词----索引列表包含该关键词所在的文档的id、在该文档中出现的次数、在该文档中出现的位置信息,这种由属性值确定记录的位置的方式成为倒排索引。还有索引库中的词都是按照顺序排列,后期根据一个关键词查询的时候,

可以利用类似折半查找的算法,查询效率非常高

8.setting 与mapping 作用

settings修改索引库默认配置

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

查看:curl -XGET https://localhost:9200/crxy/_settings?pretty

(操作不存在索引)

curl -XPUT 'localhost:9200/crxy/'

-d'{"settings":"number_of_shards":3,"number_of_replicas":2}}'

(操作已存在索引)

curl -XPUT 'localhost:9200/crxy/_settings' -d'{"index":{"number_of_replicas":2}}'

Mapping,动态mapping机制:这个机制会自定识别参数值的类型,自动给这个参数设置属性

好处:操作方便,不需要提前考虑这个字段是否在es中定义过。

弊端:针对一个未知的数据,本来不应该存储的,这样也会存储了,对数据基本没有什么可控性

在实际开发中,如果数据类型已知,建议还是关闭自动mapping。

如果数据类型未知,只能使用自定mapping机制

9:分片查询方式:

es中默认的分片查询方式为随机从分片中取数据,其他的分片查询方式还有如:

_local:查询操作首先在本地查找,如果本地没有再到其他节点进行查找

_primary:只在主分片中查询

_shads:按照指定的分片进行查询,这种查询方式实现了es的极速查询

(在存储数据的时候通过rooting参数可以指定将数据分配到某一个分片中,rooting参数值相同的分配到一个分片中,后期查询时可以根据rooting参数值指定到哪个分片中查找,从而实现了极速查询)

修改源码自定义从多个节点进行查询等

10:es集群的脑裂问题

es集群有可能会出现脑裂问题,原因主要有两个:

1)如果集群中节点不在同一个网段有可能是网络延迟造成的

2)如果集群中的节点在同一个网段,有可能是主节点负载太大造成的

解决方案主要有两种:

1)把主从节点的职责分离,设置三个储备主节点,node.master=true,node.data=false

从节点只存储数据,node.master=false,node.data=true

2)增加延迟时间

将储备主节点数最小设为n/2+1个

11:优化

适当调大系统打开的最大打开文件数,默认为1024

修改配置文件调整es的jvm内存的大小,根据服务器内存的大小,一般分配60%左右,默认是256M

分片的数量最好设置为5-20个(es中一个分片最多存20G的数据,分片数在创建索引库时就指定,而且创建后不能修改,分片数最少设置为:数据量/20G个,如果所有分片都存满数据,需要再重新建立索引库)分片设置的过多过少都会导致检索比较慢,分片数过多会导致检索时打开比较多的文件,

也会导致多台服务器之间的通信;分片数过少会导致单个分片索引过大,所以检索速度慢。

副本数多可以提升搜索能力,但是如果设置的副本数过多也会对服务器造成额外的压力,因为需要同步数据,所以设置2-3个即可

定时对索引进行优化,合并索引片段,一个索引片段的最好不要超过1G,将多个索引片段合并成一个大的索引片段时,不要太大,太大打开会很慢。

删除一条数据时不会立即删除,而是产生一个.del的文件,在检索过程中这部分数据也会参与检索,在检索过程中会判断是否删除了,如果删除了再过滤掉,这样会降低检索效率,可以定时执行curl命令进行删除或通过程序代码进行删除。

如果项目开始的时候需要批量入库大量数据,建议将副本数设为0,因为副本存在,数据要同步到副本,增加es的压力,索引完成后再将副本数修改过来,这样可以提高索引效率。

去掉mapping中的_all域,这个虽然会给查询带来方便,但是会增加索引时间和所以尺寸

Log输出的水平默认为trace,查询超过500ms即为慢查询,就要打日志,造成cpu,内存,io负载很高,把log水平调为info或是修改配置将查询超时时间调的长一些。

12:典型的应用场景

es+hbase

利用两个框架的优点实现快速复杂查询和海量数据存储

Es+hbase:利用这两个框架的优点实现快速复杂查询和海量数据存储。

Es通过建立索引实现快速查询,它也可以存储但是不适合海量数据的存储,只存储需要那些需要从索引库中直接返回给客户的内容

Hbase适合海量数据存储,按rowkey查询可以实现快速查询,但是按列查询效率不高,所以结合es实现按字段快速查询

例如:针对海量的文章数据进行存储和快速复杂查询服务就可以通过es+hbase

比如文章数据有:(如果是面试题,需要问清楚需求,需要根据哪些字段进行查询,哪些内容直接从索引库中直接返回给客户,再进行下面的设置)

Es的设计:

Id:es内置,既建立索引也存储

Title:既建立索引也存储

Author:不建立索引,存储

Describe:既建立索引也存储

Content:建立索引不存储

Hbase的设计:

Rowkey的设计:文章的id

一个列族:info

列限定符:title,author,describe,content

13.客户端请求过程

文档能够通过主要分片(Primary Shard)或者任意一个副本分片(Replica Shard)获取。

每个步骤解释如下:

客户端(Client)发送一个请求到节点1。

该节点利用文档的_id字段来判断该文档属于分片0。分片0的分片拷贝(主要分片或者是副本分片)存在于所有的3个节点上。这一次,它将请求转发到了节点2。

节点2将文档返回给节点1,节点1随即将文档返回给客户端。对于读请求(Read Request),

请求节点(Requesting Node)每次都会选择一个不同的分片拷贝来实现负载均衡-循环使用所有的分片拷贝。

可能存在这种情况,当一份文档正在被索引时,该文档在主要分片已经就绪了,但是还未被拷贝到其他副本分片上。

此时副本分片或许报告文档不存在(译注:此时有读请求来获取该文档),然而主要分片能够成功返回需要的文档。

一旦索引请求返回给用户的响应是成功,那么文档在主要分片以及所有副本分片上都是可用的。

ElasticSearch面试题

1:es介绍 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析引擎。设计用于云计算中, 能够达到实时搜索,稳定,可靠,快速,安装使用方便。基于RESTful接口。 普通请求是...get?a=1 rest请求....get/a/1 2:全文搜索的工具有哪些 Lucene Solr Elasticsearch 3:es的bulk的引用场景 1.bulk API可以帮助我们同时执行多个请求 2.create 和index的区别 如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行。 3.可以使用文件操作 使用文件的方式 vi requests curl -XPOST/PUT localhost:9200/_bulk --data-binary @request; bulk请求可以在URL中声明/_index 或者/_index/_type 4.bulk一次最大处理多少数据量 bulk会把将要处理的数据载入内存中,所以数据量是有限制的 最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载 一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是 5-15MB,默认不能超过100M, 可以在es的配置文件中修改这个值http.max_content_length: 100mb 5.版本控制的一个问题 在读数据与写数据之间如果有其他线程进行写操作,就会出问题,es使用版本控制才避免这种问题。 在修改数据的时候指定版本号,操作一次版本号加1。 6.es的两个web访问工具

elasticsearch学习文档

1.全文搜索引擎elasticsearch 1.1.Elasticsearch简介 Elasticsearch是开源的,分布式的,提供rest接口,支持云端调用的,构建在Apache Lucene之上的搜索引擎。 1.2.优点&缺点 优点:开箱即用,分布式,rest 接口,支持云端调用。 缺点:没有大量商业产品应用。分片的数目不能动态调整,只能在初始化索引的时候指定。 2.E lasticsearch的安装 2.1.运行环境 JDK6以上 2.2.下载Elasticsearch 为了更好的对中文进行分词,减少配置问题,下载集成分词的elasticsearch-rtf(基于elasticsearch 0.90.0,目前elasticsearch更新到0.90.5)版本。Rtf集成了ik、mmseg分词以及searchwrapper、thrift等插件。 什么是ElasticSearch-RTF? RTF是Ready To Fly的缩写,在航模里面,表示无需自己组装零件即可直接上手即飞的航空模型,elasticsearch-RTF是针对中文的一个发行版,即使用最新稳定的elasticsearch版本,并且帮你下载测试好对应的插件,如中文分词插件等,还会帮你做好一些默认的配置,目的是让你可以下载下来就可以直接的使用。下载地址如下:https://https://www.doczj.com/doc/0c5172251.html,/medcl/elasticsearch-rtf

注释:分词是用于模糊匹配的时候,是把一段话当成词语还是当成单个字来搜索的规则。 2.3.安装 解压elasticsearch-rtf-mast.zip到你指定的目录下即可。 2.4.运行 2.4.1.启动服务 cd/usr/local/elasticsearch/bin/service ./elasticsearch start 第一次启动服务后,在/usr/local/elasticsearch目录生成data目录和logs目录2.4.2.停止服务 cd/usr/local/elasticsearch/bin/service ./elasticsearch stop 3.e lasticsearch配置文件详解 elasticsearch.yml配置文件内容较多,挑几个可能会用的说一下。 https://www.doczj.com/doc/0c5172251.html,: elasticsearch 配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。 https://www.doczj.com/doc/0c5172251.html,: "Franz Kafka" 节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt 文件中,其中有很多作者添加的有趣名字。 node.master: true 指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。 network.bind_host: 192.168.0.1

ElasticSearch使用手册

ElasticSearch使用手册 一、ElasticSearch简介 1.1.什么是ElasticSearch ElasticSearch(以下均检查ES)是Compass(基于Lucene开源项目)作者Shay Banon在2010年发布的高性能、实时、分布式的开源搜索引擎。后来成立了ElasticSearch公司,负责ES相关产品的开发及商用服务支持,ES依旧采用免费开源模式,但部分插件采用商用授权模式,例如Marvel插件(负责ES的监控管理)、Shield插件(提供ES的授权控制)。 1.2.ElasticSearch的基础概念 ?Collection 在SolrCloud集群中逻辑意义上的完整的索引。它常常被划分为一个或多个Shard,它们使用相同的Config Set。如果Shard数超过一个,它就是分布式索引,SolrCloud让你通过Collection名称引用它,而不需要关心分布式检索时需要使用的和Shard相关参数。 ?Config Set Solr Core提供服务必须的一组配置文件。每个config set有一个名字。最小需要包括solrconfig.xml (SolrConfigXml)和schema.xml (SchemaXml),除此之外,依据这两个文件的配置内容,可能还需要包含其它文件。它存储在Zookeeper中。Config sets可以重新上传或者使用upconfig命令更新,使用Solr的启动参数bootstrap_confdir指

定可以初始化或更新它。 ?Core Core也就是Solr Core,一个Solr中包含一个或者多个Solr Core,每个Solr Core可以独立提供索引和查询功能,每个Solr Core对应一个索引或者Collection的Shard,Solr Core的提出是为了增加管理灵活性和共用资源。在SolrCloud中有个不同点是它使用的配置是在Zookeeper中的,传统的Solr core的配置文件是在磁盘上的配置目录中。 ?Leader 赢得选举的Shard replicas。每个Shard有多个Replicas,这几个Replicas需要选举来确定一个Leader。选举可以发生在任何时间,但是通常他们仅在某个Solr实例发生故障时才会触发。当索引documents时,SolrCloud会传递它们到此Shard对应的leader,leader 再分发它们到全部Shard的replicas。 ?Replica Shard的一个拷贝。每个Replica存在于Solr的一个Core中。一个命名为“test”的collection以numShards=1创建,并且指定replicationFactor设置为2,这会产生2个replicas,也就是对应会有2个Core,每个在不同的机器或者Solr实例。一个会被命名为test_shard1_replica1,另一个命名为test_shard1_replica2。它们中的一个会被选举为Leader。 ?Shard

elasticSearch

ElasticSearch:可扩展的开源弹性搜索解决方案 开源的分布式搜索引擎支持时间时间索引和全文检索。 索引:index 存放数据 类型:type 区分储存的对象 文档:document 储存的主要实体 页面: field 角色关系对照 elasticsearch 跟 MySQL 中定义资料格式的角色关系对照表如下 MySQL elasticsearch database index table type table schema mapping row document field field http://localhost:9200/mishu_index/hunanzhaobiaowang/ _search?q=title:嘉禾县基本烟田土地整理施工 ElasticSearch官网:https://www.doczj.com/doc/0c5172251.html,/ 先上一张elasticsearch的总体框架图:

ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性: 分布式索引、搜索 索引自动分片、负载均衡 自动发现机器、组建集群 支持Restful 风格接口 配置简单等。 下图是ElasticSearch的第三方插件管理工具,通过它可以很清晰的看到它索引分布的情况:哪块分布在那里,占用空间多少都可以看到,并且可以管理索引。

当一台机挂了时,整个系统会对挂机里的内容重新分配到其它机器上,当挂掉的机重新加 入集群时,又会重新把索引分配给它。当然,这些规则都是可以根据参数进行设置的,非 常灵活。ElasticSearch是先把索引的内容保存到内存之中,当内存不够时再把索引持久化 到硬盘中,同时它还有一个队列,是在系统空闲时自动把索引写到硬盘中。 的后端存储方式可以有一下四种: 1. 像普通的 Lucene 索引,存储在本地文件系统中; 2. 存储在分布式文件系统中,如 freeds; 3. 存储在 Hadoop 的 hdfs中; 4. 存储在亚马逊的 S3 云平台中。 它支持插件机制,有丰富的插件。比如和 mongoDB、couchDB 同步的river 插件,分词插件,Hadoop 插件,脚本支持插件等。 下面介绍elasticsearch的几个概念: cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产 生的,主从节点是对于集群内部来说的。es 的一个概念就是去中心化,字面上理解就是无 中心节点,这是对于集群外部来说的,因为从外部来看 es 集群,在逻辑上是个整体,与 任何一个节点的通信和与整个es 集群通信是等价的。在配置文件中可以配置集群的名字,在同一局域网内的机器,配置相同的cluster名字,将会自动组建集群,不需要其它特殊配置。 shards

Elasticsearch权威指南(中文版)

Elasticsearch 权威指南(中文版) 1、入门 Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度 处理大数据成为可能。 它用于全文搜索、结构化搜索、分析以及将这三者混合使用: 维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-you-mean)等搜索建议功能。 英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。 Github使用Elasticsearch检索1300亿行的代码。 但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。Elasticsearch所涉及到的每一项技术都不是创新或者革命性的,全文搜索, 分析系统以及分布式数据库这些早就已经存在了。它的革命性在于将这些独立且有用的技术整合成一个一体化的、实时的应用。它对新用户的门槛很低,当然它也会跟上你技能和需求增长的步伐。 如果你打算看这本书,说明你已经有数据了,但光有数据是不够的,除非你能对这些数据做些什么事情。

很不幸,现在大部分数据库在提取可用知识方面显得异常无能。的确,它们能够通过时间戳或者精确匹配做过滤,但是它们能够进行全文搜索,处理同义词和根据相关性给文档打分吗?它们能根据同一份数据生成分析和聚合的结果吗?最重要的是,它们在没有大量工作进程(线程)的情况下能做到对数据的实时处理吗? 这就是Elasticsearch存在的理由:Elasticsearch鼓励你浏览并利用你的数 据,而不是让它烂在数据库里,因为在数据库里实在太难查询了。Elasticsearch是你新认识的最好的朋友。 1.1、是什么 为了搜索,你懂的 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。 Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。 不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它: ?分布式的实时文件存储,每个字段都被索引并可被搜索 ?分布式的实时分析搜索引擎 ?可以扩展到上百台服务器,处理PB级结构化或非结构化数据

ElasticSearch5.1 基本概念和配置详解

二、几个基本概念 接近实时(NRT) Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是1 秒)。 集群(cluster) 代表一个集群,集群中有多个节点(node),其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。 索引(index)

ElasticSearch将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过ElasticSearch内部使用Lucene将数据写入索引或从索引中检索数据。文档(document) 文档(document)是ElasticSearch中的主要实体。对所有使用ElasticSearch 的案例来说,他们最终都可以归结为对文档的搜索。文档由字段构成。 映射(mapping) 所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。一般由用户自己定义规则。类型(type) 每个文档都有与之对应的类型(type)定义。这允许用户在一个索引中存储多种文档类型,并为不同文档提供类型提供不同的映射。 分片(shards) 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 副本(replicas) 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。 数据恢复(recovery)

ElasticSearch

ElasticSearch ES评估资料 通过开发机登陆hadoop03:9200/_plugin/sql 可以访问 ES调研结果 以下是我们对于ES的调研结果(调研主要是锦明完成的,我主要把各项数据总结一下) 我们已经在开发机上部署了ES以及ES SQL,ES Hadoop插件,大家如果要访问ES SQL的话可以通过开发机登陆 hadoop03:9200/_plugin/sql 1. 1. 使用方式: 目前在我们的环境中ES大致有下面三种使用方式可供先择: a) 调用Estate的restfule API/Java API用于做数据的增删改查。经测试这种方法效率最高 b) 布署ES-SQL插件,提供SQL的方式插入,删除,修改以及查询; c) 布置es-hadoop插件,将es与hive集成; 通过hive SQL进行数据的批量插入和查询 1. 2. 性能评估 测试对象:user_basic_es2,记录数目74228947,字段数70-80

使用方式 操作 API ES-SQL HIVE 批量插入7500万40mins(数据要提前准备好) 不支持90mins 批量更新7500万40mins(数据提前准备好)不支持现有配置Hive语法不支持更新 删除数据1s 1s 现有配置Hive方法不支持更新 单表查询-where过滤 1s 1s 60mins 单表查询-Group By 1s 1s 60mins Hive之所以查询慢是因为hive并没有用到ES的索引,查询的时候只是把数据都读了出来在map端进行过滤以及之后的操作,所以完全没法使用 而ES SQL会把查询翻译程API,然后使用API发起查询下面是几段测试SQL,都在1s返回结果: a) Select count(*) from user_basic_es2 ; b) Select address_city, gender, count(*) from user_basic_es2 group by address_city, gender c) Select count(*) from user_basic_es2 where gender=’male’ and address_city=’上’ (result 17274) d) Select user_id from user_basic_es2 where gender=’male’ (result 61647932) 从上面的结果来看,基本1-2s能返回查询结果 1. 3. 各种使用方式优缺点评估 优势 使用 方式 优势劣势适用场景 API 提供所有的ES功能;最快速需要开发应用来更新及展示数据需求很灵活的情况下 ES-SQL 使用方便;将SQL解析成ES 查询,所以响应快速 不支持数据的插入更新;不能与HIVE中的其他 数据一起使用 用于数据的查询 HIVE 可以同时访问存储在 HDFS/HBASE/ES中的数据 只将ES作为简单的数据存储,并不将SQL解 析成ES查询,所以速度最慢;不能分字段更新 数据,一次只能更新所有字段 用于将hive中的数 据算好以后批量存入 供后续查询 1. 4. ES占用的存储HDFS: 1.3GB ES: 42GB

大数据技术之elasticsearch【下】

大数据技术之Elasticsearch【下】 3.1.6 新建文档(源数据map方式添加json) 1)源代码 @Test public void createIndexByMap() { // 1 文档数据准备 Map json = new HashMap(); json.put("id", "2"); json.put("title", "基于Lucene的搜索服务器"); json.put("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口"); // 2 创建文档 IndexResponse indexResponse = client.prepareIndex("blog", "article", "2").setSource(json).execute().actionGet(); // 3 打印返回的结果 System.out.println("index:" + indexResponse.getIndex()); System.out.println("type:" + indexResponse.getType()); System.out.println("id:" + indexResponse.getId()); System.out.println("version:" + indexResponse.getVersion()); System.out.println("result:" + indexResponse.getResult()); // 4 关闭连接 client.close(); } 2)结果查看 3.1.7 新建文档(源数据es构建器添加json) 1)源代码

ElasticSearch基础知识

Elasticsearch介绍 Elasticsearch是个全文搜索服务器,简称ES,它相当于一个数据库,也有增删改查操作。为什么不直接用数据库呢?因为在全文搜索方面它比数据库更快、更智能。 更快:倒排索引,对文档分词,给每一个词建立索引,标记在那一条记录中有出现 更智能:对数据进行分词,分词之后进行标准化处理,它可以搜索匹配度、大小写、近义词等 Elasticsearch head和kibana两种客户端工具可选,使用Restfull风格的查询语句Elasticsearch和mysql结构对比 Restfull风格的查询语句

ES在wonder 的使用架构 索引index 由具有相同字段的文档列表组成,相当于mysql中的表。?每个索引都有自己的mapping定义,用于定义字段名和类型 ?索引中存储着具有相同结构的文档

节点Node 一个Elasticsearch的运行实例,集群的其中一个构成单元。 正排索引 维护文档id到内容、单词的关联关系,例如 倒排索引 MySQL like查询需要一行一行的查找,ES有了倒排索引就就能知道关键字在第几行出现了。加快了查询效率,标准化处理是搜索更加智能,意思大小写、匹配度、同义词、 维护单词到文档id的关联关系,例如 分片 分片是Elasticsearch在集群周围分发数据的单位。Elasticsearch在重新平衡数据时(例如发

生故障后)移动分片的速度取决于分片的大小和数量以及网络和磁盘性能。 文档Document 文档Document 核心数据类型 用户存储在es中的数据文档,相当于mysql的表中的一行,Json结构形式,由字段组成,常见数据类型如下: ●字符串:text、keyword,text是分词,keyword是不分词的 ●数值型:long、integer、short、byte、double、float、half_float、scaled_float ●布尔:boolean ●日期:date 不分词,必须全匹配 ●二进制:binary ●范围类型:integer_range、float_range、long_range、double_range、date_range

Elasticsearch工具类使用介绍

Elasticsearch工具类使用说明 目录 1. 连接Elasticsearch服务 (2) 2. 创建索引 (2) 3. 删除索引 (2) 4. 获取索引 (2) 5. 插入数据 (2) 6. 批量插入数据 (2) 7. 更新数据 (3) 8. 批量更新数据 (3) 9. 删除数据 (3) 10. 批量删除数据 (3) 11. 根据id查询数据 (3) 12. 根据id批量查询数据 (3) 13. 统计count (4) 14. 分组统计count (4) 15. 根据条件查询一条数据 (4) 16. 根据条件查询一批数据 (4) 17. 根据条件查询一页数据 (5) 18. 分组查询 (5) 19. 滚动查询数据 (6)

//第一种创建索引test impl.getElasticsearchUtil().createIndex("test"); // 第二种创建索引test,指定字段,分片数,副本数 List columns = new ArrayList<>(); Field col = new Field(); col.setName("city"); col.setType(Field.type_keyword); columns.add(col); Field col1 = new Field(); col1.setName("age"); col1.setType(Field.type_integer); columns.add(col1); Field col2 = new Field(); col2.setName("birth"); col2.setType(Field.type_date); col2.setFormat(Field.date_format_simple); columns.add(col2); impl.getElasticsearchUtil().createIndex("test", columns, 5, 1); 3.删除索引 // 删除索引test impl.getElasticsearchUtil().deleteIndex("test"); 4.获取索引 // 获取集群中所有的索引名称 List indices = impl.getAllIndexs(); 5.插入数据 // 插入数据 JSONObject data = new JSONObject(); data.put("id", "1");//id如果不指定,会自动生成uuid data.put("age", 43); data.put("city", "南京"); data.put("birth", "1975-10-12"); impl.addData("test", data, "id"); 6.批量插入数据 // 批量插入数据 List datas = new ArrayList<>(); JSONObject data1 = new JSONObject(); data1.put("id", "1"); data1.put("age", 43); data1.put("city", "南京");

Elasticsearch-权威指南(中文版)

Elasticsearch 权威指南(中文版) 1、入门 Elasticsearch 是一个实时分布式搜索和分析引擎。它让你以前所未有的速度 处理大数据成为可能。 它用于全文搜索、结构化搜索、分析以及将这三者混合使用: 维基百科使用Elasticsearch 提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type) 和搜索纠错(did-you-mean) 等搜索建议功能。 英国卫报使用Elasticsearch 结合用户日志和社交网络数据提供给他们的编辑 以实时的反馈,以便及时了解公众对新发表的文章的回应。 StackOverflow 结合全文搜索与地理位置查询,以及more-like-this 功能 来找到相关的问题和答案。 Github 使用Elasticsearch 检索1300 亿行的代码。 但是Elasticsearch 不仅用于大型企业,它还让像DataDog 以及Klout这样 的创业公司将最初的想法变成可扩展的解决方案。Elasticsearch 可以在你的 笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。Elasticsearch 所涉及到的每一项技术都不是创新或者革命性的,全文搜索, 分析系统以及分布式数据库这些早就已经存在了。它的革命性在于将这些独立 且有用的技术整合成一个一体化的、实时的应用。它对新用户的门槛很低,当然它也会跟上你技能和需求增长的步伐。 如果你打算看这本书,说明你已经有数据了,但光有数据是不够的,除非你能对这些数

Elasticsearch 权威指南(中文版)据做些什么事情。

很不幸,现在大部分数据库在提取可用知识方面显得异常无能。的确,它们能够通过时间戳或者精确匹配做过滤,但是它们能够进行全文搜索,处理同义词和根据相关性给文档打分吗?它们能根据同一份数据生成分析和聚合的结果吗?最重要的是,它们在没有大量工作进程(线程)的情况下能做到对数据的实时处理吗? 这就是Elasticsearch 存在的理由:Elasticsearch 鼓励你浏览并利用你的数 据,而不是让它烂在数据库里,因为在数据库里实在太难查询了。 Elasticsearch 是你新认识的最好的朋友。 1.1、是什么 为了搜索,你懂的 Elasticsearch 是一个基于Apache Lucene(TM) 的开源搜索引擎。无论在开 源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接 集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入 了解检索的相关知识来理解它是如何工作的。 Elasticsearch 也使用Java开发并使用Lucene作为其核心来实现所有索引 和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂 性,从而让全文搜索变得简单。 不过,Elasticsearch 不仅仅是Lucene和全文搜索,我们还能这样去描述它: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

全文搜索引擎 Elasticsearch 入门教程

全文搜索引擎 Elasticsearch 入门教 程 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic )是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow 、Github 都采用它。 Elastic 的底层是开源库 Lucene 。但是,你没法直接用 Lucene ,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 本文从零开始,讲解如何使用 Elastic 搭建自己的全文搜索引擎。每一步都有详细的说明,大家跟着做就能学会。 一、安装 Elastic 需要 Java 8 环境。如果你的机器还没安装 Java ,可以参考这篇文章,注意要保证环境变量JAVA_HOME 正确设置。 安装完 Java ,就可以跟着官方文档安装 Elastic 。直接下载压缩包比较简单。 1 2 $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-

3 5.5.1.zip $ unzip elasticsearch-5.5.1.zip $ cd elasticsearch-5.5.1/ 接着,进入解压后的目录,运行下面的命令,启动 Elastic 。 1 $ ./bin/elasticsearch 如果这时报错“max virtual memory areas vm.max map count [65530] is too low”,要运行下面的命令。 1 $ sudosysctl -w vm.max_map_count=262144 如果一切正常,Elastic 就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口,会得到说明信息。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ curl localhost:9200 { "name" : "atntrTf", "cluster_name" : "elasticsearch", "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA", "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" }

相关主题
文本预览
相关文档 最新文档