练习 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.xml
或 schema.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) 选项卡 可以很好地展示集合的图示
索引 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 的 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 控制脚本参考。