Apache Solr 简明教程

Apache Solr - Quick Guide

Apache Solr - Overview

Solr 是一个开源搜索平台,该平台用于构建 search applications 。它建立在 Lucene (全文搜索引擎)之上。Solr 已经准备就绪,速度快且具有高度可扩展性。利用 Solr 构建的应用程序十分精良,而且能够提供高性能。

2004 年,正是 Yonik Seely 为了给 CNET Networks 的公司网站添加搜索功能才创建了 Solr。2006 年 1 月,它在 Apache 软件基金会下成为一个开源项目。其最新版本 Solr 6.0 于 2016 年发布,该版本支持执行并行 SQL 查询。

Solr 可以与 Hadoop 一起使用。由于 Hadoop 处理大量数据,Solr 帮助我们在如此庞大的数据源中找到所需的信息。Solr 不仅可用于搜索,还可以用于存储目的。与其他 NoSQL 数据库一样,它是一个 non-relational data storageprocessing technology

简而言之,Solr 是一个可扩展的、已准备好部署的搜索/存储引擎,其经过优化,可搜索大量以文本为中心的的数据。

Features of Apache Solr

Solr 是一个围绕 Lucene 的 Java API 的包装器。因此,使用 Solr,您可以利用 Lucene 的所有功能。让我们看看 Solr 的一些最突出的特性 -

  1. Restful APIs - 要与 Solr 通信,不必具备 Java 编程技能。相反,您可以使用 restful 服务与其通信。我们将文档采用 XML、JSON 和 .CSV 等文件格式输入到 Solr 中,并以相同的文件格式获取结果。

  2. Full text search - Solr 提供全文搜索所需的所有功能,如标记、短语、拼写检查、通配符和自动完成。

  3. Enterprise ready - 根据组织的需要,Solr 可以部署在任何类型的系统(无论大小)中,如独立、分布式、云端等。

  4. Flexible and Extensible - 通过扩展 Java 类并相应地配置,我们可以轻松定制 Solr 的组件。

  5. NoSQL database - Solr 还可以用作大数据规模的 NOSQL 数据库,在该数据库中我们可以在集群中分发搜索任务。

  6. Admin Interface − Solr 提供了一个易于使用、用户友好的、功能强大的用户界面,我们可以使用它来执行所有可能的任务,如管理日志、添加、删除、更新和搜索文档。

  7. Highly Scalable − 在与 Hadoop 一起使用 Solr 时,我们可以通过添加副本来扩展其容量。

  8. Text-Centric and Sorted by Relevance − Solr 主要用于搜索文本文档,并根据用户的查询按顺序提供相关结果。

与 Lucene 不同,在使用 Apache Solr 时,您无需具备 Java 编程技能。它提供了一项开箱即用的出色服务来构建一个具有自动完成功能的搜索框,而 Lucene 并不提供此功能。使用 Solr,我们可以为大规模(大数据)应用程序扩展、分发和管理索引。

Lucene in Search Applications

Lucene 是一个简单但功能强大的基于 Java 的搜索库。它可以在任何应用程序中使用以添加搜索功能。Lucene 是一个可扩展且高性能的库,用于索引和搜索几乎任何类型的文本。Lucene 库提供了任何搜索应用程序所需的核心操作,如 IndexingSearching

如果我们有一个包含大量数据的大型 Web 门户,那么我们很可能需要在门户中使用一个搜索引擎,以便从庞大的数据池中提取相关信息。Lucene 作为任何搜索应用程序的核心,并提供了与索引和搜索相关的关键操作。

Apache Solr - Search Engine Basics

搜索引擎是指一个包含大量互联网资源的巨大数据库,如网页、新闻组、程序、图像等。它有助于在万维网上查找信息。

用户可以通过以关键字或短语的形式向搜索引擎传递查询来搜索信息。然后,搜索引擎会在其数据库中搜索并向用户返回相关的链接。

google search

Search Engine Components

一般来说,搜索引擎有以下三个基本组件:

  1. Web Crawler − 网络爬虫也称为 spidersbots 。它是一个遍历 Web 以收集信息的软件组件。

  2. Database − Web 上的所有信息都存储在数据库中。它们包含大量网络资源。

  3. Search Interfaces − 此组件是用户和数据库之间的接口。它帮助用户通过数据库进行搜索。

How do Search Engines Work?

任何搜索应用程序都需要执行以下部分或全部操作。

Step

Title

Description

1

Acquire Raw Content

任何搜索应用程序的第一步是收集要进行搜索的目标内容。

2

Build the document

下一步是从搜索应用程序可以轻松理解和解释的原始内容中构建文档。

3

Analyze the document

在开始索引之前,需要分析文档。

4

Indexing the document

一旦建立和分析了文档,下一步就是对它们进行索引,以便可以根据某些键来检索此文档,而不是查看文档的全部内容。索引类似于我们在书的末尾所拥有的索引,其中常见的单词与它们的页码一起显示,以便可以快速地追踪这些单词,而不是搜索整本书。

5

User Interface for Search

一旦索引数据库准备就绪,应用程序就可以执行搜索操作。为了帮助用户进行搜索,应用程序必须提供一个用户界面,用户可以在其中输入文本并启动搜索进程。

6

Build Query

一旦用户做出搜索文本的请求,应用程序应使用该文本准备一个查询对象,然后可以使用它来查询索引数据库以获得相关详细信息。

7

Search Query

使用查询对象,检查索引数据库以获取相关详细信息和内容文档。

8

Render Results

一旦接收到所需结果,应用程序应决定如何使用其用户界面向用户显示结果。

请看以下说明图。它显示了搜索引擎运作方式的总体情况。

search engine

除了这些基本操作外,搜索应用程序还可提供管理用户界面,以帮助管理员根据用户配置文件控制搜索级别。搜索结果分析是任何搜索应用程序的另一个重要且高级的方面。

Apache Solr - On Windows Environment

在本章中,我们将讨论如何在 Windows 环境中设置 Solr。若要在 Windows 系统上安装 Solr,您需要按照以下步骤操作:

  1. 访问 Apache Solr 主页并单击下载按钮。

  2. 选择其中一个镜像以获取 Apache Solr 的索引。从那里下载名为 Solr-6.2.0.zip 的文件。

  3. 将文件从 downloads folder 移动到所需的目录并对其解压缩。

假设您下载了 Solr 文件并将其解压到 C 驱动器上。在这种情况下,您可以按以下屏幕截图所示启动 Solr。

solr file c drive

要验证安装,请在浏览器中使用以下 URL。

如果安装过程成功,您将看到 Apache Solr 用户界面的仪表盘,如下所示。

solr admin

Setting Java Environment

我们还可以使用 Java 库与 Apache Solr 通信;但在使用 Java API 访问 Solr 之前,您需要为这些库设置类路径。

Setting the Classpath

