练习 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.xml
或 schema.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
,这是一个两分片集合,每个分片有两个副本。
管理员界面中的 云选项卡 很好的绘制了集合
索引 Techproducts 数据
您的 Solr 服务器已启动并正在运行,但它还没有任何数据,因此我们无法进行任何查询。
Solr 包含 bin/solr post
工具,以便于轻松地对各种类型的文档进行索引。我们将在下面的索引示例中使用此工具。
您需要一个命令 shell 来运行以下一些示例,这些示例根植于 Solr 安装目录中;从您启动 Solr 的 shell 就可以正常工作。
我们将索引的数据位于 example/exampledocs
目录中。这些文档采用多种文档格式(JSON、CSV 等),幸运的是,我们可以一次性对它们全部进行索引
$ bin/solr post -c techproducts example/exampledocs/*
$ 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 格式的文档
管理员 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 控制脚本参考。