当前位置:文档之家› ElasticSearch使用手册

ElasticSearch使用手册

ElasticSearch使用手册
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

Collection的逻辑分片。每个Shard被化成一个或者多个replicas,通过选举确定哪个是Leader。

二、ElasticSearch安装

Cloudera Search作为CDH的一个组件,统一采用Cloudera Manager 进行安装及配置,具体内容参加CDH的安装说明文档,本文以具体配置使用为主。

三、基本应用

3.1. 简单示例

采用SSH或者Telnet远程连接到服务器上,在控制台依次执行下来命令,完成Solr的集合创建以及数据加入处理。

创建solr配置目录(执行后会在当前目录生产oa_solr目录)

#solrctl instancedir --generate oa_solr

基于solr配置,创建Core

#solrctl instancedir --create oa oa_solr

创建集合

#solrctl collection --create article -s 2 -c oa

向集合中加入测试数据

#cd /opt/cloudera/parcels/CDH/share/doc/solr-doc*/example/exampledocs

#java -Durl=http://localhost:8983/solr/article/update -jar post.jar *.xml

在浏览器中输入http://10.68.128.217:8983/solr/进入Solr配置管理界面。

在左侧导航栏中选择Core,点击“Query”菜单,点击“Execute Query”,如出现数据,则完成最基本的查询功能。

3.2. 整合中文分词

Solr默认没有中文分词处理,需要进行添加配置,本示例采用IK Analyer进行中文分词配置。

3.2.1. 下载IK Analyer

IK Analyer最新的程序版本为IK Analyzer 2012FF_hf1.zip,可以从官方网站下进行获取

https://https://www.doczj.com/doc/019992955.html,/archive/p/ik-analyzer/downloads下载。

3.2.2. 复制依赖文件

将IKAnalyzer2012FF_u1.jar拷贝到/opt/cloudera/parcels/CDH/lib/ solr/webapps/solr/WEB-INF/lib目录中。

备注:不要拷贝到文件拷贝到/var/lib/solr/tomcat-deployment/ webapps/solr/WEB-INF/lib,该目录重启后,会自动消失,同时所有solr 的服务器均需要拷贝。

将IKAnalyzer.cfg.xml、stopword.dic 拷贝到3.1.简单示例中创建配置目录oa_solr的conf子目录中。

3.2.3. 修改配置文件

编辑conf/schema.xml配置文件,在types标签内增加

在fields标签内将需要进行中文切除的字段修改为text_cn

3.2.4. 启用配置

因涉及到依赖jar文件的变化,需要在Cloudera Manager中重启Solr服务。同时采用以下命令更新配置,并重建集合。

#solrctl instancedir --update oa oa_solr

#solrctl collection --delete article

#solrctl collection --create article -s 2 -c oa

3.2.5. 中文分词验证

进入solr管理控制台,在左侧导航栏选择“Analysis”,在“Analyse Fieldname / FieldType”中选择“text_cn”,并在Field Value中输入中文,点击“Analyse Values”按钮,如出现多个中文,则表示分词成功。

3.2.6. IK配置自定义词组

在“3.2.2. 复制依赖文件”复制配置文件后,修改IK的配置文件IKAnalyzer.cfg.xml,增加

ext.dic;

并创建一个ext.dic的文本文件(无BOM头的UTF-8格式),以\r\n 作为每一行的结束,同时将ext.dic放到conf目录下。

备注:自定义词库在实际环境中未测试通过,具体原因不明,目前的做法是将IKAnalyzer2012FF_u1.jar中的默认字典配置文件

(org/wltea/analyzer/dic/main2012.dic)解压出来,修改后,重新还原到jar文件中。

3.3. Schema配置

集合(Collection)内所有存储的字段均需要预先在Schema中予以定义声明,Schema对应的配置文件为conf/schema.xml。

fieldType用于定义数据格式类型,字段类型定义包括三种方式

field、copyField、dynamicField。

?Field

Field就是一个字段,定义示例如下:

其中:name为字段名称,type对应fieldType,indexed是否为索引列,stored表示数据是否存储,multiValued表示是否多个值。

备注:solr本身不支持对象关联查询,对于同一个collection不会正常区分,所有的内容均会拉平存储在同一对象中,因此子对象的字段名称需要与父对象进行区分,如果存在一对多的情况,多方的multiValued值必须设置为true。

?copyField

solr提供了字段复制机制,可以提交多个不同字段的内容集中到一个字段。字段复制主要涉及两个概念,source和destination,一个是要复制的字段,另一个是要复制到哪个字段,以下是个例子:

?dynamicField