classpath 设置为 .bashrc 文件中的 Solr 库。在任何编辑器中打开 .bashrc ,如下所示。

$ gedit ~/.bashrc

设置 Solr 库的类路径(HBase 中的 lib 文件夹),如下所示。

export CLASSPATH = $CLASSPATH://home/hadoop/Solr/lib/*

这样做是为了在使用 Java API 访问 HBase 时防止出现“类未找到”异常。

Apache Solr - On Hadoop

Solr 可以与 Hadoop 一起使用。由于 Hadoop 处理大量数据,Solr 帮助我们从如此大的资源中找到所需的信息。在本节中,让我们了解如何在您的系统上安装 Hadoop。

Downloading Hadoop

以下是要遵循的将 Hadoop 下载到系统上的步骤。

Step 1 - 转到 Hadoop 主页。可以使用链接 - www.hadoop.apache.org/ 。单击 Releases 链接,如以下屏幕截图所示。

hadoop home page

它会将您重定向到包含用于 Hadoop 各种版本源文件和二进制文件的镜像链接的 Apache Hadoop Releases 页,如下所示 −

hadoop releases

Step 2 − 选择最新版本的 Hadoop(在本教程中,为 2.6.4),然后单击其 binary link 。它会将您带到一个提供 Hadoop 二进制镜像的页面。单击其中一个镜像以下载 Hadoop。

Download Hadoop from Command Prompt

打开 Linux 终端并以超级用户身份登录。

$ su
password:

转到需要安装 Hadoop 的目录,并使用前面复制的链接将文件保存在该目录中,如下面的代码块所示。

# cd /usr/local
# wget http://redrockdigimark.com/apachemirror/hadoop/common/hadoop-
2.6.4/hadoop-2.6.4.tar.gz

下载 Hadoop 后,使用以下命令将其解压缩。

# tar zxvf hadoop-2.6.4.tar.gz
# mkdir hadoop
# mv hadoop-2.6.4/* to hadoop/
# exit

Installing Hadoop

按照以下步骤安装 Hadoop 伪分布式模式。

Step 1: Setting Up Hadoop

您可以将以下命令附加到 ~/.bashrc 文件来设置 Hadoop 环境变量。

export HADOOP_HOME = /usr/local/hadoop export
HADOOP_MAPRED_HOME = $HADOOP_HOME export
HADOOP_COMMON_HOME = $HADOOP_HOME export
HADOOP_HDFS_HOME = $HADOOP_HOME export
YARN_HOME = $HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR = $HADOOP_HOME/lib/native
export PATH = $PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL = $HADOOP_HOME

接下来,将所有更改应用到当前运行的系统中。

$ source ~/.bashrc

Step 2: Hadoop Configuration

您可以在 “$HADOOP_HOME/etc/hadoop” 位置找到所有 Hadoop 配置文件。根据您的 Hadoop 基础架构,需要更改这些配置文件中的内容。

$ cd $HADOOP_HOME/etc/hadoop

为了用 Java 开发 Hadoop 程序,必须将 hadoop-env.sh 文件中的 Java 环境变量重置为系统的 Java 位置来替换 JAVA_HOME 值。

export JAVA_HOME = /usr/local/jdk1.7.0_71

以下是配置 Hadoop 需要编辑的文件列表 −

  1. core-site.xml

  2. hdfs-site.xml

  3. yarn-site.xml

  4. mapred-site.xml

core-site.xml

core-site.xml 文件包含信息,例如用于 Hadoop 实例的端口号、分配给文件系统内存、用于存储数据的内存限制和读/写缓冲区的大小。

打开 core-site.xml,并在 <configuration>、</configuration> 标记内添加以下属性。

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>
</configuration>

hdfs-site.xml

hdfs-site.xml 文件包含信息,例如复制数据的值、 namenode 路径和本地文件系统的 datanode 路径。这意味着您想要存储 Hadoop 基础架构的位置。

让我们假设以下数据。

dfs.replication (data replication value) = 1

