大数据培训module16solr二次开发篇_第1页
大数据培训module16solr二次开发篇_第2页
大数据培训module16solr二次开发篇_第3页
大数据培训module16solr二次开发篇_第4页
大数据培训module16solr二次开发篇_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

修订记录课程编码适用产品产品版本课程版本ISSUEModule05Solr应用开发FusionInsightFusionInsightHDV100R002C60V1.0开发/优化者时间审核人开发类型(新开发/优化)袁静2016.4

第一版开发本页不打印FusionInsight

Solr应用开发目标学完本课程后,您将能够:了解Solr应用开发适用场景熟悉Solr应用开发流程熟悉并使用Solr常用API理解Collection设计基本原则应用开发实践目录Solr应用场景Solr应用开发流程Collection设计应用开发案例分析常用接口示例应用开发实践Solr的定义Solr是一个高性能,基于Lucene的全文检索服务,也可以作为NoSQL数据库使用。Solr对Lucene进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对查询性能进行了优化,还提供了一个完善的功能管理界面。SolrCloud是从Solr4.0版本开始开发出的具有开创意义的分布式索引和搜索方案,基于Solr和Zookeeper进行开发的。Solr的常用应用场景待检索数据类型复杂:

如需要查询的数据有结构化数据(关系型数据库等)、半结构化数据(网页、XML等)、非结构化数据(日志、图片、图像等)等,而Solr则可以对以上数据类型进行清洗、分词、建立倒排索引等一系列操作(建立索引),然后提供全文检索(查询)的能力。检索条件多样化(如涉及字段太多),常规查询无法满足:全文检索(查询)可以包括简单的词和短语,或者词或短语的多种形式。读取远多于写入数据。目录Solr应用场景Solr应用开发流程Collection设计应用开发案例分析常用接口示例应用开发实践Solr应用开发流程制定业务目标准备开发环境下载并导入样例工程设计Collection根据场景开发工程编译并运行程序查看结果与调试程序Solr应用开发流程制定业务目标数据量?实时写入性能要求?查询性能要求?查询场景?影响confsetschema设计Solr应用开发流程准备开发环境准备项说明操作系统Windows系统,推荐Windows7以上版本。安装JDK开发环境的基本配置。版本要求:1.7或者1.8。安装和配置Eclipse用于开发Solr应用程序的工具。网络确保客户端与Solr服务主机在网络上互通。主机名映射hosts文件中添加Solr服务器节点的IP和HostName的映射关系。客户端与集群时间差确认客户端机器的时间与FusionInsight集群的时间差需要小于5分钟Solr应用开发流程下载并导入Solr样例工程下载并解压Solr客户端压缩包导入样例工程到Eclipse开发环境配置Solr客户端样例工程“solr-example\conf\perties”如果集群为安全版本:perties中SOLR_KBS_ENABLED设置为true新建Solr用户,并下载该用户的认证凭据文件到Solr客户端样例工程如果集群为非安全版本:perties中SOLR_KBS_ENABLED设置为falseSolr应用开发流程一个例子初始化并获取配置Propertiesproperties=newProperties();StringproPath=System.getProperty("user.dir")+File.separator+"conf"+File.separator+"perties";...SOLR_KBS_ENABLED=properties.getProperty("SOLR_KBS_ENABLED");...安全认证Stringpath=System.getProperty("user.dir")+File.separator+"conf"+File.separator;path=path.replace("\\","\\\\");try{LoginUtil.setJaasFile(principal,path+"user.keytab");LoginUtil.setKrb5Config(path+"krb5.conf");LoginUtil.setZookeeperServerPrincipal(ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL);}catch(IOExceptione){LOG.error("Failedtosetsecurityconf",e);throw

newSolrException("Failedtosetsecurityconf");}一个例子获取CloudSolrClinetModifiableSolrParamsparams=newModifiableSolrParams();params.set(HttpClientUtil.PROP_MAX_CONNECTIONS,1000);params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST,500);HttpClienthttpClient=HttpClientUtil.createClient(params);if(SOLR_KBS_ENABLED.equals("true")){try{httpClient=newInsecureHttpClient(httpClient,params);

}catch(Exceptione){

LOG.error("FailedtocreateInsecureHttpClient",e);throw

newSolrException("FailedtocreateInsecureHttpClient");}}LBHttpSolrClientlbClient=newLBHttpSolrClient(httpClient);CloudSolrClientcloudSolrClient=newCloudSolrClient(zkHost,lbClient);cloudSolrClient.setZkClientTimeout(zkClientTimeout);cloudSolrClient.setZkConnectTimeout(zkConnectTimeout);cloudSolrClient.connect();调用SolrjAPICollectionAdminResponseresponse=cess(cloudSolrClient);...cloudSolrClient.add(documents);...QueryResponseresponse=cloudSolrClient.query(query);Solr应用开发流程设计Collection根据业务数据的关系设计schema.xml根据写入和查询场景设计uniqueKey字段根据写入和查询性能要求设计solrconfig.xml根据业务数据规模和Solr集群规模确定shard数目根据可靠性要求设定shard副本数Solr应用开发流程根据场景开发工程梳理业务场景流程设计各模块接口如果使用的是安全集群,需要进行安全认证熟悉Solr提供的相应API调用业务需要的API实现各功能Solr应用开发流程编译并运行程序在开发环境Eclipse中,右击TestSample.java,单击“Runas>JavaApplication”运行对应的应用程序工程Solr应用开发流程查看结果与调试程序在Eclipse的Console窗口可查看SolrAPI返回结果是否符合预期也可通过登陆FusionInsightManager,服务>Solr>SolrWebUI,进入SolrServerAdminUI页面查看。(如Collection是否创建成功、数据是否已写入)目录Solr应用场景Solr应用开发流程Collection设计应用开发案例分析常用接口示例应用开发实践Solr数据架构主要概念术语描述Collection在SolrCloud集群中逻辑意义上的完整的索引,对逻辑数据的逻辑存储。它可以被划分为一个或者多个Shard,它们使用相同的ConfigSet。Document存储在SolrCloud集群中的主要实体,是索引和查询的基本单元,可以包含一个或多个字段。文档必须包含uniqueKey字段。Schema用于定义索引数据的结构,主要包含三部分:uniqueKey、Field、FieldType。uniqueKey用来标识文档唯一性的字段,更新、删除操作时会用到。FieldDocument的主要构成单元,是更具体的信息描述,包含名称和值两部分。FieldType用来定义字段的类型,定义如何去处理该字段的数据,以及这个字段在查询的时如何处理。Collection设计业务数据和需求特点数据量?实时写入性能要求?查询性能要求?查询场景?影响confsetschema设计Collection设计索引存储在HDFS还是本地磁盘?实时单节点写入速度<=5k/s时,索引存储在HDFS上实时单节点写入速度在5k/s~10k/s时,索引存储本地磁盘上shard数目:SolrServer实例个数副本数:基于可靠性考虑,副本数设置为>=2Collection设计—solrconfig.xml该文件定义Solr的索引、查询的处理配置和组件信息配置。directoryFactory配置定义索引存储位置:存储到HDFS:<directoryFactoryname="DirectoryFactory"class="org.apache.solr.core.HdfsDirectoryFactory">存储本地磁盘:<directoryFactoryname=“DirectoryFactory”class="org.apache.solr.core.NIOFSDirectoryFactory"/>Schema设计-Field定义固定字段属性:name:字段名type:字段类型indexed:是否被用来建立索引(关系到搜索和排序)stored:是否存储原值;设置为true,则查询时可返回原值mutiValued:该字段在文档中是否包含多个值omitNorms:是否忽略标准化,可节省内存requied:增加一个documente时,该字段是否必须有值docValues:是否面向列存储,一般uniqueKey字段设置为trueSchema设计-Field定义全文字段的几个属性:termVectors:设置为true时,会存储termvector,用于加速MoreLikeThis、Highlighting特性,有存储方面的开销termPositions:是否存储termvector的地址信息termOffsets:是否存储termvector的偏移量Schema设计-Field定义dynamicField动态的字段设置,用于后期自定义字段,“*”号通配符格式:copyField将多个字段集中到一个字段。当copyField的dest字段如果有多个source,则该dest字段在定义时需multiValued属性设置为true格式:<dynamicFieldname="*_i"

