练习 1:索引 Techproducts 数据

本练习将指导您如何将 Solr 作为双节点群集启动(同一台机器上的两个节点),并在启动期间创建集合。然后,您将索引 Solr 附带的一些示例数据,并执行一些基本搜索。

在 SolrCloud 模式下启动 Solr

要启动 Solr,请运行:在 Unix 或 MacOS 上运行 bin/solr start -e cloud;在 Windows 上运行 bin\solr.cmd start -e cloud

这将启动一个交互式会话,该会话将在您的机器上启动两个 Solr“服务器”。此命令有一个选项,可以在不提示您输入的情况下运行 (-noprompt),但我们希望修改两个默认值,因此现在不会使用该选项。

$ bin/solr start -e cloud

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]:

第一个提示询问我们希望运行多少个节点。请注意最后一行末尾的 [2];这是默认节点数。对于此示例,我们希望为 2,因此您可以简单地按 enter

Ok, let's start up 2 Solr nodes for your example SolrCloud cluster.
Please enter the port for node1 [8983]:

这将是第一个节点运行的端口。除非您知道您的机器上端口 8983 上运行着其他内容,否则也通过按 enter 接受此默认选项。如果该端口已被使用,系统将要求您选择其他端口。

Please enter the port for node2 [7574]:

这是第二个节点将运行的端口。同样,除非您知道您的机器上端口 7574 上运行着其他内容,否则也通过按 enter 接受此默认选项。如果该端口已被使用,系统将要求您选择其他端口。

Solr 现在将初始化自身,并开始在这两个节点上运行。该脚本将打印它用于您参考的命令。

Starting up 2 Solr nodes for your example SolrCloud cluster.

Creating Solr home directory /solr-{solr-full-version}/example/cloud/node1/solr
Cloning /solr-{solr-full-version}/example/cloud/node1 into
   /solr-{solr-full-version}/example/cloud/node2

Starting up Solr on port 8983 using command:
"bin/solr" start -cloud -p 8983 -s "example/cloud/node1/solr"

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


Starting up Solr on port 7574 using command:
"bin/solr" start -cloud -p 7574 -s "example/cloud/node2/solr" -z localhost:9983

Waiting up to 180 seconds to see Solr running on port 7574 [\]
Started Solr server on port 7574 (pid=35036). Happy searching!

INFO  - 2017-07-27 12:28:02.835; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 ready

请注意,两个 Solr 实例已在两个节点上启动。由于我们在 SolrCloud 模式下启动,并且没有定义有关外部 ZooKeeper 群集的任何详细信息,因此 Solr 会启动自己的 ZooKeeper 并将两个节点连接到它。

启动完成后,系统会提示您创建一个集合,用于对数据进行索引。

Now let's create a new collection for indexing documents in your 2-node cluster.
Please provide a name for your new collection: [gettingstarted]

这是我们首次偏离默认选项。本教程将要求您对 Solr 中包含的一些示例数据(称为“techproducts”数据)进行索引。我们将其集合命名为“techproducts”,以便于与我们稍后创建的其他集合区分开来。在提示符处输入 techproducts,然后按 enter

How many shards would you like to split techproducts into? [2]

此提示询问您希望将索引拆分为多少个 分片,并将其分布在两个节点上。选择“2”(默认值)表示我们将相对均匀地将索引拆分到两个节点上,这是一个不错的开始方式。按 enter 接受默认值。

How many replicas per shard would you like to create? [2]

副本是索引的副本,用于故障转移(另请参阅 Solr 词汇表定义)。同样,此处也可以先接受默认值“2”,因此按 enter 接受默认值。

Please choose a configuration for the techproducts collection, available options are:
_default or sample_techproducts_configs [_default]

我们已经到了另一个偏离默认选项的地方。Solr 提供了两个开箱即用的示例配置文件集(称为配置集)。

集合必须有一个配置集,该配置集至少包含 Solr 的两个主要配置文件:架构文件(名为 managed-schema.xmlschema.xml)和 solrconfig.xml。此处的问题是您希望从哪个配置集开始。_default 是一个精简选项,但请注意,有一个配置集的名称包含“techproducts”,与我们为集合命名的名称相同。此配置集专门设计为支持我们想要使用的示例数据,因此在提示符处输入 sample_techproducts_configs,然后按 enter

