全文检索引擎(四)---solr初体验

结合上述文章,决定采用全文检索引擎进行功能的实现。目前市面上成熟的全文检索引擎有多种,本人挑选了目前最火的、用户最多的两款全文检索引擎solrelasticsearch进行对比,从中选取更适合本系统的解决方案。

本篇主要介绍对solr初体验的一些步骤和见解。

一、solr简介

Solr 是建立在 Apache Lucene 上的流行的、快速的、开源的企业搜索平台。

Solr 是高度可靠、可伸缩和容错的, 提供分布式索引、复制和负载平衡查询、自动故障切换和恢复、集中配置等。

Solr 赋予了世界上许多最大的互联网网站的搜索和导航功能。

特征

  1. 由Lucene提供支持,Solr支持强大的匹配功能,包括短语,通配符,连接,分组以及更多数据类型。

  2. Solr在世界范围内以极大的规模得到证明。

  3. Solr使用您使用的工具快速构建应用程序。

  4. Solr附带内置的响应式管理用户界面,可以轻松控制Solr实例。

  5. Solr通过JMX发布大量度量数据。

  6. Solr基于经过实战考验的Apache Zookeeper,可以轻松扩展和缩小。

  7. Solr开箱即用于复制,分发,重新平衡和容错。

  8. Solr's旨在满足您的需求,同时简化配置。

  9. Solr利用Lucene的近实时索引功能确保您在想要查看内容时看到您的内容。

  10. Solr发布了许多定义明确的扩展点,可以轻松插入索引和查询时插件。当然,由于它是Apache许可的开源,您可以更改您想要的任何代码。

资源

  1. 教程
  2. 文档
  3. Javadocs
  4. 社区

二、安装启动(windows)

要求:Apache Solr在Java 8或更高版本上运行。对于所有Java版本,强烈建议不要使用实验性的-XX JVM选项。

  1. 下载 :lucene.apache.org/solr/downlo… (Apache Solr 7.4.0)
  2. 解压如下:

3. 每个文件夹中内容介绍:

bin/

该目录包含几个重要的脚本,可以更轻松地使用Solr。

solr and solr.cmd

这是Solr的控制脚本,也称为bin / solr(* nix)/ bin / solr.cmd(Windows)。此脚本是启动和停止Solr的首选工具。在SolrCloud模式下运行时,您还可以创建集合或核心,配置身份验证以及使用配置文件。

post

PostTool,它提供了一个简单的命令行界面,用于将内容POST到Solr。

solr.in.sh and solr.in.cmd

这些是* nix和Windows系统的属性文件。此处配置Java,Jetty和Solr的系统级属性。使用bin / solr / bin / solr.cmd时,可以覆盖其中许多设置,但这允许您在一个位置设置所有属性。

install_solr_services.sh

此脚本在* nix系统上用于将Solr安装为服务。在Solr to Production一节中有更详细的描述。 contrib/

Solr的contrib目录包含Solr专用功能的附加插件。

dist/

dist目录包含主要的Solr .jar文件。

docs/

docs目录包含指向Solr的在线Javadocs的链接。

example/

示例目录包括几种演示各种Solr功能的示例。

licenses/

licenses目录包含Solr使用的第三方库的所有许可证

server/

此目录是Solr应用程序的核心所在的目录。此目录中的自述文件提供了详细的概述,但以下是一些要点:

  • Solr的Admin UI(server / solr-webapp)
  • Jetty库(server / lib)
  • 日志文件(服务器/日志)和日志配置(服务器/资源)
  • 示例配置集(server / solr / configsets)
  1. 启动运行

进入bin目录,运行solr.cmd,这将在后台启动Solr,侦听端口8983。访问http://localhost:8983/solr/ 将看到solr启动页面。

  1. 配置核心

点击Core Admin菜单,如果没有Core,会弹出如下框,提示添加。

首先在\server\solr\下创建核心为new_core的文件夹,其次在new_core文件夹中创建配置文件等。本人使用的是官方提供的默认配置 即\server\solr\configsets_default\文件夹下的conf文件夹,直接复制粘贴到new_core文件夹下即可。

  1. 配置中文分词器

solr7以前的版本对于中文分词支持不好,通常会用IK分词器。对于solr7,可以直接使用提供的分词器。

a. 复制lucene-analyzers-smartcn-7.2.0.jar(在contrib/analysis-extras/lucene-libs目录下)到server/solr-webapp/webapp/WEB-INF/lib目录下。

b. 在managed-schema(在server/solr/new_core/conf目录下,这里选的自定义core即new_core)文件中添加新分词器。

  <fieldType name="text_hmm_chinese" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
    </fieldType>