type="int"

indexed="true"

stored="true"/><copyFieldsource="cat"

dest="text"

maxChars="30000"/>

Schema设计-FieldType普通FieldType属性:name:字段类型名class:字段类型实现类positionIncrementGap:针对multiValued字段可指定一个距离,优化短语查询正确性precisionStep:一般数值类型字段需要设置该值,以空间为代价换取rangesearch时更快的速度Schema设计-FieldType文本FieldType中analyzer包括tokenizer和filter两部分tokenizer用于对文本分词filter用于对分词的结果进行筛选过滤analyzer可通过以下两者方式进行定义

使用org.apache.lucene.analysis.Analyzer的子类进行定义指定一个TokenizerFactory

,后面跟TokenFilterFactories,按照所列的顺序进行处理可通过type属性来指定是索引还是查询阶段使用该分析器Schema示例目录Solr应用场景Solr应用开发流程Collection设计应用开发案例分析常用接口示例应用开发实践应用开发案例分析业务目标:结构化构数据,数据总体规模为PB级支持全文检索,查询秒级响应实时录入,写索引性能达2MB/s以上业务方案数据存储在HBase中,对查询字段在Solr中建立索引涉及RowKey查询,通过HBase客户端查询;非RowKey字段查询通过Solr查询应用开发案例分析Collectionschema设计:uniqueKey字段设置成RowKey字段非uniqueKey的索引字段stored属性设置为false,不在Solr中保留原始值为支持小语种及字母数字类组合查询,文本字段选择ngram分析器,mingram设置为2,maxgram同样设置为2Collectionsolrconfig.xml设计:由于对查询性能和索引性能要求比较高,选择索引存储在本地应用开发案例分析数据录入过程Kafka消息队列Solr索引应用HBaseHMasterRegionServerSolrSolrServer1SolrServerN...pulldatawritewriteHBasePutSolrAdd应用开发案例分析查询过程HBaseHMasterRegionServerSolrSolrServer1SolrServerN...1.字段查询Solr查询应用SolrQueryHBaseGet2.返回符合条件的RowKey3.根据RowKey查询4.返回数据集目录Solr应用场景Solr应用开发流程Collection设计应用开发案例分析常用接口示例应用开发实践常用接口示例创建CloudSolrClientHttpClient内带有连接池,可传入参数控制并发量安全版本下,需传入经由InsecureHttpclient封装过的HttpClient为减少网络I/O,提高索引速度,在索引时可使用BinaryRequestWriterModifiableSolrParamsparams=newModifiableSolrParams();params.set(HttpClientUtil.PROP_MAX_CONNECTIONS,1000);params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST,500);HttpClienthttpClient=HttpClientUtil.createClient(params);if(SOLR_KBS_ENABLED.equals("true")){httpClient=newInsecureHttpClient(httpClient,params);}LBHttpSolrClientlbClient=newLBHttpSolrClient(httpClient);//usingBinaryRequestWriter,itcanreduceindexingI/O.lbClient.setRequestWriter(newBinaryRequestWriter());CloudSolrClientcloudSolrClient=newCloudSolrClient(zkHost,lbClient);cloudSolrClient.setZkClientTimeout(zkClientTimeout);cloudSolrClient.setZkConnectTimeout(zkConnectTimeout);cloudSolrClient.connect();常用接口示例创建CollectionnumOfShards为collection中shard数目conSetName为创建collection指定的配置文件;replicationFactor为副本数;maxShardsPerNode为每个节点最大shard数;createNodeSet指定了创建collection的所在节点CollectionAdminResponsersp=new