动态字段(Dynamic fields)允许solr 索引没有在schema 中明确定义的字段。这个在忘记定义一些字段时很有用。动态字段可以让系统更灵活,通用性更强。

以下为CMS中文章Collection的Schema定义片段。

required="true"multiValued="false"/>

3.4. 数据导入配置

数据导入相关说明参见以下两个链接的说明。

https://www.doczj.com/doc/019992955.html,/solr/DataImportHandler

https://https://www.doczj.com/doc/019992955.html,/confluence/display/solr/Uploading+Structured+ Data+Store+Data+with+the+Data+Import+Handler

3.4.1. 复制依赖文件

拷贝dataimport依赖包以及jdbc驱动到/opt/cloudera/parcels/CDH /lib/solr/webapps/solr/WEB-INF/lib中。

#cp /opt/cloudera/parcels/CDH/lib/solr/solr-dataimport*-cdh5.5.2.jar

/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib

#cp db2jcc4.jar /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib 备注:DB2必须是jdbc4的驱动,否则将会报错;因涉及到jar文件的变动,需要重启solr服务。

3.4.2. 启动DIH配置

修改conf/solrconfig.xml文件,增加以下配置:

class="org.apache.solr.handler.dataimport.DataImportHandler">

dih-config.xml

3.4.3. 定义数据初始化文件

新增dih-config.xml文件,文件内容如下:

url="jdbc:db2://10.68.123.102:50000/HBADB"

user="HBYC"

password="123456"

batchSize="100"

autoCommit="false"/> />

query="SELECT

ARTICLE_ID,WEBSITE_ID,CHANNEL_ID,CTTCTG_ID,TITLE,ARTICLE_CONTENT,RELE ASE_DATE,RELEASE_SYS_DATE,IS_CHECK,IS_CONTROL,ARTI_ATTACHE_ID FROM office.T_CMS_ARTI_ARTICLE fetch first 1000 rows only"

deltaQuery="SELECT

ARTICLE_ID,WEBSITE_ID,CHANNEL_ID,CTTCTG_ID,TITLE,ARTICLE_CONTENT,RELE ASE_DATE,RELEASE_SYS_DATE,IS_CHECK,IS_CONTROL,ARTI_ATTACHE_ID FROM office.T_CMS_ARTI_ARTICLE RELEASE_DATE >

'${https://www.doczj.com/doc/019992955.html,st_index_time}' or RELEASE_SYS_DATE >

'${https://www.doczj.com/doc/019992955.html,st_index_time}'"

transformer="ClobTransformer">

query="SELECT ATTACHMENT_ID as "attachId", NAME as "fileName", CREATE_TIME as "fileTime",

'${article.ARTICLE_ID}' as "articleId" FROM

office.T_CMS_CORE_ATTACHMENT where

ARTI_ATTACHE_ID='${article.ARTI_ATTACHE_ID}' and

ARTI_ATTACHE_ID<>'' and ARTI_ATTACHE_ID is not null">

注意transformer="ClobTransformer"和clob="true"的写法。

3.4.4. 启用配置

#solrctl instancedir --update oa oa_solr

3.4.5. 通过界面导入数据

进入Solr管理控制台,在左侧导航栏点击“Dataimport”菜单,点击右侧“Congfiguration”查看配置内容是否一致,如果不一致,点击“Reload”连接,进行配置刷新。

点击“Execute”,启动数据导入,点击“Refresh Status”按钮,查看导入进度情况。

最后的导入结果如下:

导入58万的数据量,耗时14分39秒,每秒导入数据670条。

3.4.6 通过URL导入数据

全部更新

http://10.68.128.217:8983/solr/article/dataimport?command=full-import

增量更新

http://10.68.128.217:8983/solr/article/dataimport?command=delta-import

查看执行状态

http://10.68.128.217:8983/solr/article/dataimport?command=status

3.5. 默认排序处理

在solrconfig.xml中加入

explicit

10

on

title,content

200

edismax

rord(releaseSysDate)

content

title^1.9

bf用函数计算某个字段的权重,bf内字段必须是索引的,bf的函数的使用参考文档:https://www.doczj.com/doc/019992955.html,/solr/FunctionQuery。

pf查询字段,这样在schema不用制定默认字段

qf对默认查询增加权重比值,比如标题是content的1.9倍,值越大权重越大

四、Java调用示例

4.1. 添加依赖

org.apache.solr

solr-solrj

5.2.1

commons-logging

commons-logging

1.2

4.2. 连接服务器

private static final String COLLECTION = "article";

private CloudSolrClient solr = null;

