练习 1:索引 Techproducts 数据

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

在 SolrCloud 模式下启动 Solr

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

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

$ 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];这是默认的节点数。在此示例中,我们需要两个节点,因此您可以直接按 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 有两个开箱即用的示例配置文件集(称为配置集)。

一个集合必须有一个配置集 (configset),其中至少包括 Solr 的两个主要配置文件:模式文件(名为 managed-schema.xmlschema.xml)和 solrconfig.xml。这里的问题是你想从哪个配置集开始。 _default 是一个最基本的选项,但请注意,有一个配置集的名字包括 "techproducts",这与我们给集合起的名字相同。这个配置集是专门为支持我们想使用的示例数据而设计的,所以在提示符下输入 sample_techproducts_configs 并按 回车键

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

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

SolrCloud example running, please visit: https://127.0.0.1:8983/solr

恭喜! Solr 已经准备好接收数据了!

你可以在 Web 浏览器中启动 Solr 管理界面来查看 Solr 是否正在运行:https://127.0.0.1:8983/solr/。这是管理 Solr 的主要起点。

Solr 现在将运行两个“节点”,一个在端口 7574 上,另一个在端口 8983 上。会自动创建一个名为 techproducts 的集合,这是一个包含两个分片 (shard) 的集合,每个分片有两个副本 (replica)。

管理界面中的 云 (Cloud) 选项卡 可以很好地展示集合的图示

tutorial solrcloud
图 1. SolrCloud 图

索引 Techproducts 数据

你的 Solr 服务器已经启动并运行,但它还没有包含任何数据,所以我们无法进行任何查询。

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

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

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

$ bin/solr post -c techproducts example/exampledocs/*

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

Posting files to [base] url https://127.0.0.1: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 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]
20 files indexed.
COMMITting Solr index changes to https://127.0.0.1:8983/solr/techproducts/update...
Time spent: 0:00:00.822

再次恭喜你!你的 Solr 中已经有数据了!

现在我们准备开始搜索了。

基本搜索

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

Solr 管理界面在 techproducts 集合的 "查询" 选项卡中包含一个查询构建器界面(位于 https://127.0.0.1:8983/solr/#/techproducts/query)。如果你单击 执行查询 按钮而不更改表单中的任何内容,你将获得 10 个 JSON 格式的文档

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

管理界面发送到 Solr 的 URL 显示在上述屏幕截图的右上角,呈浅灰色。如果你单击它,你的浏览器将显示原始响应。

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

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

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

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

搜索单个词项

要搜索词项,请将其作为 q 参数值输入到 Solr 管理界面的 "查询" 屏幕中,将 *:* 替换为你想要查找的词项。

输入 "foundation" 并再次单击 执行查询

如果你更喜欢 curl,则输入如下内容

$ curl "https://127.0.0.1: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 参数,该参数采用逗号分隔的字段名称列表。这是管理界面中查询表单上可用的字段之一。

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

$ curl "https://127.0.0.1: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 字段(表示“类别”)。如果我们仅将搜索限制为类别为“electronics”的文档,则结果对于我们的用户而言将更加精确。

在管理界面的 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 "https://127.0.0.1:8983/solr/techproducts/select?q=cat:electronics"

要搜索多词短语,请将其用双引号引起来:q="此处有多个词项"。例如,在管理界面的 q 框中输入带引号的短语“CAS latency”来搜索该短语。

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

$ curl "https://127.0.0.1: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”的文档,请在 q 框中输入 +electronics +music

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

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

你应该只会获得一个结果。

要搜索包含词项“electronics”但包含词项“music”的文档,请在管理界面的 q 框中输入 electronics -music。对于 curl,同样,将 URL 中的 ` 编码为 %2B,如下所示

$ curl "https://127.0.0.1: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 控制脚本参考