复制代码

c. 修改<field name="stu_id" type="text_hmm_chinese" indexed="true" stored="true"/>

d. 在页面上重新加载自定义的core即new_core。

e. 在页面上选择core,选择分词器,进行分词。

  1. 添加数据、查询数据

在schema.xml文件中,新增<field>,name指定中文分词的数据的key,type指定为上面设置的中文分词器name。

导入JSON数据如下图所示:

查询数据如下图所示:

至此,solr单机版安装并启动完成,并实现了对中文分词的查询。

三、集群搭建

由于本系统数据量不算很大,单机solr完全可以胜任,但是还是研究了下集群的搭建,以防之后在单机向集群升级时会有不便。

SolrCloud 旨在为跨多个服务器分发索引内容和查询请求提供高可用的容错环境。 它是一种将数据组织成多个碎片或碎片的系统, 可以承载在多台计算机上, 复制副本为可伸缩性和容错提供冗余, 以及一个管理员服务器, 帮助管理整个结构, 使索引和搜索请求可以正确路由。

交互式启动

脚本使您可以轻松地开始使用 SolrCloud, 因为它引导您完成在云模式下启动 Solr 节点和添加集合的过程。要开始, 只需做:

bin/solr -e cloud

这将启动一个交互式会话, 以让您完成与嵌入式管理员一起设置简单 SolrCloud 群集的步骤。

该脚本首先询问您要在本地群集中运行多少个 Solr 节点, 默认值为2。

Welcome to the SolrCloud example!

This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]
复制代码

该脚本支持启动多达4个节点, 但我们建议在启动时使用默认值2。这些节点将分别存在于一台计算机上, 但将使用不同的端口在不同的服务器上模拟操作。

接下来, 脚本将提示您将端口绑定到每个 Solr 节点, 如:

Please enter the port for node1 [8983]

为每个节点选择任何可用端口;第一个节点的默认值为第二个节点的8983和7574。脚本将按顺序启动每个节点, 并向您显示它用来启动服务器的命令, 例如:

solr start -cloud -s example/cloud/node1/solr -p 8983

第一个节点还将启动绑定到端口9983的嵌入式管理员服务器。第一个节点的 Solr 主页按选项所示。

example/cloud/node1/solr-s

启动群集中的所有节点后, 脚本将提示您输入要创建的集合的名称:

Please provide a name for your new collection: [gettingstarted]

建议的默认值为 "gettingstarted", 但您可能希望为特定的搜索应用程序选择更适合的名称。

接下来, 脚本将提示您输入要在其中分发集合的碎片数。 如果您不确定, 我们建议使用默认值 2, 以便您可以看到集合是如何分布在 SolrCloud 群集中的多个节点上的。

接下来, 脚本将提示您为每个碎片创建的副本数。 如果您不确定, 请使用默认值 2, 以便您可以看到在 SolrCloud 中如何处理复制。

最后, 脚本将提示您输入集合的配置目录的名称。你可以选择**_default**, 或sample_techproducts_configs。配置目录被拉起, 所以你可以预先审查, 如果你想。当您仍在为文档设计架构时, _default配置很有用, 在测试 Solr 时需要一些灵活性, 因为它具有无模式功能。但是, 在创建集合之后, 可以禁用无模式功能, 以便锁定架构 (以便在这样做后索引的文档不会更改架构) 或自行配置架构。这可以按如下方式完成 (假定您的集合名称为):server/solr/configsets/mycollection

curl http://host:8983/api/collections/mycollection/config -d '{"set-user-property": {"update.autoCreateFields":"false"}}'

此时, 您应该在本地 SolrCloud 群集中创建一个新的集合。要验证这一点, 可以运行状态命令: bin/solr status

如果在此过程中遇到任何错误, 请检查中的 Solr 日志文件。 example/cloud/node1/logsexample/cloud/node2/logs

通过访问 Solr 管理用户界面中的 "云" 面板: http://localhost:8983/solr/#/~cloud, 您可以看到如何在群集上部署集合。Solr 还提供了一种使用运行状况检查命令对集合执行基本诊断的方法: bin/solr healthcheck -c gettingstarted

运行状况检查命令收集有关集合中每个副本的基本信息, 如文档数、当前状态 (活动、向下等) 和地址 (副本在群集中的位置)。 现在可以使用Post 工具将文档添加到 SolrCloud 中。 要在 SolrCloud 模式下停止 Solr, 您可以使用该脚本并发出命令, 如下:

bin/solr stop -all

