具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置

SOLR是最流行且高度可扩展的搜索引擎之一,它基于分布式索引技术运行。 Solr索引几乎可以基于任何类型的数据源(CSV数据或XML数据或从RDBMS数据库或标准文件系统中提取的数据)构建。

对于以RDBMS数据库作为后端构建的任何Web应用程序,如果需要在具有数百万行的表上执行搜索,或者需要执行连接多个表的查询,则可能需要花费大量时间才能完成得到回应。 这种后端服务使网站速度极慢。 在这些情况下,SOLR索引编制可能是有用的解决方案。 SOLR可以以反向索引文档的形式存储数据,该文档包含多个字段,每个字段都有一个名称和值。 SOLR的单个实例通常对于中小型数据库就足够了。 如果大型数据库需要在数十亿行上执行查询,则需要一种分布式索引解决方案,其中索引需要分布在多个分片和群集中。 SOLR云就是为此目的而设计的。 但是,管理SOLR云的节点,分片和副本是一项艰巨的任务,无法手动完成。 与外部Zookeeper集群配对可以通过将查询路由到正确的Solr实例来帮助进行SOLR云管理,以及诸如负载平衡和容错之类的其他好处。

但是,使用外部Zookeeper集成建立SOLR云集群非常复杂,对于开发人员而言似乎是一项艰巨的任务。 在本文中,我们将通过简单的步骤以及必要的代码片段和屏幕快照,讨论使用Zookeeper集群进行Solr云设置和实现。 我们将创建多个SOLR碎片,并通过zookeeper对其进行操作。 后来,通过使用SOLRJ API的spring boot micro服务对设置进行了测试。 SOLRJ是一个API,可帮助Java应用程序与SOLR通信并执行查询。 在下面显示的示例中,我已将Java 8用于JDK和Eclipse作为IDE。

1. Zookeeper设置

以下是设置Zookeeper集成的分步说明:

    • 从URL https://zookeeper.apache.org/releases.html下载最新的Zookeeper
SOLR云-Zookeeper配置

Zookeeper配置

    • 在每个conf文件中,将dataDir位置更新为
server.1=YourServerName:2888:3888
server.2= YourServerName:2889:3889
server.3= YourServerName:2890:3890
  • 在上面的conf文件的dataDir属性中提到的相应位置创建3个文件夹。 ( /opt/user_projects/poc/tmp/1 , /opt/user_projects/poc/tmp/2, /opt/user_projects/poc/tmp/3 )。
  • 在创建的每个文件夹中,制作一个新文件并将其命名为“ myid”,然后根据文件夹名称输入序列号(1或2或3)。
  • 这样就完成了Zookeeper配置。

2. SOLR Cloud设置

现在让我们开始Solr云配置。

  • 从URL http://lucene.apache.org/solr/downloads.html下载最新的Solr。
  • 导航到solr安装文件夹下的服务器目录,并在其中创建4个solr文件夹。 在我的情况下,它是/opt/user_projects/poc/solrpoc/solr-7.4.0/server': solr, solr2, solr3, solr4如下图所示。
SOLR云-Solr Config

Solr配置

  • 上面创建的每个solr文件夹都应具有solr.xml,并且必须在该文件中分配端口,如下所示。
    ${jetty.port:8993}
  • 另外,您应该在同一文件夹中有一个configsets。 如果要使用数据库,则应具有data_driven_schema_configs。
  • 修改端口后。 Solr设置已经准备就绪。

3.启动Zookeeper

  • 在启动Zookeeper之前,请确保已设置JAVA_HOME。
  • 为Zookeeper准备启动和停止脚本,然后将它们放在/opt/user_projects/poc/solrpoc/zookeeper-3.4.12/startZookeeper.shstopZookeeper.sh ,如下所示。

SOLR启动脚本

