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

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

本篇主要介绍对solr初体验的一些步骤和看法。java

1、solr简介

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

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

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

特征windows

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

  2. Solr在世界范围内以极大的规模获得证实。服务器

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

  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. 社区

2、安装启动(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单机版安装并启动完成,并实现了对中文分词的查询。

3、集群搭建

因为本系统数据量不算很大,单机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官方文档

4、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入门参考

相关文章
相关标签/搜索