具有外部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,一经查实,立即删除!

相关文章

随机过程及其稳态stability

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

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

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

MCMC 和 Gibbs采样

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

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

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

信道接入技术及协议

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

MATLAB | 解决打开延迟的情况

问题 最近打开matlab,一直没有反应,大概几分钟后,才开始有反应。 网上关于matlab启动出现延迟的方法有很多种解决方法。但都是针对破解版的,而装正版matlab2020b,缺少license文件。对于此,我们尝试用另外一…

50 个具有挑战性的概率问题 [01/50]:袜子抽屉

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》(Fifty Challenge Problems in Probability with Solutions)一书。我认为…

制作程序化装饰花纹图案_装饰图案

制作程序化装饰花纹图案装饰图案 我不经常使用的一种设计模式是Decorator 。 我不确定为什么这种模式不受欢迎,因为它很方便。 装饰器模式允许以受控方式向对象添加功能。 即使在使用静态类型的语言时,也可以在运行时运行! 装饰器模式是子类的…

6个您需要了解的日志管理工具(以及如何使用它们)

如果没有正确的工具来汇总和解析日志数据,则几乎不可能找到并了解您正在寻找的信息。 日志有无穷无尽的用途,因为日志本身是无止境的。 应用程序日志,安全日志,BI日志, 林肯日志 (好吧,也许不是…

JDK 12开关表达式遇到意外的枚举值

正如我在“ 玩JDK 12的Switch表达式 ”一文中所写的那样, JDK 12 Early Access Build使JEP 325的实现(“ Switch Expressions(Preview)”)的实验变得容易。 我的帖子“ JDK 12:实际中的切换语句/表达式 ”使…

Matlab画图线型、符号及颜色设置

1. matlab 中线条的主要属性 Color: 颜色LineStyle: 线型LineWidth: 线宽Marker: 标记点的形状MarkerFaceColor: 标记点填充颜色MarkerEdgeColor: 标记点边缘颜色MarkerSize: 标记点大小 2. 各种属性的名称 2.1 线型 -Solid line (default) – Dashed line : Dotted line …

休眠面试问答-最终清单

这是有关Hibernate Framework的一些最重要问题的摘要,可能会要求您在访谈中回答! 您无需担心下一次面试的机会,因为Java Code Geeks在这里为您服务! 您可能会被问到的大多数事情都收集在下面的列表中。 我们的Hibernate面试问题将…

matlab 进度条/waitbar 显示运行进度

当运行大程序,需要跑大量数据的时候,使用进度条可以看到程序究竟运行到什么地方了,哈哈,要不干等着难受(╯﹏╰)…… waitbar的作用是打开或者更新进度条。 1 语法结构 (1.1) h waitbar(x,‘message’) x表示进度条的比例长度…

MATLAB 命令 BOXPLOT

Matlab中有关boxplot(X)命令的解释: boxplot(X) produces a box and whisker plot for each column of the matrix X. The box has lines at the lower quartile, median, and upper quartile values. Whiskers extend from each end of the box to the adjacent v…

latex-bib参考文献人名特殊字符

https://blog.csdn.net/weixin_43413198/article/details/105468843

Matlab RGB 颜色对照表(0-1之间取值)

https://blog.csdn.net/qq_38882446/article/details/100886087

空间点过程(Point Processes)和随机测度(Random Measure)

1 空间点过程与随机测度(一):从数星星说起 1.1 数星星的数学 小时候,在晴朗的夜里,我喜欢仰望星空,去数天上的星星——那是无忧无虑的快乐童年。长大后,当我们再度仰望苍穹,也许会思…

add a legend to a boxplot in MATLAB

1. 给同组数据分类加legend figure; colors [1 0 0; 1 0 0; 0 0 1; 0 0.5 0; 0 0.5 0; 0 0.5 0]; x boxplot(rand(100,6),Colors,colors); legend(Group A,Group B,Group C)2.给不同组数据加legend box_vars findall(gca,Tag,Box); hLegend legend(box_vars([8,6]), {N…

JavaFX技巧31:遮罩/剪切/ Alpha通道

选择条 最近,我不得不实现一个自定义控件,该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目,并且在项目过多的情况下,允许用户左右水平滚动。 该控件将在空间受限的区域中使用,…

通信中的频谱效率与能量效率

频谱效率(Spectral Efficiency) 频谱效率(Spectral Efficiency,SE)简称谱效,也称系统容量、频带利用率。 该指标用来衡量系统的有效性,描述了能够提供多少容量。 它定义为系统传输的有效信息速率R除以通信信道带宽B&a…