此时,Solr 将创建集合,并再次在屏幕上输出其发出的命令。

Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set 'techproducts'

SolrCloud example running, please visit: http://localhost:8983/solr

恭喜!Solr 已准备好处理数据!

您可以通过在 Web 浏览器中启动 Solr 管理员界面来查看 Solr 是否正在运行:http://localhost:8983/solr/。这是管理 Solr 的主要起点。

Solr 现在将运行两个“节点”,一个在端口 7574 上,另一个在端口 8983 上。自动创建了一个集合 techproducts,这是一个两分片集合,每个分片有两个副本。

管理员界面中的 云选项卡 很好的绘制了集合

tutorial solrcloud
图 1. SolrCloud 图表

索引 Techproducts 数据

您的 Solr 服务器已启动并正在运行,但它还没有任何数据,因此我们无法进行任何查询。

Solr 包含 bin/solr post 工具,以便于轻松地对各种类型的文档进行索引。我们将在下面的索引示例中使用此工具。

您需要一个命令 shell 来运行以下一些示例,这些示例根植于 Solr 安装目录中;从您启动 Solr 的 shell 就可以正常工作。

我们将索引的数据位于 example/exampledocs 目录中。这些文档采用多种文档格式(JSON、CSV 等),幸运的是,我们可以一次性对它们全部进行索引