CollectionAdminRequest.Create().setCollectionName(collectionName).setNumShards(numOfShards).setConfigName(confSetName).setReplicationFactor(replicationFactor).setMaxShardsPerNode(maxShardsPerNode).process(cloudSolrClient);常用接口示例索引构造SolrInputDocument对象,一个Doc对象对应一条记录

SolrInputDocument必须添加uniqueKey字段文档添加字段接口:addField(Stringname,Objectvalue)UpdateRequest中添加一个Doc对象:add(finalSolrInputDocumentdoc,Booleanoverwrite)UpdateRequestupdateRequest=newUpdateRequest();Set<Map.Entry<String,String>>entrySet=null;for(Map<String,String>keyValMap:keyValList){/*bulksubmitonceevery10,000docs,itcanimprove*indexingperformance.method"getDocuments"in*UpdateRequestisnotmended,becauseitis*returnacopyofthedocs*/if(updateRequest.getDocumentsMap().size()>=10000){cloudSolrClient.request(updateRequest,collName);updateRequest.clear();}entrySet=keyValMap.entrySet();SolrInputDocumentdoc=newSolrInputDocument();for(Map.Entry<String,String>entry:entrySet){doc.addField(entry.getKey(),entry.getValue());}updateRequest.add(doc,false);}if(updateRequest.getDocumentsMap().size()>0){cloudSolrClient.request(updateRequest,collName);}常用接口示例查询setQuery(queryStr)为设置主查询示例:”store:localANDcontent_type:xml”,查询store值为local,同时字段content_type值为xml的文档setFields(returnFields),设置查询的返回字段,多个字段以逗号分隔示例:”id,name,price”setFilterQueries(filterQuery),设置过滤查询示例:”mod_date:[20160401TO20160430”,过滤修改日期为2016年4月份的文档SolrQuerysolrQuery=newSolrQuery().setStart(start).setRows(rows).setFields(returnFileds).setQuery(queryStr).setFilterQueries(filterQuery);solrQuery.set("shards.tolerant",true);solrQuery.set("collection",collection);QueryResponseresponse=cloudSolrClient.query(collection,solrQuery);SolrDocumentListdocs=response.getResults();LOG.info("Querycosttime:{}ms",response.getQTime());LOG.info("Totaldocnumfound:{}",docs.getNumFound());

for(SolrDocumentdoc:docs){LOG.info("docdetail:"+doc.getFieldValueMap());}常用接口示例使用游标进行深度翻页查询条件里面必须有cursorMark参数,而且必须不能有start参数

查询的条件里必须按照主键排序(升序或降序)游标一旦读取了,就不能再返回上一次位置SolrQuerysolrQuery=newSolrQuery().setQuery(queryStr).setFilterQueries(filterQuery).setRows(rows).setSort(SortClause.asc("id")).setFields(returnFileds);solrQuery.set("shards.tolerant",true);solrQuery.set("collection",collection);boolean

done=false;QueryResponseresponse=null;StringcursorMark=CursorMarkParams.CURSOR_MARK_START;StringnextCursorMark=null;while(!done){solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM,cursorMark);esponse=solrClient.query(solrQuery);nextCursorMark=response.getNextCursorMark();

SolrDocumentListsolrDocumentList=response.getResults();for(SolrDocumentdoc:solrDocumentList){Collection<String>fieldNames=doc.getFieldNames();for(StringfieldName:fieldNames){LOG.info("field:{},value:{}",fieldName,

doc.get(fieldName));}

}if(cursorMark.equals(nextCursorMark)){

done=true;

}cursorMark=nextCursorMark;}常用接口示例删除文档通过uniqueKey字段,删除单个docdeleteById(Stringid)通过uniqueKey字段列表,删除多个docsdeleteById(List<String>ids)删除查询所得的docdeleteByQuery(Stringcollection,Stringquery)

cloudSolrClient.deleteById(id);cloudSolrClient.deleteById(ids);

cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论