解压Solr
首先解压缩Solr版本并将工作目录更改为安装Solr的子目录。例如,在UNIX,Cygwin或MacOS中使用shell:
~$ ls solr*solr-7.1.0.zip~$ unzip -q solr-7.1.0.zip~$ cd solr-7.1.0/
如果您想在进行第一个练习之前了解更多关于Solr的目录布局的信息,请参阅“ 目录布局 ”一节了解详细信息。
练习1:索引Techproducts示例数据
本练习将引导您如何启动Solr作为双节点群集(同一台计算机上的两个节点),并在启动过程中创建一个集合。然后,您将索引Solr附带的一些示例数据并进行一些基本搜索。
在SolrCloud模式下启动Solr
要启动Solr,请bin/solr start -e cloud
在Unix或MacOS上运行:bin\solr.cmd start -e cloud
在Windows上。
这将启动一个交互式会话,在您的机器上启动两个Solr“服务器”。这个命令有一个选项可以在不提示输入(-noprompt
)的情况下运行,但是我们要修改两个默认值,所以我们现在不会使用这个选项。
solr-7.1.0:$ ./bin/solr start -e cloudWelcome 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]:
这是第二个节点将运行的端口。再说一遍,除非你知道你的机器上有其他的东西在8983上运行,否则也可以按下来接受这个默认选项enter。如果有东西已经在使用该端口,则会要求您选择另一个端口。
Solr现在将自行初始化,并开始在这两个节点上运行。该脚本将打印它用来供您参考的命令。
Starting up 2 Solr nodes for your example SolrCloud cluster.Creating Solr home directory /solr-7.1.0/example/cloud/node1/solrCloning /solr-7.1.0/example/cloud/node1 into /solr-7.1.0/example/cloud/node2Starting 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:9983Waiting 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)。
一个集合必须有一个configSet,它至少包含Solr的两个主要配置文件:模式文件(命名为managed-schema
or或schema.xml
)和solrconfig.xml
。这里的问题是你想从哪个configSet开始。这_default
是一个简单的选择,但请注意,有一个名称中包含“techproducts”,就像我们命名我们的收藏一样。这个configSet是专门为支持我们想要使用的示例数据而设计的,所以sample_techproducts_configs
在提示符下输入并点击enter。
在这一点上,Solr将创建集合,并再次向屏幕输出它发出的命令。
Uploading /solr-7.1.0/server/solr/configsets/_default/conf for config techproducts to ZooKeeper at localhost:9983Connecting to ZooKeeper at localhost:9983 ...INFO - 2017-07-27 12:48:59.289; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 readyUploading /solr-7.1.0/server/solr/configsets/sample_techproducts_configs/conf for config techproducts to ZooKeeper at localhost:9983Creating new collection ‘techproducts‘ using command:http://localhost:8983/solr/admin/collections?action=CREATE&name=techproducts&numShards=2&replicationFactor=2&maxShardsPerNode=2&collection.configName=techproducts{ "responseHeader":{ "status":0, "QTime":5460}, "success":{ "192.168.0.110:7574_solr":{ "responseHeader":{ "status":0, "QTime":4056}, "core":"techproducts_shard1_replica_n1"}, "192.168.0.110:8983_solr":{ "responseHeader":{ "status":0, "QTime":4056}, "core":"techproducts_shard2_replica_n2"}}}Enabling auto soft-commits with maxTime 3 secs using the Config APIPOSTing request to Config API: http://localhost:8983/solr/techproducts/config{"set-property":{"updateHandler.autoSoftCommit.maxTime":"3000"}}Successfully set-property updateHandler.autoSoftCommit.maxTime to 3000SolrCloud example running, please visit: http://localhost:8983/solr
恭喜!Solr准备好了数据!
您可以通过在Web浏览器中启动Solr Admin UI来看到Solr正在运行:http:// localhost:8983 / solr /。这是管理Solr的主要起点。
Solr现在将运行两个“节点”,一个在端口7574上,另一个在端口8983上。自动创建一个集合techproducts
,一个两个分片集合,每个集合有两个副本。
管理用户界面中的Cloud选项卡很好地显示了该集合:
索引技术产品数据
您的Solr服务器已启动并正在运行,但尚未包含任何数据,因此我们无法进行任何查询。
Solr包含该bin/post
工具以便于索引各种类型的文档。我们将在下面的索引示例中使用这个工具。
您将需要一个命令外壳程序来运行以下的一些示例,这些示例源于Solr安装目录; 从你推出的Solr的外壳工作得很好。
目前该bin/post 工具没有可比较的Windows脚本,但调用的底层Java程序可用。我们将在下面显示Windows示例,但是您也可以看到Post Tool文档的Windows部分以获取更多详细信息。 |
我们将索引的数据在example/exampledocs
目录中。这些文档混合使用了文档格式(JSON,CSV等),幸运的是,我们可以一次为它们编制索引:
solr-7.1.0:$ bin/post -c techproducts example/exampledocs/*
C:\solr-7.1.0> java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar example\exampledocs\*
您应该看到类似于以下内容的输出:
SimplePostTool version 5.0.0Posting 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,logPOSTing file books.csv (text/csv) to [base]POSTing file books.json (application/json) to [base]/json/docsPOSTing 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/docsPOSTing file mp500.xml (application/xml) to [base]POSTing file post.jar (application/octet-stream) to [base]/extractPOSTing file sample.html (text/html) to [base]/extractPOSTing file sd500.xml (application/xml) to [base]POSTing file solr-word.pdf (application/pdf) to [base]/extractPOSTing file solr.xml (application/xml) to [base]POSTing file test_utf8.sh (application/octet-stream) to [base]/extractPOSTing 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。
Solr Admin UI包含一个查询生成器界面,通过techproducts
集合的查询选项卡(位于http:// localhost:8983 / solr /#/ techproducts / query)。如果单击“ 执行查询”按钮而不更改表单中的任何内容,则会以JSON格式获得10个文档:
管理用户界面发送给Solr的URL在上面的屏幕截图的右上方以浅灰色显示。如果你点击它,你的浏览器会显示你的原始响应。
要使用curl,请使用命令行中的引号在浏览器中显示相同的URL:
curl "http://localhost:8983/solr/techproducts/select?indent=on&q=*:*"
这里发生的事情是,我们正在使用Solr的查询参数(q
)以特殊的语法来请求索引(*:*
)中的所有文档。所有的文件都不会返回给我们,但是,由于默认的参数调用rows
,你可以在表单中看到10
。您可以在UI中更改参数,或者根据需要更改默认值。
Solr有非常强大的搜索选项,本教程将无法涵盖所有??这些选项。但是我们可以涵盖一些最常见的查询类型。
搜索单个词条
要搜索一个术语,请q
在Solr管理界面查询屏幕中将其作为参数值输入,替换*:*
为要查找的术语。
输入“基础”,然后再次执行查询。
如果你喜欢卷曲,请输入这样的内容:
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
param,它使用逗号分隔的字段名称列表。这是管理界面中查询表单上的可用字段之一。
在“fl”框中输入“id”(不含引号),然后再次执行查询。或者,用curl指定它:
curl "http://localhost:8983/solr/techproducts/select?q=foundation&fl=id"
您应该只能看到返回的匹配记录的ID。
字段搜索
所有Solr查询使用某个字段查找文档。通常,您希望同时在多个字段中进行查询,而这正是我们迄今为止使用“基础”查询所做的。这可以通过使用已经在这组配置中设置的复制字段来实现。在练习2中我们将复制一些复制字段。
但是,有时候,您想要将查询限制在单个字段中。这可以使您的查询效率更高,结果更符合用户的需求。
我们的小样本数据集中的大部分数据都与产品有关。假设我们想要找到索引中的所有“电子”产品。在查询屏幕中,在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}]}}
此搜索查找索引字段中任何位置包含术语“电子”的所有文档。但从上面我们可以看到有一个cat
领域(“范畴”)。如果我们限制只搜索具有“电子”类别的文档,结果将会更精确。
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"
。例如,通过q
在管理UI中将该短语用引号输入到框中来搜索“CAS等待时间” 。
如果你跟随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
中的q
框中输入。
如果使用curl,则必须对+
字符进行编码,因为它在URL中具有保留的用途(对空格字符进行编码)。对于编码+
是%2B
如下所示:
curl "http://localhost:8983/solr/techproducts/select?q=%2Belectronics%20%2Bmusic"
你只应得到一个结果。
要搜索包含术语“电子”但不包含“音乐” 一词的文档,请在管理界面+electronics -music
的q
框中输入。对于curl,再一次,URL编码+
如下%2B
:
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控制脚本参考。
练习2:修改架构和索引影片数据
本练习将以最后一篇为基础,向您介绍索引模式和Solr强大的刻面功能。
重新启动Solr
最后一次练习之后你是否停止了Solr?没有?然后继续下一节。
如果你这样做,并且需要重新启动Solr,请发出以下命令:
./bin/solr start -c -p 8983 -s example/cloud/node1/solr
这启动了第一个节点。完成后,启动第二个节点,并告诉它如何连接到ZooKeeper:
./bin/solr start -c -p 7574 -s example/cloud/node2/solr -z localhost:9983
创建一个新的集合
我们将在这个练习中使用一个全新的数据集,所以最好有一个新的集合,而不是试图重用我们以前的集合。
其中一个原因是我们将在Solr中使用一个名为“字段猜测”的特性,在这个特性中,Solr试图猜测索引它时字段中的数据是什么类型的。它还会自动在模式中为出现在传入文档中的新字段创建新字段。这种模式被称为“无模式”。我们将看到这种方法的好处和局限性,以帮助您决定在实际应用中如何以及如何使用它。
在第一个练习中最初启动Solr时,我们可以选择一个configSet来使用。我们选择的一个模式是为我们稍后索引的数据预先定义的。这一次,我们将使用具有非常小的模式的configSet,并让Solr从数据中找出要添加的字段。
您要索引的数据与电影相关,因此首先创建一个名为“films”的集合,该集合使用_default
configSet:
bin/solr create -c films -s 2 -rf 2
哇,等等。我们没有指定一个configSet!没关系,这_default
是适当的命名,因为它是默认的,如果你没有指定一个,就使用它。
我们没有,但是,设置两个参数-s
和-rf
。这些是分割集合的分割的数量(2)以及要创建的副本数量(2)。这相当于我们在第一个练习的交互式例子中的选项。
你应该看到如下输出:
WARNING: Using _default configset. Data driven schema functionality is enabled by default, which is NOT RECOMMENDED for production use. To turn it off: curl http://localhost:7574/solr/films/config -d ‘{"set-user-property": {"update.autoCreateFields":"false"}}‘Connecting to ZooKeeper at localhost:9983 ...INFO - 2017-07-27 15:07:46.191; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at localhost:9983 readyUploading /7.1.0/server/solr/configsets/_default/conf for config films to ZooKeeper at localhost:9983Creating new collection ‘films‘ using command:http://localhost:7574/solr/admin/collections?action=CREATE&name=films&numShards=2&replicationFactor=2&maxShardsPerNode=2&collection.configName=films{ "responseHeader":{ "status":0, "QTime":3830}, "success":{ "192.168.0.110:8983_solr":{ "responseHeader":{ "status":0, "QTime":2076}, "core":"films_shard2_replica_n1"}, "192.168.0.110:7574_solr":{ "responseHeader":{ "status":0, "QTime":2494}, "core":"films_shard1_replica_n2"}}}
命令打印的第一件事是关于在生产中不使用这个configSet的警告。这是由于我们稍后会涉及的一些限制。
否则,应该创建集合。如果我们转到http:// localhost:8983 / solr /#/ films / collection-overview上的管理界面,我们应该看到总览屏幕。
为电影数据准备无模式
_default
configSet 附带的模式有两个并行的事情发生。
首先,我们使用一个“托管模式”,它被配置为只能被Solr的Schema API修改。这意味着我们不应该手工编辑它,所以不会对从哪个来源进行编辑造成混淆。Solr的Schema API允许我们对字段,字段类型和其他类型的模式规则进行更改。
其次,我们使用solrconfig.xml
文件中配置的“字段猜测” (并包括Solr的各种配置设置)。字段猜测的目的是让我们开始使用Solr,而不必在尝试为索引建立索引之前定义我们认为在我们的文档中的所有字段。这就是为什么我们称之为“无模式”的原因,因为您可以快速启动,让Solr在您遇到文档时为您创建字段。
听起来不错!那么,不是真的,有限制。这是一个有点暴力,如果它猜错了,你不能改变很多关于一个领域的数据已经索引后,而不必重新索引。如果我们只有几千个可能并不坏的文档,但是如果您拥有数百万甚至数百万个文档,或者更糟糕的是无法再访问原始数据,这可能是一个真正的问题。
出于这些原因,Solr社区不建议在没有您自己定义的模式的情况下进行生产。通过这个,我们的意思是无模式功能可以从头开始,但是您仍然应该始终确保您的模式符合您希望数据索引的方式以及用户将如何查询它的期望。
可以将无模式功能与定义的模式混合使用。使用Schema API,您可以定义一些您想要控制的字段,然后让Solr猜测其他不太重要的字段,或者通过测试确信自己的信心会被猜测到您满意。这就是我们要在这里做的。
创建“名称”字段
我们要索引的电影数据每个电影都有少量的字段:一个ID,导演姓名,电影名称,发行日期和流派。
如果您查看其中一个文件example/films
,您将看到2006年发行的第一部影片名为.45。作为数据集中的第一个文档,Solr将根据记录中的数据猜测字段类型。如果我们继续索引这些数据,那么第一个影片名称将会告诉Solr该字段类型是一个“float”数字字段,并且将会创建一个类型为“name”的字段FloatPointField
。此记录之后的所有数据将被预期为浮动。
那么,这是行不通的。我们有一个名字,像一个强大的风和鸡运行,这是字符串 - 决不是数字,而不是浮动。如果我们让Solr猜测“name”字段是一个浮点数,那么稍后的标题会导致一个错误,索引将失败。这不会让我们很远。
在索引数据之前,我们可以做的是在Solr中设置“name”字段,以确保Solr始终将其解释为一个字符串。在命令行输入这个curl命令:
curl -X POST -H ‘Content-type:application/json‘ --data-binary ‘{"add-field": {"name":"name", "type":"text_general", "multiValued":false, "stored":true}}‘ http://localhost:8983/solr/films/schema
该命令使用Schema API来显式定义一个名为“name”的字段,该字段的字段类型为“text_general”(一个文本字段)。它不会被允许有多个值,但它将被存储(这意味着它可以通过查询来检索)。
您也可以使用管理界面来创建字段,但对字段属性的控制较少。但是,它将为我们的案件工作:
创建一个“catchall”复制字段
在我们开始索引之前还有一个更改要做。
在第一个练习中,当我们查询已经建立索引的文档时,我们不需要指定一个字段进行搜索,因为我们使用的配置被设置为将字段复制到一个text
字段中,而当没有其他字段是在查询中定义。
我们现在使用的配置没有这个规则。我们需要定义一个字段来搜索每个查询。然而,我们可以通过定义一个复制字段来设置一个“catchall字段”,该字段将从所有字段获取所有数据并将其索引到一个名为的字段中_text_
。现在就来做吧
您可以使用管理用户界面或架构API。
在命令行中,再次使用Schema API来定义一个副本字段:
curl -X POST -H ‘Content-type:application/json‘ --data-binary ‘{"add-copy-field" : {"source":"*","dest":"_text_"}}‘ http://localhost:8983/solr/films/schema
在管理界面中,选择添加复制字段,然后填写您的字段的来源和目的地,如此屏幕截图所示。
这是做所有领域的副本,并将数据放入“_text_”字段。
对您的生产数据执行此操作可能非常昂贵,因为它告诉Solr有效地将所有内容都索引两次。它会使索引变慢,并使索引变大。使用您的生产数据,您将需要确保只复制真正为您的应用程序保证的字段。 |
好的,现在我们已经准备好索引数据并开始玩了。
索引样本电影数据
我们将索引的电影数据位于example/films
您的安装目录中。它有三种格式:JSON,XML和CSV。选择其中一种格式,并将其索引到“电影”集合中(在每个示例中,一个命令用于Unix / MacOS,另一个用于Windows):
bin/post -c films example/films/films.jsonC:\solr-7.1.0> java -jar -Dc=films -Dauto example\exampledocs\post.jar example\films\*.json
bin/post -c films example/films/films.xmlC:\solr-7.1.0> java -jar -Dc=films -Dauto example\exampledocs\post.jar example\films\*.xml
bin/post -c films example/films/films.csv -params "f.genre.split=true&f.directed_by.split=true&f.genre.separator=|&f.directed_by.separator=|"C:\solr-7.1.0> java -jar -Dc=films -Dparams=f.genre.split=true&f.directed_by.split=true&f.genre.separator=|&f.directed_by.separator=| -Dauto example\exampledocs\post.jar example\films\*.csv
每个命令都包含这些主要参数:
-c films
:这是Solr收集索引数据。example/films/films.json
(或films.xml
或films.csv
):这是数据文件索引的路径。您可以简单地提供该文件所在的目录,但由于您知道要编制索引的格式,因此指定该格式的确切文件效率更高。
请注意,CSV命令包含额外的参数。这是为了确保“genre”和“directed_by”列中的多值条目被pipe(|
)字符分隔,在此文件中用作分隔符。告诉Solr这样分割这些列将确保正确的数据索引。
每个命令将产生类似于索引JSON时看到的下面的输出:
$ ./bin/post -c films example/films/films.json/bin/java -classpath /solr-{solr-docs-version}.0/dist/solr-core-{solr-docs-version}.0.jar -Dauto=yes -Dc=films -Ddata=files org.apache.solr.util.SimplePostTool example/films/films.jsonSimplePostTool version 5.0.0Posting files to [base] url http://localhost:8983/solr/films/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,logPOSTing file films.json (application/json) to [base]/json/docs1 files indexed.COMMITting Solr index changes to http://localhost:8983/solr/films/update...Time spent: 0:00:00.878
万岁!
如果您进入影片管理界面(http:// localhost:8983 / solr /#/ films / query)中的查询屏幕并点击执行查询,您应该会看到1100个结果,前10个返回到屏幕。
让我们做一个查询,看看“catchall”字段是否正常工作。在q
框中输入“喜剧”,然后再次点击“ 执行查询”。你应该看到得到417个结果。在我们转向分面之前,随意与其他搜索玩耍。
刻面
Solr最受欢迎的功能之一就是刻面。分面允许将搜索结果排列成子集(或桶或类别),为每个子集提供计数。有几种类型的分面:字段值,数字和日期范围,枢轴(决策树)和任意查询分面。
场面
除了提供搜索结果之外,Solr查询还可以返回包含整个结果集中每个唯一值的文档的数量。
在“管理用户界面查询”选项卡上,如果选中该facet
复选框,则会看到几个与方面相关的选项:
要查看所有文档(q=*:*
)中的方面计数:打开faceting(facet=true
),并通过facet.field
param 指定要打开的字段。如果您只想要facet,并且没有文档内容,请指定rows=0
。curl
下面的命令将返回genre_str
字段的方面计数:
curl "http://localhost:8983/solr/films/select?q=*:*&rows=0&facet=true&facet.field=genre_str"
在您的终端中,您会看到如下所示的内容:
{ "responseHeader":{ "zkConnected":true, "status":0, "QTime":11, "params":{ "q":"*:*", "facet.field":"genre_str", "rows":"0", "facet":"true"}}, "response":{"numFound":1100,"start":0,"maxScore":1.0,"docs":[] }, "facet_counts":{ "facet_queries":{}, "facet_fields":{ "genre_str":[ "Drama",552, "Comedy",389, "Romance Film",270, "Thriller",259, "Action Film",196, "Crime Fiction",170, "World cinema",167]}, "facet_ranges":{}, "facet_intervals":{}, "facet_heatmaps":{}}}
我们已经在这里截断了一些输出,但是在本facet_counts
节中,默认情况下,您会看到索引中每个类型的文档使用的数量。Solr有一个参数facet.mincount
,可以用来限制只有那些包含一定数量的文档的面(这个参数在UI中没有显示)。或者,您也许需要所有的方面,并且让您的应用程序的前端控制如何显示给用户。
如果你想控制一个桶中的物品数量,你可以做这样的事情:
curl "http://localhost:8983/solr/films/select?=&q=*:*&facet.field=genre_str&facet.mincount=200&facet=on&rows=0"
你只能看到4个方面返回。
还有很多其他参数可以帮助您控制Solr如何构建构面和构面列表。我们将介绍其中的一部分在本练习中,但你也可以看到部分车花了更多的细节。
范围分面
对于数字或日期,通常希望将方面计数划分为范围而不是离散值。数字范围分面的一个主要例子是,使用我们以前练习中的例子techproducts数据price
。在/browse
UI中,它看起来像这样:
电影数据包括电影的发行日期,我们可以使用它来创建日期范围方面,这是范围方面的另一个常见用途。
Solr管理用户界面还不支持范围方面的选项,因此您将需要使用curl或类似的命令行工具以下示例。
如果我们构造一个如下所示的查询:
curl ‘http://localhost:8983/solr/films/select?q=*:*&rows=0‘\ ‘&facet=true‘\ ‘&facet.range=initial_release_date‘\ ‘&facet.range.start=NOW-20YEAR‘\ ‘&facet.range.end=NOW‘\ ‘&facet.range.gap=%2B1YEAR‘
这将要求所有的电影,并要求他们从20年前(我们最早的发布日期在2000年)开始到今天结束的年份。请注意,此查询再次将URL编码+
为%2B
。
在终端你会看到:
{ "responseHeader":{ "zkConnected":true, "status":0, "QTime":8, "params":{ "facet.range":"initial_release_date", "facet.limit":"300", "q":"*:*", "facet.range.gap":"+1YEAR", "rows":"0", "facet":"on", "facet.range.start":"NOW-20YEAR", "facet.range.end":"NOW"}}, "response":{"numFound":1100,"start":0,"maxScore":1.0,"docs":[] }, "facet_counts":{ "facet_queries":{}, "facet_fields":{}, "facet_ranges":{ "initial_release_date":{ "counts":[ "1997-07-28T17:12:06.919Z",0, "1998-07-28T17:12:06.919Z",0, "1999-07-28T17:12:06.919Z",48, "2000-07-28T17:12:06.919Z",82, "2001-07-28T17:12:06.919Z",103, "2002-07-28T17:12:06.919Z",131, "2003-07-28T17:12:06.919Z",137, "2004-07-28T17:12:06.919Z",163, "2005-07-28T17:12:06.919Z",189, "2006-07-28T17:12:06.919Z",92, "2007-07-28T17:12:06.919Z",26, "2008-07-28T17:12:06.919Z",7, "2009-07-28T17:12:06.919Z",3, "2010-07-28T17:12:06.919Z",0, "2011-07-28T17:12:06.919Z",0, "2012-07-28T17:12:06.919Z",1, "2013-07-28T17:12:06.919Z",1, "2014-07-28T17:12:06.919Z",1, "2015-07-28T17:12:06.919Z",0, "2016-07-28T17:12:06.919Z",0], "gap":"+1YEAR", "start":"1997-07-28T17:12:06.919Z", "end":"2017-07-28T17:12:06.919Z"}}, "facet_intervals":{}, "facet_heatmaps":{}}}
枢轴分面
另一个分面类型是数据透视面,也称为“决策树”,允许两个或多个字段为所有各种可能的组合嵌套。使用电影数据,可以使用数据透视面来查看“戏剧”类别(genre_str
场地)中有多少电影由导演指导。以下是如何获取此方案的原始数据:
curl "http://localhost:8983/solr/films/select?q=*:*&rows=0&facet=on&facet.pivot=genre_str,directed_by_str"
这导致了以下回应,其中显示了每个类别和导演组合的一个方面:
{"responseHeader":{ "zkConnected":true, "status":0, "QTime":1147, "params":{ "q":"*:*", "facet.pivot":"genre_str,directed_by_str", "rows":"0", "facet":"on"}}, "response":{"numFound":1100,"start":0,"maxScore":1.0,"docs":[] }, "facet_counts":{ "facet_queries":{}, "facet_fields":{}, "facet_ranges":{}, "facet_intervals":{}, "facet_heatmaps":{}, "facet_pivot":{ "genre_str,directed_by_str":[{ "field":"genre_str", "value":"Drama", "count":552, "pivot":[{ "field":"directed_by_str", "value":"Ridley Scott", "count":5}, { "field":"directed_by_str", "value":"Steven Soderbergh", "count":5}, { "field":"directed_by_str", "value":"Michael Winterbottom", "count":4}}]}]}}}
我们也截断了这个输出 - 你会在屏幕上看到很多流派和导演。
练习3:索引自己的数据
对于最后一个练习,使用您选择的数据集。这可以是本地硬盘上的文件,之前使用过的一组数据,也可以是您打算为生产应用程序索引到Solr的数据的样本。
这个练习是为了让你思考你需要为你的应用程序做什么:
什么样的数据你需要索引?
你需要做什么来为你的数据准备Solr(例如,创建特定字段,设置复制字段,确定分析规则等)
你想提供给用户什么类型的搜索选项?
你需要做多少测试才能确保一切按你期望的方式工作?
创建你自己的收藏
在开始之前,创建一个新的集合,命名为任何你想要的。在这个例子中,集合将被命名为“localDocs”; 用你选择的任何名字替换这个名字,如果你想的话。
./bin/solr create -c localDocs -s 2 -rf 2
同样,从上面的练习2中可以看出,这将使用_default
configSet和它提供的所有无模式功能。正如我们前面提到的,当我们索引数据时,这可能会导致问题。在获得正确的模式之前,您可能需要迭代几次索引。
索引的想法
Solr有很多方法来索引数据。选择下面的方法之一,并试用你的系统:
- 带有bin / post的本地文件
如果您有文件的本地目录,则Post Tool(
bin/post
)可以索引文件的目录。我们在第一个练习中看到了这一点。我们在练习中只使用了JSON,XML和CSV,但Post Tool也可以处理HTML,PDF,Microsoft Office格式(如MS Word),纯文本等等。
在这个例子中,假设在本地有一个名为“Documents”的目录。要索引它,我们会发出这样的命令(
-c
根据需要在参数后面纠正集合名称):./bin/post -c localDocs ~/Documents
您的文档可能会出现错误。这些可能是由字段猜测引起的,或者文件类型可能不被支持。像这样索引内容表明需要为您的数据计划Solr,这需要了解它,也许还需要一些试验和错误。
- DataImportHandler
Solr包含一个称为数据导入处理程序(DIH)的工具,它可以连接到数据库(如果您有jdbc驱动程序),邮件服务器或其他结构化数据源。有几个例子包括饲料,GMail和一个小的HSQL数据库。
该
README.txt
文件example/example-DIH
将为您提供有关如何开始使用此工具的详细信息。- SolrJ
SolrJ是一个与Solr交互的基于Java的客户端。将SolrJ用于基于JVM的语言或其他Solr客户端,以编程方式创建要发送到Solr的文档。
- 文档屏幕
使用管理用户界面文档选项卡(位于http:// localhost:8983 / solr /#/ localDocs / documents)粘贴到要建立索引的文档中,或者
Document Builder
从Document Type
下拉列表中选择一次构建一个文档的文档。单击表单下方的“ 提交文档”按钮以索引文档。
更新数据
您可能会注意到,即使您不止一次在本教程中对内容进行索引,也不会复制找到的结果。这是因为示例Solr模式(名为managed-schema
or或者的文件schema.xml
)指定了一个uniqueKey
名为的字段id
。无论何时您将命令张贴到Solr以添加具有与uniqueKey
现有文档相同的值的文档,它都会自动替换为您。
你可以看到,已经通过在值寻找发生numDocs
,并maxDoc
在Solr管理UI的特定核心概述部分。
numDocs
表示索引中可搜索文档的数量(由于某些文件包含多个文档,因此将大于XML,JSON或CSV文件的数量)。该maxDoc
值可能会更大,因为maxDoc
计数包括尚未从索引中物理删除的逻辑删除文档。你可以重新张贴样本文件一遍又一遍,只要你想,numDocs
永远不会增加,因为新的文件将不断取代旧的。
继续编辑任何现有示例数据文件,更改一些数据,然后重新运行PostTool(bin/post
)。您会在随后的搜索中看到您的更改。
删除数据
如果您需要迭代几次才能使模式正确,那么您可能需要删除文档以清除集合,然后重试。但请注意,仅删除文档不会更改基础字段定义。实质上,这将允许您在根据需要更改字段之后重新索引数据。
您可以通过向更新URL发布删除命令并指定文档唯一键字段的值或与多个文档相匹配的查询(请注意该字段!)来删除数据。bin/post
如果我们正确地构建请求,我们也可以使用删除文档。
执行以下命令删除特定的文档:
bin/post -c localDocs -d "<delete><id>SP2514N</id></delete>"
要删除所有文档,可以使用“删除查询”命令:
bin/post -c localDocs -d "<delete><query>*:*</query></delete>"
您也可以修改上述内容,只删除与特定查询匹配的文档。
空间查询
Solr具有复杂的地理空间支持,包括在给定位置(或边界框内)的指定距离范围内搜索,按距离排序,甚至按距离提高结果。
我们在练习1中编入索引的一些示例技术产品文档具有与它们相关联的位置以说明空间功能。要重新索引这些数据,请参阅练习1。
空间查询可以与任何其他类型的查询结合使用,例如在旧金山10公里范围内查询“ipod”的例子:
这是来自Solr的示例搜索UI(调用/browse
),它具有很好的功能来显示每个项目的地图,并允许轻松选择附近的搜索位置。你可以去看看这个自己通过http://本地主机:8983 / Solr的/高科枝产品/浏览Q = iPod和PT = 37.7752%2C-122.4232&d = 10元数=店和FQ =%7B%21bbox%7D&queryOpts =空间和queryOpts =空间在浏览器。
要了解有关Solr的空间功能的更多信息,请参阅空间搜索部分。
包起来
如果您已经在本快速入门指南中运行完整的命令集,则完成以下操作:
推出Solr到SolrCloud模式,两个节点,两个集合,包括分片和副本
索引了几种类型的文件
使用模式API来修改您的模式
打开管理控制台,使用其查询界面获取结果
打开/浏览界面,在更友好和熟悉的界面中浏览Solr的功能
干得好!
清理
在您完成本教程的过程中,您可能需要停止Solr并将环境重置为起点。以下命令行将停止Solr并删除在练习1中完全创建的两个节点中的每个节点的目录:
bin/solr stop -all ; rm -Rf example/cloud/
下一步在哪里?
本指南将是您了解更多关于Solr的最佳资源。
Solr也有一个由人们组成的健全的社区,他们乐于帮助您入门。有关更多信息,请查看Solr网站的资源页面。
我们欢迎对Solr文档的反馈。但是,我们无法通过评论提供应用支持。如果您需要帮助,请发送邮件到Solr用户邮件列表。
RSS 登录/注册
Yaacov 14天前 评分:0 (注册帐户,以评级评论)
关于本教程目的的其他评论 - 本教程提供了一个非常好的介绍,介绍如何为使用JSON或XML文件编制的所有数据准备的文件构建索引。然而,我在寻找的是如何使用像Solr这样的工具作为我的网站或应用程序中的UI字段的“后端”,以在索引数据文件中进行搜索。但是我有一个相当不错的工具,就是提交查询的前端。
Yaacov 14天前 评分:0 (注册帐户,以评级评论)
当你从第一个教程开始,为Windows用户提供指导的时候,你很快就放弃了它们,第一个教程中的所有指令都假设这个人正在运行一些Unix的方言。>“后”脚本与Windows不兼容,只是抛出错误消息。>大多数Windows安装不包含“curl”命令界面。>阅读所有的电影作品没有为我工作。它读取前五个,然后遇到特殊字符,Java抛出异常。
Jonathan Pool 19天前 评分:0 (注册帐户以评分)
在http://lucene.apache.org/solr/guide/7_1/solr-tutorial.html#deleting-data这一节中,讨论了删除“文件”的问题。如果学习者正在索引一组文档,最自然的解释是,教程正在讨论删除被索引的文档。但显然这里的“文档”是指由Solr创建的工件。当涉及到删除时,应该避免含糊不清。应该有一个明确的区别,文件系统文件和Solr工件不被相同的术语引用。本教程中有关术语的部分也可能对此有所帮助。
Jonathan Pool 19天前 评分:0 (注册帐户以评分)
在http://lucene.apache.org/solr/guide/7_1/solr-tutorial.html#updating-data一节中,第一句似乎不清楚。目前还不清楚“it”是指什么。目前还不清楚“找到的结果”是指什么。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
“你应该看到得到417个结果”的说法是不合语法的。无论如何,我只看到1个结果。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
声明“你应该看到1100个结果,前10个返回到屏幕”似乎混乱。我实际上看到了10个结果。我没有看到任何告诉我有1100个结果的东西。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
“索引示例电影数据”部分显示了索引JSON文件的输出。显示的输出不包含错误。但实际输出包含2个错误,由“name”字段的值触发,违反了一些未规定的限制。一个违规的名字是“15公园大道”。另一个是“ es elel z?”“”“”"</s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s></s>“ 输出描述应该告诉学习者期望这些错误信息以及如何处理它们。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
出于某种原因,包含左双引号或右双引号符号的注释出现在我的浏览器中,带有一个豆腐盒,后面跟着它们的十六进制Unicode代码点的最后3个数字。尽管这个页面的元声明是UTF-8编码的。这是一个错误,但我不知道在哪里。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
从创建复制字段的讨论中,我不知道可以多次创建指定的复制字段。这是一个惊喜。这可能是很好的解释,为什么这是可能的,相比之下,“名称”字段,试图再次创造一个错误。
Jonathan Pool 20天ago 评分:0 (注册帐户,以评分评论)
在 01中创建“名称”域 01D部分,指令的卷曲版本将字段名称定义为“名称”而不是“名称”。用户界面版本正确显示为“名称”。
Jonathan Pool 21天前 评分:0 (注册帐户,以评分评论)
01CWhoa后,等待 01D,在预期的输出中,从CC01CConnecting到Zookeeper 01D的所有内容,直到结束没有输出,而是 01CC处理2个分片的集合“电影”,2个副本输出config-set‘films‘ 01D。
Jonathan Pool 21天前 评分:0 (注册帐户,以评分评论)
在此之后,Solr将创建集合并再次向屏幕输出它发出的命令 01D,显示的输出对我来说只是上面显示的一部分。输出的是以 01CPOSTingrequest 01D开始的部分。
Jonathan Pool 21天前 评分:0 (注册帐户,以评分评论)
我们被告知要安装JVM,但是选项是JRE的两个版本和JDK的一个版本。我在OS X上发现JRE的最终用户版本已经足够了,但是在安装完成之后,还有必要找到它。否则,Solr找到旧版本并拒绝运行。我将我的JAVA_HOME环境变量设置为安装新版本的位置,即/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home,然后在新的终端窗口Solr正常运行。
Ariel 35天前 评分:+1 (注册账户才能评分)
错别字,除非你知道你的机器上有其他的东西在8983端口上运行,否则也可以按回车键接受这个默认选项。而不是8983,应该是7574
Cassandra 18天前 评分:0 (注册账户才能评分)
谢谢,我已经解决了这个指南的下一个版本。