Linux/Mac
$ bin/solr post -c techproducts example/exampledocs/*
Windows
$ java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar example\exampledocs\*

您应该会看到类似于以下内容的输出

SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/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 books.csv (text/csv) to [base]
POSTing file books.json (application/json) to [base]/json/docs
POSTing file gb18030-example.xml (application/xml) to [base]
POSTing file hd.xml (application/xml) to [base]
POSTing file ipod_other.xml (application/xml) to [base]
POSTing file ipod_video.xml (application/xml) to [base]
POSTing file manufacturers.xml (application/xml) to [base]
POSTing file mem.xml (application/xml) to [base]
POSTing file money.xml (application/xml) to [base]
POSTing file monitor.xml (application/xml) to [base]
POSTing file monitor2.xml (application/xml) to [base]
POSTing file more_books.jsonl (application/json) to [base]/json/docs
POSTing file mp500.xml (application/xml) to [base]
POSTing file post.jar (application/octet-stream) to [base]/extract
POSTing file sample.html (text/html) to [base]/extract
POSTing file sd500.xml (application/xml) to [base]
POSTing file solr-word.pdf (application/pdf) to [base]/extract
POSTing file solr.xml (application/xml) to [base]
POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
POSTing file utf8-example.xml (application/xml) to [base]
POSTing file vidcard.xml (application/xml) to [base]
21 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:00.822

再次恭喜!您的 Solr 中有数据了!

现在我们可以开始搜索了。

基本搜索

可以通过 REST 客户端、curl、wget、Chrome POSTMAN 等以及适用于多种编程语言的本机客户端对 Solr 进行查询。

Solr 管理员 UI 包含一个查询生成器界面,可通过 techproducts 集合的“查询”选项卡访问(网址:http://localhost:8983/solr/#/techproducts/query)。如果您点击 执行查询 按钮,而不更改表单中的任何内容,您将获得 10 个 JSON 格式的文档

Solr Quick Start: techproducts Query screen with results
图 2. 查询屏幕

管理员 UI 发送到 Solr 的 URL 显示在上述屏幕截图右上角的浅灰色区域中。如果您点击它,浏览器将显示原始响应。

要使用 curl,请在命令行中用引号引起来输入浏览器中显示的相同 URL

$ curl "http://localhost:8983/solr/techproducts/select?indent=on&q=*:*"

这里发生的情况是,我们正在使用 Solr 的查询参数 (q) 和一个特殊语法,该语法请求索引中的所有文档 (*:*)。但是,由于名为 rows 的参数的默认值,所有文档都不会返回给我们,您可以在表单中看到该值是 10。如果您愿意,可以在 UI 或默认值中更改该参数。

Solr 具有非常强大的搜索选项,本教程无法涵盖所有选项。但我们可以介绍一些最常见的查询类型。

搜索单个术语

要搜索术语,请在 Solr 管理员 UI 查询屏幕中将其输入为 q 参数值,用您要查找的术语替换 *:*

输入“foundation”,然后再次点击 执行查询

如果您更喜欢 curl,请输入类似以下内容

$ curl "http://localhost:8983/solr/techproducts/select?q=foundation"

您将看到类似以下内容

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":8,
    "params":{
      "q":"foundation"}},
  "response":{"numFound":4,"start":0,"maxScore":2.7879646,"docs":[
      {
        "id":"0553293354",
        "cat":["book"],
        "name":"Foundation",
        "price":7.99,
        "price_c":"7.99,USD",
        "inStock":true,
        "author":"Isaac Asimov",
        "author_s":"Isaac Asimov",
        "series_t":"Foundation Novels",
        "sequence_i":1,
        "genre_s":"scifi",
        "_version_":1574100232473411586,
        "price_c____l_ns":799}]
}}

响应表明有 4 个命中("numFound":4)。我们仅在上述示例输出中包含了一个文档,但由于 4 个命中低于要返回的 rows 参数的默认值 10,因此您应该看到全部 4 个命中。

注意文档之前的 responseHeader。此标头将包含您为搜索设置的参数。默认情况下,它仅显示您为该查询设置的参数,在本例中仅为您的查询词。

我们返回的文档包括每个已编入索引文档的所有字段。同样,这是默认行为。如果您想限制响应中的字段,可以使用 fl 参数,该参数采用逗号分隔的字段名称列表。这是管理 UI 中查询表单上可用的字段之一。

在 "fl" 框中输入 "id"(不带引号),然后再次点击 执行查询。或者,使用 curl 指定它

$ curl "http://localhost:8983/solr/techproducts/select?q=foundation&fl=id"

您应该只看到返回的匹配记录的 ID。

字段搜索

所有 Solr 查询都使用某个字段查找文档。通常,您希望同时跨多个字段进行查询,而这是我们迄今为止使用 "foundation" 查询所做的。这可以通过使用复制字段来实现,这些字段已使用这组配置进行设置。我们将在 练习 2 中详细介绍复制字段。

不过,有时您希望将查询限制为单个字段。这可以使您的查询更高效,并为用户提供更相关的结果。

我们的小型样本数据集中的大部分数据都与产品相关。假设我们希望在索引中查找所有 "electronics" 产品。在查询屏幕中,在 q 框中输入 "electronics"(不带引号),然后点击 执行查询。您应该得到 14 个结果,例如

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"electronics"}},
  "response":{"numFound":14,"start":0,"maxScore":1.5579545,"docs":[
      {
        "id":"IW-02",
        "name":"iPod & iPod Mini USB 2.0 Cable",
        "manu":"Belkin",
        "manu_id_s":"belkin",
        "cat":["electronics",
          "connector"],
        "features":["car power adapter for iPod, white"],
        "weight":2.0,
        "price":11.5,
        "price_c":"11.50,USD",
        "popularity":1,
        "inStock":false,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-14T23:55:59Z",
        "_version_":1574100232554151936,
        "price_c____l_ns":1150}]
}}

此搜索将查找已编入索引字段中任何位置都包含术语 "electronics" 的所有文档。但是,我们可以从上面看到有一个 cat 字段(表示 "category")。如果我们仅将搜索限制为类别为 "electronics" 的文档,则结果对我们的用户来说将更加准确。

在管理 UI 的 q 字段中更新您的查询,使其变为 cat:electronics。现在,您将获得 12 个结果

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":6,
    "params":{
      "q":"cat:electronics"}},
  "response":{"numFound":12,"start":0,"maxScore":0.9614112,"docs":[
      {
        "id":"SP2514N",
        "name":"Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133",
        "manu":"Samsung Electronics Co. Ltd.",
        "manu_id_s":"samsung",
        "cat":["electronics",
          "hard drive"],
        "features":["7200RPM, 8MB cache, IDE Ultra ATA-133",
          "NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor"],
        "price":92.0,
        "price_c":"92.0,USD",
        "popularity":6,
        "inStock":true,
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "store":"35.0752,-97.032",
        "_version_":1574100232511160320,
        "price_c____l_ns":9200}]
     }}

使用 curl,此查询将如下所示

curl "http://localhost:8983/solr/techproducts/select?q=cat:electronics"

要搜索多词组短语,请用双引号将其括起来:q="multiple terms here"。例如,通过在 Admin UI 中的 q 框中输入带引号的短语“CAS latency”来搜索“CAS latency”。

如果您使用 curl,请注意,URL 中的词组之间的空格必须转换为“+”,如下所示

$ curl "http://localhost:8983/solr/techproducts/select?q=\"CAS+latency\""

我们得到 2 个结果

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":7,
    "params":{
      "q":"\"CAS latency\""}},
  "response":{"numFound":2,"start":0,"maxScore":5.937691,"docs":[
      {
        "id":"VDBDB1A16",
        "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM",
        "manu":"A-DATA Technology Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 3,   2.7v"],
        "popularity":0,
        "inStock":true,
        "store":"45.18414,-93.88141",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|0.9 memory|0.1",
        "_version_":1574100232590852096},
      {
        "id":"TWINX2048-3200PRO",
        "name":"CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
        "manu":"Corsair Microsystems Inc.",
        "manu_id_s":"corsair",
        "cat":["electronics",
          "memory"],
        "features":["CAS latency 2,  2-3-3-6 timing, 2.75v, unbuffered, heat-spreader"],
        "price":185.0,
        "price_c":"185.00,USD",
        "popularity":5,
        "inStock":true,
        "store":"37.7752,-122.4232",
        "manufacturedate_dt":"2006-02-13T15:26:37Z",
        "payloads":"electronics|6.0 memory|3.0",
        "_version_":1574100232584560640,
        "price_c____l_ns":18500}]
  }}

合并搜索

默认情况下,当您在单个查询中搜索多个词组和/或短语时,Solr 只要求文档中存在其中一个词组或短语即可匹配。包含更多词组的文档将在结果列表中排在更靠前的位置。

您可以通过在词组或短语前加上 +(加号)来要求其存在;相反,要禁止词组或短语的存在,请在词组或短语前加上 -(减号)。

要查找同时包含“electronics”和“music”两个词组的文档,请在 Admin UI 查询选项卡中的 q 框中输入 +electronics +music

如果您使用 curl,您必须对 ` 字符进行编码,因为它在 URL 中有保留用途(对空格字符进行编码)。` 的编码为 %2B,如下所示

$ curl "http://localhost:8983/solr/techproducts/select?q=%2Belectronics%20%2Bmusic"

您应该只得到一个结果。

要搜索包含“electronics”词组但包含“music”词组的文档,请在 Admin UI 中的 q 框中输入 electronics -music`。对于 curl,同样,将 ` 作为 %2B 进行 URL 编码,如下所示

$ curl "http://localhost:8983/solr/techproducts/select?q=%2Belectronics+-music"

这次您得到 13 个结果。

有关搜索的更多信息

我们只介绍了 Solr 中可用的搜索选项的皮毛。有关更多 Solr 搜索选项,请参阅查询语法和解析器

练习 1 总结

在这一点上,您已经了解了 Solr 如何索引数据并进行了一些基本查询。您现在可以选择继续学习下一个示例,该示例将介绍更多 Solr 概念,例如分面结果和管理您的架构,或者您可以自己动手尝试。

如果您决定不继续本教程,我们到目前为止编制索引的数据对您来说可能价值不大。您可以删除您的安装并重新开始,或者您可以使用我们开始时使用的 bin/solr 脚本来删除此集合

$ bin/solr delete -c techproducts

然后创建一个新集合

$ bin/solr create -c <yourCollection> -s 2 -rf 2

要停止我们启动的两个 Solr 节点,请发出命令

$ bin/solr stop -all

有关 bin/solr 的启动/停止和集合选项的更多信息,请参阅Solr 控制脚本参考