#!/bin/sh
echo "-----------------------------------"
echo "Starting all Solr Instances"source /opt/sun_jdk/jdkversion/jdkversion.confbin/solr start -Duser.timezone="America/Los_Angeles" -c -s server/solr -p 8993 -z yourServer:8997,yourServer:8998,yourServer:8999 -nopromptbin/solr start -Duser.timezone="America/Los_Angeles" -c -s server/solr2 -p 8994 -z yourServer:8997,yourServer:8998,yourServer:8999 -nopromptbin/solr start -Duser.timezone="America/Los_Angeles" -c -s server/solr3 -p 8995 -z yourServer:8997,yourServer:8998,yourServer:8999 -nopromptbin/solr start -Duser.timezone="America/Los_Angeles" -c -s server/solr4 -p 8996 -z yourServer:8997,yourServer:8998,yourServer:8999 -nopromptecho ""
echo "Started all Solr Instances"
echo "---------------------------------"
  • 为Solr准备启动和停止脚本,并将它们放在/opt/user_projects/poc/solrpoc/solr-7.4.0/startSolr.sh
    执行此脚本时,solr开始在指定的端口上运行。
SOLR云-Solr控制台

Solr控制台

4.设置收藏

    • SOLR运行之后,确保将与数据库相关的jar复制到dist并在solrconfig.xml提到该依赖项。
SOLR云-Solr系列

Solr系列

  • 执行完上述创建命令后,您可以转到Solr Admin UI并查看如下所示的集合。
SOLR云-Solr控制台

Solr控制台

  • 创建集合后,我们可以如下所示运行Dataimport。 单击执行。
SOLR云-数据导入

Solr数据导入

这样, SOLR cloud设置就完成了。

5.使用SOLRJ的SPRING BOOT客户端

现在,我们将讨论如何在基于Spring Boot的微服务中测试SOLR集群并使用SOLRJ API查询数据。 我提供了github链接,该链接提供了整个项目代码。

  • 使用以下结构创建一个新的spring boot项目。
SOLR云-项目结构

项目结构

    • 配置gradle依赖项以包括S​​OLRJ库。

SOLRJ util连接到Zookeeper