至此,集群搭建完毕。 如果有其他疑问可以参考官方文档:solrcloud官方文档

四、JAVA操作solr(solrJ)

SolrJ是一种 API, 它使用 Java 编写的应用程序 (或基于 JVM 的任何语言) 可以轻松地与 Solr 进行对话。SolrJ 隐藏了许多连接到 solr 的详细信息, 并允许应用程序使用简单的高级方法与 solr 进行交互。SolrJ 支持大多数 Solr api, 并且是高度可配置的。

SolrJ API 附带了 Solr, 因此您不必下载或安装其他任何内容。但是, 您需要将生成配置为包括 SolrJ 及其依赖项。

对于使用 Maven 构建的项目, 请将以下内容放在:pom.xml

<dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>7.4.0</version>
</dependency>
复制代码

SolrJ 概述

SolrJ 的灵活性是围绕几个简单的接口构建的。 所有对 Solr 的请求都由一个 SolrClient发送。SolrClient 是 SolrJ 核心的主要主力。他们处理与 Solr 连接和通信的工作, 并且是大多数用户配置发生的地方。 请求以 SolrRequests的形式发送, 并作为 SolrResponses返回。

SolrClients 类型

SolrClient有几个具体的实现, 每个都面向不同的使用模式或恢复模式:

HttpSolrClient -面向以查询为中心的工作负载, 但也是一个很好的通用客户端。直接与单个 Solr 节点通信。

LBHttpSolrClient -平衡请求负载横跨 Solr 节点列表。根据节点的运行状况调整 "在职" 节点的列表。

CloudSolrClient -面向与 SolrCloud 部署的通信。使用已记录的动物园管理员状态发现并将请求路由到健康的 Solr 节点。

ConcurrentUpdateSolrClient -面向以索引为中心的工作负载。在将更大的批处理发送到 Solr 之前, 在内部缓冲文档。

在 SolrJ 中查询

SolrClient有许多获取 Solr 结果的方法。其中的每个方法都采用一个封装任意查询参数的对象。每个方法输出 a, 一个包装器, 可用于访问结果文档和其他相关元数据。 query()SolrParamsQueryResponse

下面的代码段使用 SolrClient 查询 Solr 的 "techproducts" 示例集合, 并对结果进行迭代。

final SolrClient client = getSolrClient();

final Map<String, String> queryParamMap = new HashMap<String, String>();
queryParamMap.put("q", "*:*");
queryParamMap.put("fl", "id, name");
queryParamMap.put("sort", "id asc");
MapSolrParams queryParams = new MapSolrParams(queryParamMap);

final QueryResponse response = client.query("techproducts", queryParams);
final SolrDocumentList documents = response.getResults();

print("Found " + documents.getNumFound() + " documents");
for(SolrDocument document : documents) {
  final String id = (String) document.getFirstValue("id");
  final String name = (String) document.getFirstValue("name");

  print("id: " + id + "; name: " + name);
}
复制代码

SolrParams有一个子类, 它提供了一些方便的方法, 大大简化了查询的创建。下面的代码段显示了如何使用以下几种方便方法生成上一个示例中的查询:SolrQuery SolrQuery

final SolrQuery query = new SolrQuery("*:*");
query.addField("id");
query.addField("name");
query.setSort("id", ORDER.asc);
query.setRows(numResultsToReturn);
复制代码

SolrJ 中的索引

索引也很简单, 使用 SolrJ。用户生成要作为实例索引的文档, 并将它们作为参数提供给其中的一个方法。

SolrInputDocumentadd()SolrClient

下面的示例演示如何使用 SolrJ 将文档添加到 Solr 的 "techproducts" 示例集合中:

final SolrClient client = getSolrClient();

final SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "Amazon Kindle Paperwhite");

final UpdateResponse updateResponse = client.add("techproducts", doc);
// Indexed documents must be committed
client.commit("techproducts");
复制代码

至此,solrj的一些简单操作介绍完毕,一些复杂的查询可以参考官方文档:使用solrj

总结

solr安装简单,初次使用需要配置一些参数在配置文件中,不过配置文件中描述的很详细,如果之后想修改配置可以在配置文件中直接参考注释即可。solr自带了可视化界面,可以通过solr admin界面进行数据的查询,插入,节点状态信息查看等各项功能。solrcloud可以使用solr直接启动,集群搭建也挺方便。在java编码时,可以使用现有的solrj进行数据操作,避免了一些不需要的连接等操作,方便简单。

总体来说,solr值得信赖。

附上一些优秀的参考文档:

solr索引优化

solr优化

solr入门参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值