public SolrDemoApp() {

// 通过zooKeeper实现自动负载均衡

String zkHostString = "10.68.128.215:2181,10.68.128.216:2181,10.68.128.217:2181/solr"; solr = new CloudSolrClient(zkHostString);

// 设置默认的集合

solr.setDefaultCollection(COLLECTION);

// 连接服务器

solr.connect();

}

// 执行完成后调用

public void close() throws IOException {

solr.close();

}

4.3. 增加文档

public void add() throws IOException, SolrServerException {

// 更新索引

SolrInputDocument document = new SolrInputDocument();

document.addField("id", TEST_DOC_ID);

document.addField("title", "中华人民共和国");

document.addField("content", "湖北烟草");

document.addField("releaseDate", new Date());

solr.add(COLLECTION, document);

https://www.doczj.com/doc/019992955.html,mit();

SolrQuery query = new SolrQuery();

query.setQuery("id:" + TEST_DOC_ID);

QueryResponse result = solr.query(COLLECTION, query);

output(result);

}

4.4. 删除文档

public void delete() throws IOException, SolrServerException {

// 删除索引

solr.deleteById(COLLECTION, TEST_DOC_ID);

https://www.doczj.com/doc/019992955.html,mit();

SolrQuery query = new SolrQuery();

query.setQuery(" id:123lmz");

QueryResponse result = solr.query(COLLECTION, query);

if (result.getResults().size() == 0) {

System.out.print("删除成功");

} else {

System.out.print("删除失败");

}

}

4.5. 高亮查询

public void query() throws IOException, SolrServerException {

SolrQuery query = new SolrQuery();

query.setQuery(" websiteId:8ac4932e2a370de2012a372b98ba0001 && ( content:赵全意 || title:赵全意 )");

setQueryParams(query);

QueryResponse result = solr.query(COLLECTION, query);

output(result);

}

private void setQueryParams(SolrQuery query) {

query.setFields("id", "title", "content", "releaseDate");

query.setRows(20).setStart(0);

query.setHighlight(true).setHighlightFragsize(200)

.setHighlightSimplePre("").setHighlightSimplePost("")

.set("hl.fl", "title,content");

}

private void output(QueryResponse result) {

SolrDocumentList list = result.getResults();

Map>> hlMap = result.getHighlighting();

for (SolrDocument doc : list) {

output(doc, hlMap);

}

}

private void output(SolrDocument doc, Map>> hlMap) {

String id = (String) doc.getFieldValue("id");

String title = (String) doc.getFieldValue("title");

String content = (String) doc.getFieldValue("content");

if (hlMap != null) {

Map> docHl = hlMap.get(id);

if (docHl != null) {

title = getHlValue(docHl, "title");

content = getHlValue(docHl, "content");

}

}

System.out.print("id:" + id);

System.out.print("\t title:" + title);

System.out.print("\t content:" + content);

System.out.println("\t date:" + DateUtils.formatDate((Date) doc.getFieldValue("releaseDate"), "yyyy-MM-dd HH:mm"));

}

private String getHlValue(Map> docHl, String field) {

return docHl.containsKey(field) ? docHl.get(field).get(0) : null;

}

4.6. Facet查询

// https://www.doczj.com/doc/019992955.html,/solr/SimpleFacetParameters

public void facetQuery() throws IOException, SolrServerException {

SolrQuery query = new SolrQuery();

query.setQuery("websiteId:8ac4932e2a370de2012a372b98ba0001");

// 启动facet

query.setFacet(true);

// 以栏目为统计

query.set("facet.field", "channelId");

// 按照时间统计

query.set("facet.date", "releaseDate");

query.set("facet.date.start", "2009-1-1T0:0:0Z");

query.set("facet.date.end", "2016-1-1T0:0:0Z");

query.set("facet.date.gap", "+1YEAR");

query.set("facet.date.other", "all");

// 不返回文档(facet下的内容)

query.setRows(0);

QueryResponse result = solr.query(COLLECTION, query);

for (FacetField facetField : result.getFacetDates()) {

outputFacet(facetField, "日期");

}

for (FacetField facetField : result.getFacetFields()) {

outputFacet(facetField, "栏目");

}

}

private void outputFacet(FacetField facetField, String prefix) {

System.out.println(prefix + "共找到[" + facetField.getName() + "]" + facetField.getValueCount() + "个");

if (facetField != null) {

List countList = facetField.getValues();

if (countList != null) {

for (FacetField.Count count : countList) {

System.out.println(prefix + "[" + count.getName() + "]找到" + count.getCount() + "篇文章");

}

}

}

}

4.7. 完整示例

详细见文档中的内容。

So l rD em o A p p.j ava

五、数据导入

六、附录

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/019992955.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/019992955.html,: elasticsearch 配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。 https://www.doczj.com/doc/019992955.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/019992955.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" }

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