@Service
public class SolrUtil {CloudSolrClient solrClient;@SuppressWarnings("deprecation")public CloudSolrClient createConnection(){//You need to replace SERVERNAME with the server on which the zookeeper is runningString zkHostString = "SERVERNAME:8997,SERVERNAME:8998,SERVERNAME:8999"; //- DEVif(solrClient == null){solrClient = new CloudSolrClient.Builder().withZkHost(zkHostString).build();}return solrClient;}public SolrDocumentList getSolrResponse(SolrQuery solrQuery, String collection, CloudSolrClient solrClient) {QueryResponse response = null;SolrDocumentList list = null;try {QueryRequest req = new QueryRequest(solrQuery);solrClient.setDefaultCollection(collection);response = req.process(solrClient);list = response.getResults();} catch (Exception e) {e.printStackTrace();//handle errors in this block}return list;}
}
  • 现在创建一个SolrSearchService,它可以调用查询,更新文档或在SOLR中删除,如下所示。

SOLRJ服务到CRUD Solr文档

@Service
public class SolrSearchService {@AutowiredSolrUtil solrUtil;private static final String collection = "UserSearchCloud";public ResponseVO search(SearchRequestVO requestVO) {CloudSolrClient solrClient = solrUtil.createConnection();String query = requestVO.getQuery();SolrQuery solrQuery = new SolrQuery();solrQuery.setQuery(query);solrQuery.setRows(50);solrQuery.set("collection", collection);solrQuery.set("wt", "json");SolrDocumentList documentList = solrUtil.getSolrResponse(solrQuery, collection, solrClient);ResponseVO responseVO = new ResponseVO();if(documentList != null && documentList.size() >0){responseVO.setDocumentList(documentList);responseVO.setMessage("Success");}else{responseVO.setMessage("Failure");responseVO.setErrorMessage("Records Not Found");}return responseVO;}public ResponseVO update(UpdateRequestVO requestVO) {CloudSolrClient solrClient = solrUtil.createConnection();UpdateResponse response = new UpdateResponse();SolrDocument sdoc1 = null;String id = requestVO.getId();solrClient.setDefaultCollection(collection);SolrInputDocument sdoc = new SolrInputDocument();try {sdoc1 = solrClient.getById(id);} catch (SolrServerException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}if(sdoc1 != null){sdoc.setField("FIRST_NAME",requestVO.getFirstName() != null ? requestVO.getFirstName() : sdoc1.get("FIRST_NAME"));sdoc.setField("WORK_EMAIL",requestVO.getWorkEmail() != null ? requestVO.getWorkEmail() : sdoc1.get("WORK_EMAIL"));sdoc.setField("LAST_NAME",requestVO.getLastName() != null ? requestVO.getLastName() : sdoc1.get("LAST_NAME"));sdoc.setField("ADDRESS1",requestVO.getAddress1() != null ? requestVO.getAddress1() : sdoc1.get("ADDRESS1"));sdoc.setField("ADDRESS2",requestVO.getAddress2() != null ? requestVO.getAddress2() : sdoc1.get("ADDRESS2"));sdoc.setField("PHONE1",requestVO.getPhone1() != null ? requestVO.getPhone1() : sdoc1.get("PHONE1"));sdoc.setField("JOB_TITLE",requestVO.getJobTitle() != null ? requestVO.getJobTitle() : sdoc1.get("JOB_TITLE"));sdoc.setField("COMPANY_NAME",requestVO.getCompanyName() != null ? requestVO.getCompanyName() : sdoc1.get("COMPANY_NAME") );sdoc.setField("CITY",requestVO.getCity() != null ? requestVO.getCity() : sdoc1.get("CITY"));sdoc.setField("PHONE2",requestVO.getPhone2() != null ? requestVO.getPhone2() : sdoc1.get("PHONE2"));sdoc.setField("USER_NAME",requestVO.getUserName() != null ? requestVO.getUserName() : sdoc1.get("USER_NAME"));sdoc.setField("id",sdoc1.get("id"));sdoc.setField("_version_","0");try {solrClient.add(sdoc);response = solrClient.commit();} catch (SolrServerException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}ResponseVO responseVO = new ResponseVO();if(response != null && response.getResponse() != null){responseVO.setMessage("Document Updated");}else{responseVO.setErrorMessage("Document Not Found");}return responseVO;}public ResponseVO delete(DeleteRequestVO requestVO) {CloudSolrClient solrClient = solrUtil.createConnection();UpdateResponse response = new UpdateResponse();try {solrClient.setDefaultCollection(collection);response = solrClient.deleteById(requestVO.getId());} catch (SolrServerException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}ResponseVO responseVO = new ResponseVO();if(response != null){responseVO.setMessage("Document Deleted");}return responseVO;}}
  • 最后,您可以在启动Spring Boot服务之后从任何其他客户端测试服务。
SOLR云-Rest Client测试

休息客户测试

这样就完成了整个端到端测试。

6.下载源代码

这是一个使用Zookeeper集成配置SOLR云并通过基于Spring boot的SOLRJ项目访问它的示例。

下载
您可以在这里下载该项目的完整源代码: SOLRJ-ZOOKEEPER-INTEGRATION

翻译自: https://www.javacodegeeks.com/2018/08/solr-cloud-7-4-cluster-configuration-external-zookeeper-ensemble-using-solrj-api-access-data.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】国家开放大学2021春3990产品管理题目

试卷代号:3990 2021年春季学期期末统一考试 产品管理 试题 2021年7月 一、单项选择题(在备选答案中,有一个正确答案,请将正确答案的字母填入括号内。每小题2分,共20分) 1.在生产销售方面,只要产…

【渝粤题库】广东开放大学 大学英语1 形成性考核

选择题 题目: 题干 I’ll try and find ____ the name of the person who saved my life yesterday. 题目:They()have a share. 题目:()child enjoys Christmas. 题目:My pen is lo…

随机过程及其稳态stability

1. 为什么要研究随机过程? 人类认识世界的历史,就是一认识和描绘各种运动的历史,从宏观的天体运动到分子的运动,到人心理的运动-我们通称为变化,就是一个东西随时间的改变。 人们最成功的描绘运动的模型是牛顿的天体…

【渝粤题库】广东开放大学 税务会计技术 形成性考核

选择题 题目: 税收法律关系中的权利客体是指( )。 选择一项: 题目: 在税负能够转嫁的条件下,纳税人并不一定是( )。 选择一项: 题目: 税收采取的是&#xf…

【渝粤题库】广东开放大学 人力资源管理(本科) 形成性考核

选择题 题目:巴甫洛夫通过教会狗听到铃声后做出分泌唾液反应的研究得出的理论 题目:当职位空缺有许多种,而且在某一特定地区内又有足够的求职者的情况下,应该使用以下哪种招募式 题目:传统培训培养员工完成本职工作所需…

求离散马尔科夫链的平稳分布+按照一定概率分布生成想要的样本

1. 求离散马尔科夫链的平稳分布的两种解法 假设离散马尔科夫链的转移矩阵为P PP,平稳分布为π \piπ,则平稳分布满足: PππP \pi \piPππ 1.1 迭代法 求平稳分布的一种简单方法是迭代法,即随机初始化初始分布π 0 \pi_0π 0 …

使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述

如今,人们需要具有高用户体验的高响应性,交互式应用程序,这通常意味着处理异步性,尤其是当这些应用程序涉及高负载,实时数据和多用户时。 由于Java是一种固有的支持命令式编程风格的面向对象语言,因此异步…

【渝粤题库】广东开放大学 商务办公软件应用与实践 形成性考核

选择题 题目:要复制字符格式而不复制字符,需用()按钮。 题目:3、在Excel 2010的"开始”选项卡的"剪贴板”组中,不包含的按钮是()。 题目:4、启动Excel 2010后,…

【渝粤题库】广东开放大学 市场营销 形成性考核

选择题 题目: 以"顾客需要什么,我们就生产供应什么”作为其座右铭的企业是()企业。 题目: 市场营销学作为一门独立的经营管理学科诞生于20世纪初的()。 题目: 市场营销学&quo…

MCMC 和 Gibbs采样

0. MCMC 从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC)。 Monte Carlo (蒙特卡罗&#x…

【渝粤题库】广东开放大学 招投标与合同管理 形成性考核 (2)

选择题 题目:某工程项目在估算时算得成本是1000万元人民币,概算时算得成本是950万元人民币,预算时算得成本是900万元人民币,投标时某承包商根据自己企业定额算得成本是800万元人民币。根据《招标投标法》规定“投标人不得以低于成…

matlab 按一定概率取数组中的值

有一个数组[1,2,3,4] ,有一个变量A要从这个数组中取值。A取1,2,3,4的概率分别为0.7,0.15,0.1,0.05。我如何按照这样的概率,随机生成100个A 思路是:你先产生100个随机数,…

【渝粤题库】广东开放大学 标准化专题讲座 形成性考核

​👉关注我,看答案👈 选择题 题目:制定产品标准的关键是______。 题目:企业标准化战略三步曲中非常关键,关系到企业经营的成败的战略是____。 题目:企业标准采取什么形式、规定什么内容,以及标准制定的时机…

【渝粤题库】广东开放大学 电子商务安全与支付 形成性考核

选择题 题目: 具体来讲,生产企业的物流活动包括 选择一项或多项: 题目:支付系统参与者中,( )的要求是:金额大,时间紧 题目:36 、发起人是支付系统中支付业务…

使用Java流和In-JVM-Memory的超低延迟查询

自然界的基本规则(例如光速和通用信息论)对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制。 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级。 例如,如果应用程序服务器和数据库服务器相距100 m&#…

matlab写出二维数组

%用matlab将二维数组写入txt文件 %比方说 矩阵A 为 A[1 2 3;4 5 6]; %那么程序 为 fidfopen(‘A1.txt’,‘w’); [b1 b2]size(A); for i1:b1 for j1:b2 fprintf(fid,’%10d’,A(i,j)); end fprintf(fid,’\n’); end fclose(fid); https://blog.csdn.net/susu_love/article…

【渝粤题库】广东开放大学 英语语法与基础写作 形成性考核 (2)

选择题 题目:If _______ want to stay in good shape, you should do more exercise. 题目:At last he got home, ________ and . 题目: must work hard so that they can achieve success. 题目:The weather in Guangzhou is dif…

【渝粤题库】广东开放大学 跨文化商务沟通 形成性考核

选择题 题目: 3. The Chinese word “蝙蝠” carries the same connotative meanings with the English word “bat”. 选择一项: 题目: 4. The Chinese word “龙” carries the same denotative meaning with the English word “dragon”…

累积:轻松自定义Java收集器

Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java Collector更加容易。 介绍 如果您曾经使用过Java Stream &#xff0c;那么很可能使用了一些Collector &#xff0c;例如&#xff1a; Collectors.toList C…

信道接入技术及协议

1. 信道共享方式 在普通的通信系统中&#xff0c;信道共享方式有3种&#xff1a;点对点、点对多点和多点共享。 1.1 点对点 点对点是最简单的信道共享方式。其特点是只有两个节点共享无线信道。在单信道时&#xff0c;两个节点可以通过半双工方式实现共享&#xff0c;在双信…