(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode

打开此文件,并在 <configuration>、</configuration> 标记内添加以下属性。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>

   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>

   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

Note − 在上述文件中,所有属性值都是用户定义的,您可以根据 Hadoop 基础架构进行更改。

yarn-site.xml

此文件用于将 Yarn 配置到 Hadoop 中。打开 yarn-site.xml 文件并在该文件中的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

此文件用于指定我们正在使用的 MapReduce 框架。默认情况下,Hadoop 包含 yarn-site.xml 模板。首先,使用以下命令需要将文件从 mapred-site,xml.template 复制到 mapred-site.xml 文件。

$ cp mapred-site.xml.template mapred-site.xml

打开 mapred-site.xml 文件并在 <configuration>、</configuration> 标记内添加以下属性。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

Verifying Hadoop Installation

以下步骤用于验证 Hadoop 安装。

Step 1: Name Node Setup

使用命令“hdfs namenode –format”设置 namenode,如下所示。

$ cd ~
$ hdfs namenode -format

预期结果如下所示。

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = localhost/192.168.1.11
STARTUP_MSG:   args = [-format] STARTUP_MSG:   version = 2.6.4
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain 1
images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

Step 2: Verifying the Hadoop dfs

以下命令用于启动 Hadoop dfs。执行此命令将启动 Hadoop 文件系统。

$ start-dfs.sh

预期输出如下所示 −

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-2.6.4/logs/hadoop-
hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-2.6.4/logs/hadoop-
hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

Step 3: Verifying the Yarn Script

以下命令用于启动 Yarn 脚本。执行此命令将启动 Yarn 守护进程。

$ start-yarn.sh

预期输出如下所示 −

starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.6.4/logs/yarn-
hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop-
2.6.4/logs/yarn-hadoop-nodemanager-localhost.out

Step 4: Accessing Hadoop on Browser

用于访问 Hadoop 的默认端口号是 50070。使用以下 URL 在浏览器上获取 Hadoop 服务。

accessing hadoop

Installing Solr on Hadoop

按照以下步骤下载并安装 Solr。

Step 1

单击以下链接打开 Apache Solr 主页 − https://lucene.apache.org/solr/

solr home page

Step 2

单击 download button (在上方的屏幕截图中突出显示)。单击后,您将被重定向到包含多个 Apache Solr 镜像的页面。选择一个镜像并单击它,这将把您重定向到一个页面,您可以在其中下载 Apache Solr 的源文件和二进制文件,如下图所示。

apache mirror

Step 3

单击后,名为 Solr-6.2.0.tqz 的文件夹将下载到系统下载文件夹中。解压下载的文件夹内容。

Step 4

在 Hadoop 主目录中创建一个名为 Solr 的文件夹,并将解压文件夹的内容移到该目录中,如下所示。

$ mkdir Solr
$ cd Downloads
$ mv Solr-6.2.0 /home/Hadoop/

Verification

浏览 Solr 主目录的 bin 文件夹,并使用 version 选项验证安装,如下面的代码块所示。

$ cd bin/
$ ./Solr version
6.2.0

Setting home and path

使用以下命令打开 .bashrc 文件:

[Hadoop@localhost ~]$ source ~/.bashrc

现在按照以下方式设置 Apache Solr 的主页和路径目录:

export SOLR_HOME = /home/Hadoop/Solr
export PATH = $PATH:/$SOLR_HOME/bin/

打开终端并执行以下命令:

[Hadoop@localhost Solr]$ source ~/.bashrc

现在,您可以在任何目录中执行 Solr 命令。

Apache Solr - Architecture

在本章中,我们将讨论 Apache Solr 的架构。下面的插图显示了 Apache Solr 架构的框图。

solr architecture

Solr Architecture ─ Building Blocks

以下是 Apache Solr 的主要构建模块(组件):

  1. Request Handler − 我们发送到 Apache Solr 的请求由这些请求处理程序处理。请求可能是查询请求或索引更新请求。根据我们的要求,我们需要选择请求处理程序。为了向 Solr 传递一个请求,我们通常会将处理程序映射到某个 URI 终端点,它会处理指定请求。

  2. Search Component − 搜索组件是 Apache Solr 中提供的一种搜索类型(功能)。它可能是拼写检查、查询、分面、点击突出显示等等。这些搜索组件被注册为 search handlers 。可以向一个搜索处理程序注册多个组件。

  3. Query Parser − Apache Solr 查询解析器解析我们传递给 Solr 的查询并检查查询的语法错误。在解析查询后,它会将查询翻译成 Lucene 能够理解的格式。

  4. Response Writer − Apache Solr 中的响应生成器是为用户查询生成格式化输出的组件。Solr 支持 XML、JSON、CSV 等响应格式。我们为每种类型的响应配置不同的响应生成器。

  5. Analyzer/tokenizer − Lucene 以标记的形式识别数据。Apache Solr 分析内容、将内容分成标记,并将这些标记传递给 Lucene。Apache Solr 中的分析器会检查字段的文本并生成标记流。标记生成器会将分析器准备好的标记流分解成标记。

  6. Update Request Processor − 每当我们向 Apache Solr 发送更新请求时,该请求就会通过一组插件(签名、日志记录、索引)运行,这些插件统称为 update request processor 。此处理器负责修改,例如删除字段、添加字段等。

Apache Solr - Terminology

在本章中,我们将尝试理解在使用 Solr 时经常使用的一些术语的真实含义。

General Terminology

以下是所有类型的 Solr 设置中都会用到的常规术语列表:

  1. Instance − 就像 tomcat instancejetty instance 一样,此术语是指运行在 JVM 内的应用程序服务器。Solr 的主页目录提供对每个 Solr 实例的引用,可以在每个实例中配置一个或多个内核以在其中运行。

  2. Core − 在应用程序中运行多个索引时,您可以在每个实例中使用多个内核,而不是每个内核多个实例。

  3. Home − 术语 $SOLR_HOME 指主页目录,其中包含有关内核及其索引、配置和依赖项的所有信息。

  4. Shard − 在分布式环境中,数据在多个 Solr 实例之间进行分区,其中每块数据都可以称为 Shard 。它包含整个索引的子集。

SolrCloud Terminology

之前在章节中,我们讨论过如何以独立模式安装 Apache Solr。请注意,我们也可以在分布式模式(云环境)中安装 Solr,在该模式下以主从模式安装 Solr。在分布式模式中,索引在主服务器上创建,并复制到一个或多个从服务器。

Solr Cloud 相关的关键词如下:

  1. Node − 在 Solr 云中,每个独立的 Solr 实例都被视为一个 node

  2. Cluster − 环境的所有节点组合在一起形成一个 cluster

  3. Collection − 集群有一个逻辑索引,称为 collection

  4. Shard − 分片是索引的一个或多个副本的集合的一部分。

  5. Replica − 在 Solr Core 中,在节点中运行的分片副本称为 replica

  6. Leader − 它也是分片的副本,它将 Solr Cloud 的请求分发到其余副本。

  7. Zookeeper − 这是 Solr Cloud 用于集中配置和协调的 Apache 项目,用于管理集群并选举领导者。

Configuration Files

Apache Solr 中的主要配置文件如下:

  1. Solr.xml − 这是 $SOLR_HOME 目录中的文件,其中包含 Solr Cloud 相关信息。为了加载核心,Solr 引用此文件,这有助于识别核心。

  2. Solrconfig.xml − 此文件包含与请求处理和响应格式化相关的定义和特定于核心的配置,以及索引、配置、管理内存和提交。

  3. Schema.xml − 此文件包含整个架构以及字段和字段类型。

  4. Core.properties − 此文件包含特定于核心的配置。它用于 core discovery ,因为它包含核心的名称和数据目录的路径。它可以在任何目录中使用,然后将被视为 core directory

Apache Solr - Basic Commands

Starting Solr

在安装 Solr 之后,浏览到 Solr 主目录中的 bin 文件夹,并使用以下命令启动 Solr。

[Hadoop@localhost ~]$ cd
[Hadoop@localhost ~]$ cd Solr/
[Hadoop@localhost Solr]$ cd bin/
[Hadoop@localhost bin]$ ./Solr start

此命令在后台启动 Solr,监听端口 8983,并显示以下消息。

Waiting up to 30 seconds to see Solr running on port 8983 [\]
Started Solr server on port 8983 (pid = 6035). Happy searching!

Starting Solr in foreground

如果您使用 start 命令启动 Solr ,则 Solr 将在后台启动。取而代之的是,您可以使用 –f option 在前台启动 Solr。

[Hadoop@localhost bin]$ ./Solr start –f

5823 INFO  (coreLoadExecutor-6-thread-2) [   ] o.a.s.c.SolrResourceLoader
Adding 'file:/home/Hadoop/Solr/contrib/extraction/lib/xmlbeans-2.6.0.jar' to
classloader
5823 INFO  (coreLoadExecutor-6-thread-2) [   ] o.a.s.c.SolrResourceLoader
Adding 'file:/home/Hadoop/Solr/dist/Solr-cell-6.2.0.jar' to classloader
5823 INFO  (coreLoadExecutor-6-thread-2) [   ] o.a.s.c.SolrResourceLoader
Adding 'file:/home/Hadoop/Solr/contrib/clustering/lib/carrot2-guava-18.0.jar'
to classloader
5823 INFO  (coreLoadExecutor-6-thread-2) [   ] o.a.s.c.SolrResourceLoader
Adding 'file:/home/Hadoop/Solr/contrib/clustering/lib/attributes-binder1.3.1.jar'
to classloader
5823 INFO  (coreLoadExecutor-6-thread-2) [   ] o.a.s.c.SolrResourceLoader
Adding 'file:/home/Hadoop/Solr/contrib/clustering/lib/simple-xml-2.7.1.jar'
to classloader
……………………………………………………………………………………………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………………………………………………………………………………….
12901 INFO  (coreLoadExecutor-6-thread-1) [   x:Solr_sample] o.a.s.u.UpdateLog
Took 24.0ms to seed version buckets with highest version 1546058939881226240 12902
INFO  (coreLoadExecutor-6-thread-1) [   x:Solr_sample]
o.a.s.c.CoreContainer registering core: Solr_sample
12904 INFO  (coreLoadExecutor-6-thread-2) [   x:my_core] o.a.s.u.UpdateLog Took
16.0ms to seed version buckets with highest version 1546058939894857728
12904 INFO  (coreLoadExecutor-6-thread-2) [   x:my_core] o.a.s.c.CoreContainer
registering core: my_core

Starting Solr on another port

使用 start 命令的 –p option ,我们可以在另一个端口启动 Solr,如下面的代码块所示。

[Hadoop@localhost bin]$ ./Solr start -p 8984

Waiting up to 30 seconds to see Solr running on port 8984 [-]
Started Solr server on port 8984 (pid = 10137). Happy searching!

Stopping Solr

您可以使用 stop 命令停止 Solr。

$ ./Solr stop

如下所示命令会停止 Solr,并显示一条消息:

Sending stop command to Solr running on port 8983 ... waiting 5 seconds to
allow Jetty process 6035 to stop gracefully.

Restarting Solr

Solr 的 restart 命令会让 Solr 停止运行 5 秒,然后自动再次启动。你可以使用以下命令重启 Solr:

./Solr restart

如下所示命令会重启 Solr,并显示以下消息:

Sending stop command to Solr running on port 8983 ... waiting 5 seconds to
allow Jetty process 6671 to stop gracefully.
Waiting up to 30 seconds to see Solr running on port 8983 [|]  [/]
Started Solr server on port 8983 (pid = 6906). Happy searching!

Solr ─ help Command

可以通过 Solr 的 help 命令检查 Solr 提示符及其选项被使用的状况。

[Hadoop@localhost bin]$ ./Solr -help

Usage: Solr COMMAND OPTIONS
   where COMMAND is one of: start, stop, restart, status, healthcheck,
create, create_core, create_collection, delete, version, zk
Standalone server example (start Solr running in the background on port 8984):
   ./Solr start -p 8984
SolrCloud example (start Solr running in SolrCloud mode using localhost:2181
to connect to Zookeeper, with 1g max heap size and remote Java debug options enabled):
   ./Solr start -c -m 1g -z localhost:2181 -a "-Xdebug -
   Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 1044"
Pass -help after any COMMAND to see command-specific usage information,
such as: ./Solr start -help or ./Solr stop -help

Solr ─ status Command

可以通过 Solr 的 status 命令搜索和找出你的计算机上正在运行的 Solr 实例。该命令可以提供 Solr 实例的相关信息,例如它的版本、内存使用情况等。

你可以使用状态命令,如下所示,检查 Solr 实例的状态:

[Hadoop@localhost bin]$ ./Solr status

在执行该命令后,它会如下所示显示 Solr 的状态:

Found 1 Solr nodes:

Solr process 6906 running on port 8983 {
   "Solr_home":"/home/Hadoop/Solr/server/Solr",
   "version":"6.2.0 764d0f19151dbff6f5fcd9fc4b2682cf934590c5 -
   mike - 2016-08-20 05:41:37",
   "startTime":"2016-09-20T06:00:02.877Z",
   "uptime":"0 days, 0 hours, 5 minutes, 14 seconds",
   "memory":"30.6 MB (%6.2) of 490.7 MB"
}

Solr Admin

在启动 Apache Solr 后,你可以使用以下 URL 访问 Solr web interface 主页。

Localhost:8983/Solr/

Solr Admin 的界面如下所示:

interface admin

Apache Solr - Core

Solr Core 是一个运行的 Lucene 索引实例,包含使用该索引所需的所有 Solr 配置文件。我们需要创建 Solr Core 来执行诸如索引和分析之类的操作。

Solr 应用程序可能包含一个或多个核心。如果需要,一个 Solr 应用程序中的两个核心可以相互通信。

Creating a Core

在安装并启动 Solr 之后, 就可以连接到 Solr 的客户端(Web 界面)。

create core

如下图所示,Apache Solr 中最初并没有核心。现在我们来看看如何创建 Solr 中的核心。

Using create command

创建核心的方法之一是使用 create 命令创建 schema-less core ,如下所示:

[Hadoop@localhost bin]$ ./Solr create -c Solr_sample

在这里,我们尝试在 Apache Solr 中创建一个名为 Solr_sample 的核心。此命令创建一个核心,并显示以下消息。

Copying configuration to new core instance directory:
/home/Hadoop/Solr/server/Solr/Solr_sample

Creating new core 'Solr_sample' using command:
http://localhost:8983/Solr/admin/cores?action=CREATE&name=Solr_sample&instanceD
ir = Solr_sample {
   "responseHeader":{
      "status":0,
      "QTime":11550
   },
   "core":"Solr_sample"
}

你可以在 Solr 中创建多个核心。在 Solr Admin 的左侧,你可以看到一个 core selector ,你可以在其中选择新创建的核心,如下面截图所示。

core selector

Using create_core command

或者,你也可以使用 create_core 命令创建一个核心。此命令有以下选项:

–c core_name

你想要创建的核心名称

-p port_name

你想要为核心创建的端口

-d conf_dir

端口的配置目录

让我们来看看如何使用 create_core 命令。在此,我们将尝试创建一个名为 my_core 的核。

[Hadoop@localhost bin]$ ./Solr create_core -c my_core

执行时,上述命令创建一个核,显示以下消息:

Copying configuration to new core instance directory:
/home/Hadoop/Solr/server/Solr/my_core

Creating new core 'my_core' using command:
http://localhost:8983/Solr/admin/cores?action=CREATE&name=my_core&instanceD
ir = my_core {
   "responseHeader":{
      "status":0,
      "QTime":1346
   },
   "core":"my_core"
}

Deleting a Core

可以使用 Apache Solr 的删除 core 的 delete 命令。我们假设 Solr 中有一个名为 my_core 的核,如下面的屏幕截图所示。

delete core

可以使用 delete 命令删除此核,方法是将核的名称传递给此命令,如下所示:

[Hadoop@localhost bin]$ ./Solr delete -c my_core

执行上述命令后,将删除指定的核,并显示以下消息。

Deleting core 'my_core' using command:
http://localhost:8983/Solr/admin/cores?action=UNLOAD&core = my_core&deleteIndex
   = true&deleteDataDir = true&deleteInstanceDir = true  {

   "responseHeader" :{
      "status":0,
      "QTime":170
   }
}

可以打开 Solr 的 Web 界面来验证是否已删除核。

web interface

Apache Solr - Indexing Data

通常, indexing 是文档或(其他实体)的系统性排列。索引使用户能够在文档中找到信息。

  1. 索引收集、解析和存储文档。

  2. 进行索引是为了在查找所需文档时提高搜索查询的速度和性能。

Indexing in Apache Solr

在 Apache Solr 中,我们可以索引(添加、删除、修改)各种文档格式,例如 xml、csv、pdf 等。可以通过多种方式将数据添加到 Solr 索引。

在本章中,我们将讨论索引:

  1. 使用 Solr Web 界面。

  2. 使用任何客户端 API,例如 Java、Python 等。

  3. Using the post tool.

在本章中,我们将讨论如何使用各种界面(命令行、Web 界面和 Java 客户端 API)将数据添加到 Apache Solr 的索引。

Adding Documents using Post Command

Solr 在其 bin/ 目录中有一个 post 命令。使用此命令,可以在 Apache Solr 中索引各种格式的文件,如 JSON、XML、CSV。

浏览 Apache Solr 的 bin 目录并执行 post 命令的 –h option ,如下面的代码块所示。

[Hadoop@localhost bin]$ cd $SOLR_HOME
[Hadoop@localhost bin]$ ./post -h

执行上述命令后,将获得 post command 的选项列表,如下所示。

Usage: post -c <collection> [OPTIONS] <files|directories|urls|-d [".."]>
or post –help
   collection name defaults to DEFAULT_SOLR_COLLECTION if not specified
OPTIONS
=======
Solr options:
   -url <base Solr update URL> (overrides collection, host, and port)
   -host <host> (default: localhost)
   -p or -port <port> (default: 8983)
   -commit yes|no (default: yes)

Web crawl options:
   -recursive <depth> (default: 1)
   -delay <seconds> (default: 10)

Directory crawl options:
   -delay <seconds> (default: 0)

stdin/args options:
   -type <content/type> (default: application/xml)

Other options:
   -filetypes <type>[,<type>,...] (default:
   xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,
   rtf,htm,html,txt,log)
   -params "<key> = <value>[&<key> = <value>...]" (values must be
   URL-encoded; these pass through to Solr update request)
   -out yes|no (default: no; yes outputs Solr response to console)
   -format Solr (sends application/json content as Solr commands
   to /update instead of /update/json/docs)

Examples:
* JSON file:./post -c wizbang events.json
* XML files: ./post -c records article*.xml
* CSV file: ./post -c signals LATEST-signals.csv
* Directory of files: ./post -c myfiles ~/Documents
* Web crawl: ./post -c gettingstarted http://lucene.apache.org/Solr -recursive 1 -delay 1
* Standard input (stdin): echo '{commit: {}}' | ./post -c my_collection -
type application/json -out yes –d
* Data as string: ./post -c signals -type text/csv -out yes -d $'id,value\n1,0.47'

Example

假设我们有一个名为 sample.csv 的文件,其内容如下(在 bin 目录中)。

Student ID

First Name

Lasst Name

Phone

City

001

Rajiv

Reddy

9848022337

Hyderabad

002

Siddharth

Bhattacharya

9848022338

Kolkata

003

Rajesh

Khanna

9848022339

Delhi

004

Preethi

Agarwal

9848022330

Pune

005

Trupthi

Mohanty

9848022336

Bhubaneshwar

006

Archana

Mishra

9848022335

Chennai

上方的数据集包含个人详细信息,例如学生 ID、名字、姓氏、电话和城市。该数据集的 CSV 文件显示在下方。在这里,您必须注意需要将架构连同第一行一起说明。

id,    first_name,   last_name,   phone_no,      location
001,   Pruthvi,      Reddy,       9848022337,    Hyderabad
002,   kasyap,       Sastry,      9848022338,    Vishakapatnam
003,   Rajesh,       Khanna,      9848022339,    Delhi
004,   Preethi,      Agarwal,     9848022330,    Pune
005,   Trupthi,      Mohanty,     9848022336,    Bhubaneshwar
006,   Archana,      Mishra,      9848022335,    Chennai

您可以使用 post 命令按 sample_Solr 命名核心下的此数据索引,如下所示 -

[Hadoop@localhost bin]$ ./post -c Solr_sample sample.csv

在执行上述命令之后,已在指定的核心下对给定文档进行索引,生成以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar -Dauto = yes -Dc = Solr_sample -Ddata = files
org.apache.Solr.util.SimplePostTool sample.csv
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/Solr_sample/update...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,
htm,html,txt,log
POSTing file sample.csv (text/csv) to [base]
1 files indexed.
COMMITting Solr index changes to
http://localhost:8983/Solr/Solr_sample/update...
Time spent: 0:00:00.228

使用以下 URL 访问 Solr Web UI 主页 -

选择核心 Solr_sample 。默认情况下,请求处理程序为 /select ,查询为 “:”。无需进行任何修改,请单击页面底部的 ExecuteQuery 按钮。

solr sample

在执行此查询后,可以看到已编入索引的 CSV 文档的内容(默认格式为 JSON),如下面的屏幕截图所示。

csv document

Note − 同样,您可以索引其他文件格式,例如 JSON、XML、CSV 等。

Adding Documents using the Solr Web Interface

您还可以使用 Solr 提供的 Web 界面索引文档。我们来看看如何索引以下 JSON 文档。

[
   {
      "id" : "001",
      "name" : "Ram",
      "age" : 53,
      "Designation" : "Manager",
      "Location" : "Hyderabad",
   },
   {
      "id" : "002",
      "name" : "Robert",
      "age" : 43,
      "Designation" : "SR.Programmer",
      "Location" : "Chennai",
   },
   {
      "id" : "003",
      "name" : "Rahim",
      "age" : 25,
      "Designation" : "JR.Programmer",
      "Location" : "Delhi",
   }
]

Step 1

使用以下 URL 打开 Solr Web 界面 -

Step 2

选择核心 Solr_sample 。默认情况下,“请求处理程序”、“通用范围”、“覆盖”和“提升”字段的值分别为 /update、1000、true 和 1.0,如下面的屏幕截图所示。

request handler

现在,从 JSON、CSV、XML 等文件中选择所需的文档格式。在文本区域中键入要编入索引的文档,然后单击 “ Submit Document ” 按钮,如下面的屏幕截图所示。

submit document

Adding Documents using Java Client API

以下是将文档添加到 Apache Solr 索引的 Java 程序。将此代码保存在文件 AddingDocument.java 中。

import java.io.IOException;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.common.SolrInputDocument;

public class AddingDocument {
   public static void main(String args[]) throws Exception {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing the Solr document
      SolrInputDocument doc = new SolrInputDocument();

      //Adding fields to the document
      doc.addField("id", "003");
      doc.addField("name", "Rajaman");
      doc.addField("age","34");
      doc.addField("addr","vishakapatnam");

      //Adding the document to Solr
      Solr.add(doc);

      //Saving the changes
      Solr.commit();
      System.out.println("Documents added");
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac AddingDocument
[Hadoop@localhost bin]$ java AddingDocument

执行以上命令,您将获得以下输出。

Documents added

Apache Solr - Adding Documents (XML)

在前面的章节中,我们解释了如何将数据添加到 JSON 和 .CSV 文件格式的 Solr 中。在本章中,我们将演示如何使用 XML 文档格式将数据添加到 Apache Solr 索引。

Sample Data

假设我们需要使用 XML 文件格式将以下数据添加到 Solr 索引。

Student ID

First Name

Last Name

Phone

City

001

Rajiv

Reddy

9848022337

Hyderabad

002

Siddharth

Bhattacharya

9848022338

Kolkata

003

Rajesh

Khanna

9848022339

Delhi

004

Preethi

Agarwal

9848022330

Pune

005

Trupthi

Mohanty

9848022336

Bhubaneshwar

006

Archana

Mishra

9848022335

Chennai

Adding Documents Using XML

要将上述数据添加到 Solr 索引中,我们需要准备一个 XML 文档,如下所示。将此文档保存在文件 sample.xml 中。

<add>
   <doc>
      <field name = "id">001</field>
      <field name = "first name">Rajiv</field>
      <field name = "last name">Reddy</field>
      <field name = "phone">9848022337</field>
      <field name = "city">Hyderabad</field>
   </doc>
   <doc>
      <field name = "id">002</field>
      <field name = "first name">Siddarth</field>
      <field name = "last name">Battacharya</field>
      <field name = "phone">9848022338</field>
      <field name = "city">Kolkata</field>
   </doc>
   <doc>
      <field name = "id">003</field>
      <field name = "first name">Rajesh</field>
      <field name = "last name">Khanna</field>
      <field name = "phone">9848022339</field>
      <field name = "city">Delhi</field>
   </doc>
   <doc>
      <field name = "id">004</field>
      <field name = "first name">Preethi</field>
      <field name = "last name">Agarwal</field>
      <field name = "phone">9848022330</field>
      <field name = "city">Pune</field>
   </doc>
   <doc>
      <field name = "id">005</field>
      <field name = "first name">Trupthi</field>
      <field name = "last name">Mohanthy</field>
      <field name = "phone">9848022336</field>
      <field name = "city">Bhuwaeshwar</field>
   </doc>
   <doc>
      <field name = "id">006</field>
      <field name = "first name">Archana</field>
      <field name = "last name">Mishra</field>
      <field name = "phone">9848022335</field>
      <field name = "city">Chennai</field>
   </doc>
</add>

正如您所见,编写入 XML 文件以添加到索引中的数据包含三个重要的标记,即 <add> </add>、<doc></doc> 和 < field >< /field >。

  1. add − 这是要添加到索引中的文档的根标记。它包含至少一个要添加的文档。

  2. doc − 我们添加的文档应该包含在 <doc></doc> 标记中。此文档以字段的形式包含数据。

  3. field − 字段标记包含文档字段的名称和值。

准备文档后,可以使用上一章讨论的任何方式将该文档添加到索引中。

假设 XML 文件存在于 Solr 的 bin 目录中,并且要在名为 my_core 的内核中对其编制索引,那么可以使用 post 工具将其添加到 Solr 索引中,如下所示 −

[Hadoop@localhost bin]$ ./post -c my_core sample.xml

执行以上命令,您将获得以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-
core6.2.0.jar -Dauto = yes -Dc = my_core -Ddata = files
org.apache.Solr.util.SimplePostTool sample.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/my_core/update...
Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,
xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file sample.xml (application/xml) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/Solr/my_core/update...
Time spent: 0:00:00.201

Verification

访问 Apache Solr Web 界面主页并选择内核 my_core 。尝试通过在文本区域 q 中传递查询“:”来检索所有文档并执行查询。在执行时,你可以观察到所需的数据已添加到 Solr 索引中。

solr index

Apache Solr - Updating Data

Updating the Document Using XML

以下是用来更新现有文档中的字段的 XML 文件。将其另存为文件,文件名 update.xml

<add>
   <doc>
      <field name = "id">001</field>
      <field name = "first name" update = "set">Raj</field>
      <field name = "last name" update = "add">Malhotra</field>
      <field name = "phone" update = "add">9000000000</field>
      <field name = "city" update = "add">Delhi</field>
   </doc>
</add>

正如你所观察到的,用来更新数据的 XML 文件就像我们用来添加文档的文件。但唯一的区别是我们使用字段的 update 属性。

在我们的示例中,我们使用上面的文档并尝试使用 ID 001 来更新文档中的字段。

假设 XML 文档存在于 Solr 的 bin 目录中。由于我们正在更新存在于名为 my_core 的内核中的索引,因此可以使用以下 post 工具进行更新 −

[Hadoop@localhost bin]$ ./post -c my_core update.xml

执行以上命令,您将获得以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar -Dauto = yes -Dc = my_core -Ddata = files
org.apache.Solr.util.SimplePostTool update.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/my_core/update...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,
htm,html,txt,log
POSTing file update.xml (application/xml) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/Solr/my_core/update...
Time spent: 0:00:00.159

Verification

访问 Apache Solr Web 界面主页并将内核选为 my_core 。尝试通过在文本区域 q 中传递查询“:”来检索所有文档并执行查询。在执行时,你可以观察到文档已更新。

execute query

Updating the Document Using Java (Client API)

以下是将文档添加到 Apache Solr 索引的 Java 程序。将此代码另存为文件,文件名 UpdatingDocument.java

import java.io.IOException;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.client.Solrj.request.UpdateRequest;
import org.apache.Solr.client.Solrj.response.UpdateResponse;
import org.apache.Solr.common.SolrInputDocument;

public class UpdatingDocument {
   public static void main(String args[]) throws SolrServerException, IOException {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing the Solr document
      SolrInputDocument doc = new SolrInputDocument();

      UpdateRequest updateRequest = new UpdateRequest();
      updateRequest.setAction( UpdateRequest.ACTION.COMMIT, false, false);
      SolrInputDocument myDocumentInstantlycommited = new SolrInputDocument();

      myDocumentInstantlycommited.addField("id", "002");
      myDocumentInstantlycommited.addField("name", "Rahman");
      myDocumentInstantlycommited.addField("age","27");
      myDocumentInstantlycommited.addField("addr","hyderabad");

      updateRequest.add( myDocumentInstantlycommited);
      UpdateResponse rsp = updateRequest.process(Solr);
      System.out.println("Documents Updated");
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac UpdatingDocument
[Hadoop@localhost bin]$ java UpdatingDocument

执行以上命令,您将获得以下输出。

Documents updated

Apache Solr - Deleting Documents

Deleting the Document

要从 Apache Solr 索引中删除文档,我们需要指定要在 <delete></delete> 标签之间删除的文档的 ID。

<delete>
   <id>003</id>
   <id>005</id>
   <id>004</id>
   <id>002</id>
</delete>

这里,此 XML 代码用来删除 ID 为 003005 的文档。将此代码另存为文件,文件名 delete.xml

如果你想从属于名为 my_core 的内核的索引中删除文档,那么你可以使用 post 工具发布 delete.xml 文件,如下所示。

[Hadoop@localhost bin]$ ./post -c my_core delete.xml

执行以上命令,您将获得以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar -Dauto = yes -Dc = my_core -Ddata = files
org.apache.Solr.util.SimplePostTool delete.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/my_core/update...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,
rtf,htm,html,txt,log
POSTing file delete.xml (application/xml) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/Solr/my_core/update...
Time spent: 0:00:00.179

Verification

访问 Apache Solr Web 界面主页并将内核选为 my_core 。尝试通过在文本区域 q 中传递查询“:”来检索所有文档并执行查询。在执行时,你可以观察到已删除指定的文档。

delete document

Deleting a Field

有时我们需要根据非 ID 字段来删除文档。例如,我们可能需要删除城市是 Chennai 的文档。

在这种情况下,你需要在 <query></query> 标记对内指定字段的名称和值。

<delete>
   <query>city:Chennai</query>
</delete>

将其另存为 delete_field.xml ,并使用 Solr 的 post 工具对名为 my_core 的内核执行删除操作。

[Hadoop@localhost bin]$ ./post -c my_core delete_field.xml

在执行上述命令后,会生成以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar -Dauto = yes -Dc = my_core -Ddata = files
org.apache.Solr.util.SimplePostTool delete_field.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/my_core/update...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,
rtf,htm,html,txt,log
POSTing file delete_field.xml (application/xml) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/Solr/my_core/update...
Time spent: 0:00:00.084

Verification

访问 Apache Solr Web 界面主页并将内核选为 my_core 。尝试通过在文本区域 q 中传递查询“:”来检索所有文档并执行查询。在执行时,你可以观察到包含指定字段值对的文档已删除。

value pair

Deleting All Documents

就像删除特定字段一样,如果你想从某个索引中删除所有文档,你只需要在 <query></query> 标记之间传递符号“:”,如下所示。

<delete>
   <query>*:*</query>
</delete>

将该文件另存为 delete_all.xml ,然后使用 Solr 的 post 工具针对名为 my_core 的核心执行删除操作。

[Hadoop@localhost bin]$ ./post -c my_core delete_all.xml

在执行上述命令后,会生成以下输出。

/home/Hadoop/java/bin/java -classpath /home/Hadoop/Solr/dist/Solr-core
6.2.0.jar -Dauto = yes -Dc = my_core -Ddata = files
org.apache.Solr.util.SimplePostTool deleteAll.xml
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/Solr/my_core/update...
Entering auto mode. File endings considered are
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,
htm,html,txt,log
POSTing file deleteAll.xml (application/xml) to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/Solr/my_core/update...
Time spent: 0:00:00.138

Verification

访问 Apache Solr Web 界面主页,然后选择核心为 my_core 。尝试在文本区域 q 中传递查询“:”来检索所有文档,然后执行该查询。在执行时,你可以观察到包含指定的字段值对的文档已被删除。

deleted value pair

Deleting all the documents using Java (Client API)

以下是将文档添加到 Apache Solr 索引的 Java 程序。将此代码另存为文件,文件名 UpdatingDocument.java

import java.io.IOException;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.common.SolrInputDocument;

public class DeletingAllDocuments {
   public static void main(String args[]) throws SolrServerException, IOException {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing the Solr document
      SolrInputDocument doc = new SolrInputDocument();

      //Deleting the documents from Solr
      Solr.deleteByQuery("*");

      //Saving the document
      Solr.commit();
      System.out.println("Documents deleted");
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac DeletingAllDocuments
[Hadoop@localhost bin]$ java DeletingAllDocuments

执行以上命令,您将获得以下输出。

Documents deleted

Apache Solr - Retrieving Data

在本章中,我们将讨论如何使用 Java Client API 检索数据。假设我们有一个名为 sample.csv 的 .csv 文档,其中包含如下内容。

001,9848022337,Hyderabad,Rajiv,Reddy
002,9848022338,Kolkata,Siddarth,Battacharya
003,9848022339,Delhi,Rajesh,Khanna

你可以使用 post 命令在名为 sample_Solr 的核心下索引此数据。

[Hadoop@localhost bin]$ ./post -c Solr_sample sample.csv

以下 Java 程序用于向 Apache Solr 索引中添加文档。将此代码保存到名为 RetrievingData.java 的文件中。

import java.io.IOException;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrQuery;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.client.Solrj.response.QueryResponse;
import org.apache.Solr.common.SolrDocumentList;

public class RetrievingData {
   public static void main(String args[]) throws SolrServerException, IOException  {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing Solr query
      SolrQuery query = new SolrQuery();
      query.setQuery("*:*");

      //Adding the field to be retrieved
      query.addField("*");

      //Executing the query
      QueryResponse queryResponse = Solr.query(query);

      //Storing the results of the query
      SolrDocumentList docs = queryResponse.getResults();
      System.out.println(docs);
      System.out.println(docs.get(0));
      System.out.println(docs.get(1));
      System.out.println(docs.get(2));

      //Saving the operations
      Solr.commit();
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac RetrievingData
[Hadoop@localhost bin]$ java RetrievingData

执行以上命令,您将获得以下输出。

{numFound = 3,start = 0,docs = [SolrDocument{id=001, phone = [9848022337],
city = [Hyderabad], first_name = [Rajiv], last_name = [Reddy],
_version_ = 1547262806014820352}, SolrDocument{id = 002, phone = [9848022338],
city = [Kolkata], first_name = [Siddarth], last_name = [Battacharya],

_version_ = 1547262806026354688}, SolrDocument{id = 003, phone = [9848022339],
city = [Delhi], first_name = [Rajesh], last_name = [Khanna],

_version_ = 1547262806029500416}]}

SolrDocument{id = 001, phone = [9848022337], city = [Hyderabad], first_name = [Rajiv],
last_name = [Reddy], _version_ = 1547262806014820352}

SolrDocument{id = 002, phone = [9848022338], city = [Kolkata], first_name = [Siddarth],
last_name = [Battacharya], _version_ = 1547262806026354688}

SolrDocument{id = 003, phone = [9848022339], city = [Delhi], first_name = [Rajesh],
last_name = [Khanna], _version_ = 1547262806029500416}

Apache Solr - Querying Data

除了存储数据外,Apache Solr 还提供了在需要的时候进行查询功能。Solr 提供了一些参数,我们可以使用这些参数来查询其中存储的数据。

在下表中,我们列出了 Apache Solr 中可用的各种查询参数。

Parameter

Description

q

这是 Apache Solr 的主要查询参数,文档按其与该参数中术语的相似度进行评分。

fq

此参数表示 Apache Solr 的筛选器查询,该查询将结果集限制为匹配此筛选器的文档。

start

start 参数表示第页结果的开始偏移,此参数的默认值为 0。

rows

此参数表示每页要检索的文档数。此参数的默认值为 10。

sort

此参数指定结果的排序依据,指定的字段以逗号分隔。

fl

此参数指定结果集中的每个文档要返回的字段列表。

wt

此参数表示要查看结果的响应编写器类型。

你可以将所有这些参数视作查询 Apache Solr 的选项。访问 Apache Solr 的主页。在该页面的左侧,单击“查询”选项。在这里,你可以看到查询参数的字段。

query parameter

Retrieving the Records

假设我们在名为 my_core 的核心中有 3 条记录。要从选定的核心检索特定记录,你需要传递特定文档字段的名称和值对。例如,如果你想用字段 id 的值检索记录,你需要传递字段的名称-值对,如下为 q 指定的参数值 Id:001 ,然后执行查询。

retrieving records

同样,你可以通过将 : 作为 q 参数的值传递来从索引中检索所有记录,如下面的屏幕截图所示。

retrieve all

Retrieving from the 2nd record

我们可以通过将 2 作为 start 参数的值传递来从第二条记录中检索记录,如下面的屏幕截图所示。

next record

Restricting the Number of Records

你可以通过在 rows 参数中指定一个值来限制记录数。例如,我们可以通过将 2 值传递给 rows 参数,将查询结果中的总记录数限制为 2,如下面的屏幕截图所示。

restricting

Response Writer Type

通过从参数 wt 提供的值中选择一个,你可以获取所需文档类型的响应。

response writer type

在上面的实例中,我们选择 .csv 格式获取响应。

List of the Fields

如果我们希望在结果文档中包含特定字段,我们需要将所需字段的列表(以逗号分隔)传递为属性 fl 的值。

在以下示例中,我们尝试检索字段 id, phone,first_name

list fields

Apache Solr - Faceting

Apache Solr 中的分层是指将搜索结果分类到各种类别中。在本章中,我们将讨论 Apache Solr 中提供的分层类型 −

  1. Query faceting − 返回当前搜索结果中同时匹配给定查询的文档数。

  2. Date faceting − 返回落入某个日期范围内的文档数。

分层命令被添加到任何正常 Solr 查询请求中,分层计数将在同一查询响应中返回。

Faceting Query Example

使用字段 faceting ,我们可以检索所有条目的计数,或者只是给定字段中的热门条目。

作为一个示例,让我们考虑以下包含有关各种图书的数据的 books.csv 文件。

id,cat,name,price,inStock,author,series_t,sequence_i,genre_s
0553573403,book,A Game of Thrones,5.99,true,George R.R. Martin,"A Song of Ice
and Fire",1,fantasy

0553579908,book,A Clash of Kings,10.99,true,George R.R. Martin,"A Song of Ice
and Fire",2,fantasy

055357342X,book,A Storm of Swords,7.99,true,George R.R. Martin,"A Song of Ice
and Fire",3,fantasy

0553293354,book,Foundation,7.99,true,Isaac Asimov,Foundation Novels,1,scifi
0812521390,book,The Black Company,4.99,false,Glen Cook,The Chronicles of The
Black Company,1,fantasy

0812550706,book,Ender's Game,6.99,true,Orson Scott Card,Ender,1,scifi
0441385532,book,Jhereg,7.95,false,Steven Brust,Vlad Taltos,1,fantasy
0380014300,book,Nine Princes In Amber,6.99,true,Roger Zelazny,the Chronicles of
Amber,1,fantasy

0805080481,book,The Book of Three,5.99,true,Lloyd Alexander,The Chronicles of
Prydain,1,fantasy

080508049X,book,The Black Cauldron,5.99,true,Lloyd Alexander,The Chronicles of
Prydain,2,fantasy

让我们使用 post 工具将此文件发布到 Apache Solr 中。

[Hadoop@localhost bin]$ ./post -c Solr_sample sample.csv

在执行上述命令后,给定的 .csv 文件中提到的所有文档将被上传到 Apache Solr 中。

让我们现在执行 author 字段上的分割查询,查询集合/核心 my_core 中的 0 行。

打开 Apache Solr 的 Web UI,在页面左侧选中 facet 复选框,如下面的屏幕截图所示。

checkbox

选中复选框后,您将有另外三个文本字段来传递细分搜索的参数。现在,作为查询的参数,传递以下值。

q = *:*, rows = 0, facet.field = author

最后,通过单击 Execute Query 按钮执行查询。

query pass

执行后,将生成以下结果。

author result

它基于作者对索引中的文档进行分类,并指定每个作者编著的图书数量。

Faceting Using Java Client API

以下是将文档添加到 Apache Solr 索引的 Java 程序。将此代码保存在名为 HitHighlighting.java 的文件中。

import java.io.IOException;
import java.util.List;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrQuery;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.client.Solrj.request.QueryRequest;
import org.apache.Solr.client.Solrj.response.FacetField;
import org.apache.Solr.client.Solrj.response.FacetField.Count;
import org.apache.Solr.client.Solrj.response.QueryResponse;
import org.apache.Solr.common.SolrInputDocument;

public class HitHighlighting {
   public static void main(String args[]) throws SolrServerException, IOException {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing the Solr document
      SolrInputDocument doc = new SolrInputDocument();

      //String query = request.query;
      SolrQuery query = new SolrQuery();

      //Setting the query string
      query.setQuery("*:*");

      //Setting the no.of rows
      query.setRows(0);

      //Adding the facet field
      query.addFacetField("author");

      //Creating the query request
      QueryRequest qryReq = new QueryRequest(query);

      //Creating the query response
      QueryResponse resp = qryReq.process(Solr);

      //Retrieving the response fields
      System.out.println(resp.getFacetFields());

      List<FacetField> facetFields = resp.getFacetFields();
      for (int i = 0; i > facetFields.size(); i++) {
         FacetField facetField = facetFields.get(i);
         List<Count> facetInfo = facetField.getValues();

         for (FacetField.Count facetInstance : facetInfo) {
            System.out.println(facetInstance.getName() + " : " +
               facetInstance.getCount() + " [drilldown qry:" +
               facetInstance.getAsFilterQuery());
         }
         System.out.println("Hello");
      }
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac HitHighlighting
[Hadoop@localhost bin]$ java HitHighlighting

执行以上命令,您将获得以下输出。

[author:[George R.R. Martin (3), Lloyd Alexander (2), Glen Cook (1), Isaac
Asimov (1), Orson Scott Card (1), Roger Zelazny (1), Steven Brust (1)]]