Solr4 Wiki 翻译 - 分布式搜索
概述
这篇文档涵盖了使用示例schema和一些示例数据运行Solr的基础。
必备
为更好follow这个手册,您需要...
1. Java1.6或更高版本。您可以从Oracle, Open JDK, 或者 IBM获取.
在命令行运行java -version以确认java版本号大于等于1.6.
不支持Gnu的GCJ,因此它不对Solr起作用。
2. Solr版本Solr release .
开始
在运行Solr服务的同一台机器的显示手册的浏览器上的示例链接会正确的指向您的Solr服务器。
解压缩Solr版本,将目录切换到“example”.(注意基准目录会随着下载版本不同而不同),如下例,在UNIX、Cygwin或MacOS:
user:~solr$ lssolr-nightly.zipuser:~solr$ unzip -q solr-nightly.zipuser:~solr$ cd solr-nightly/example/
Solr可以运行在任何你选择的Java Servlet容器内,为简单起见,本手册的实例索引包含一个小的Jetty安装。
使用Solr WAR和示例配置启动Jetty,运行start.jar...
user:~/solr/example$ java -jar start.jar2012-06-06 15:25:59.815:INFO:oejs.Server:jetty-8.1.2.v201203082012-06-06 15:25:59.834:INFO:oejdp.ScanningAppProvider:Deployment monitor .../solr/example/webapps at interval 02012-06-06 15:25:59.839:INFO:oejd.DeploymentManager:Deployable added: .../solr/example/webapps/solr.war...Jun 6, 2012 3:26:03 PM org.apache.solr.core.SolrCore registerSearcherINFO: [collection1] Registered new searcher Searcher@7527e2ee main{StandardDirectoryReader(segments_1:1)}这将在端口8983启动Jetty应用服务器,并在您的终端上显示Solr的log信息。您可以在浏览器通过加载页面http://localhost:8983/solr/ 看到Solr已经启动,这是Solr管理的开始界面。
索引数据
您的Solr服务器已经启动运行,但是它没有任何数据。通过Posting命令,您可以修改Solr的索引:添加(或修改)文档,删除文档,并且提交添加或删除。这些命令支持多种格式(variety of formats)。
目录 exampledocs 包含了一些展示多种Solr可以接受的命令的示例文件,以及一个在终端提交这些命令的java工具(还有一个shell脚本post.sh,在本手册中,我们使用跨平台的Java客户端)。
打开一个新的终端窗口,输入exampledocs目录,然后在同目录下的一些XML文件运行“java -jar post.jar”
user:~/solr/example/exampledocs$ java -jar post.jar solr.xml monitor.xmlSimplePostTool: version 1.4SimplePostTool: POSTing files to http://localhost:8983/solr/update..SimplePostTool: POSTing file solr.xmlSimplePostTool: POSTing file monitor.xmlSimplePostTool: COMMITting Solr index changes..
现在,您已经在Solr中索引了两个文档,提交这些变化。在管理界面 "Query" tab,您可以搜索“Solr”,在文本框“q”里输入“solr”.点击按钮“Execute Query”后应该显示包含一个结果的如下URL...
http://localhost:8983/solr/collection1/select?q=solr&wt=xml
使用以下的命令(假设您的命令行sheel支持*.xml)您可以索引所有的示例数据。
user:~/solr/example/exampledocs$ java -jar post.jar *.xmlSimplePostTool: version 1.4SimplePostTool: POSTing files to http://localhost:8983/solr/update..SimplePostTool: POSTing file gb18030-example.xmlSimplePostTool: POSTing file hd.xmlSimplePostTool: POSTing file ipod_other.xmlSimplePostTool: POSTing file ipod_video.xml...SimplePostTool: POSTing file solr.xmlSimplePostTool: POSTing file utf8-example.xmlSimplePostTool: POSTing file vidcard.xmlSimplePostTool: COMMITting Solr index changes..
...现在您可以使用默认的Solr Query Syntax(Lucene的查询语法的一个超集)搜索各种各样的数据...
有多种不同的方法导入数据至Solr(索引数据)...您可以
更新数据
您可能已经注意到了,即使文件 solr.xml两次提交到了服务器,当您搜索"solr"时仍然只得到了一个结果。这是因为示例 schema.xml指定了一个名为"id"的"uniqueKey"字段.无论何时您POST添加在uniqueKey字段上具有相同值的文档时,它将自动替换已存在的文档。通过在统计页面的“CORE”/searcher段查看numDocs和maxDocs的值,您发现已经被替换了。
http://localhost:8983/solr/#/collection1/plugins/core?entry=searcher
numDocs表示在当前索引下可搜索的文档数目(由于一些文件可能包含多于一个的<doc>而超过XML文件的数量)。maxDoc或许会更大,因为它包括了逻辑上被删除而没有从索引中移除的文档。您可以任意多次重复提交这些示例XML文档,但是numDocs永远不会增加,因为新文档总是会替换旧的。
编辑这些XML文件,改变一些数据,然后重新执行 java -jar post.jar命令,您可以看到后续的检索反映出了这些变化。
删除数据
您可以通过POSTing删除命令至更新URL,指定文档的uniqueKey字段,或者是一个多个文档的查询(那样的话应该谨慎)以删除数据。因为那些命令比较小,我们在命令行里指定他们而不是引用一个XML文件。
执行如下命令删除指定的文档。
java -Ddata=args -Dcommit=false -jar post.jar "<delete><id>SP2514N</id></delete>"
由于我们指定了“commit=false”,一个指定id:SP2514N 的检索仍然可以检索到我们已经删除的文档。因为示例配置实用了Solr的"autoCommit"特性,Solr会自动保存这个索引,但是直到一个“openSearcher”显式执行,它不会影响检索结果.
使用可以统计updateHandler的statistics page,您可以通过查看deletesById的值下降到0,而cumulative_deletesById 和autocommit的值增加的事实观察到此次删除写入到了磁盘。
这里有一个使用delete-by-query删除一些名字里包含DDR的示例。
java -Dcommit=false -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"
通过往Solr发送一个commit命令您可以强制打开一个新的searcher以反映出那些变化(这是post.jar的默认作法).
java -jar post.jar
现在重新执行前面的检索去验证那些未匹配的文档被检索到了。您可以重新访问统计页面并观察在updateHandler 提交的数量和在searcher的numDocs。
通过打开一个新的搜索器(searcher)以提交是一个代价昂贵的操作,因此最好是批量更新同一个索引,最后再发送commit命令。还有一个optimize 命令可以完成同样工作,并且会强制所有的索引segment合并成一个segment--这样会使得资源密集,但是如果您的索引变化频率不高的话,为提高搜索速度是值得的。
所有的更新命令可以指定为XML 或 JSON.
为继续本手册,到exampledocs目录执行如下命令重新添加哪些被删除的文档。
java -jar post.jar *.xml
查询数据
检索是通过发送HTTP GET请求至 select URL,需要检索的关键词由参数q指定。您可以传递一些可选的request parameters 至请求处理器以控制所需返回信息。例如您可以使用参数"fl"控制返回哪些存储的字段和是否要返回相关评分:
q=video&fl=name,id (仅返回字段name和id)
q=video&fl=name,id,score (同时也返回相关评分)
q=video&fl=*,score (返回所有的字段和相关评分)
q=video&sort=price desc&fl=name,id,price (添加排序指令,按照价格降序)
q=video&wt=json (以json方式返回)
在管理界面提供的查询表单 允许设置各种查询参数,这对测试或调试查询时大有用处。
排序
Solr提供一种简单的方法用来在一个或多个索引字段上进行排序。使用参数"sort"指定“ 字段和方向”,如果有多个字段则用逗号分隔:
“score”也可以用来作为一个排序的字段:
复杂的函数也可以用来排序查询结果:
q=video&sort=div(popularity,add(price,1)) desc
如果未指定排序字段,默认为评分降序(score desc)返回那些相关性最高的匹配结果。
高亮
命中高亮返回每个文档相关的片段,并且高亮显示那个上下文片段的词元。
如下示例搜索“video card”并请求高亮字段name,features.这将用<em>标签包裹那些需要高亮的词元生成一个高亮节,并将它添加到响应中。
...&q=video card&fl=name,id&hl=true&hl.fl=name,features
更多与高亮相关的请求参数在这里.
切面搜索
切面搜索按照各种属性或分类汇总匹配结果。一般会提供一些可供用户钻取的链接或者基于返回的分类完善搜索结果。
以下示例搜索所有的文档(*:*) ,并按照分类字段“cat”进行汇总。
...&q=*:*&facet=true&facet.field=cat
注意尽管只有前10个文档从结果列表中返回,切面汇总却是以整个匹配查询的结果集产生的.
我们可以一次按照多种方式切面。如下示例添加了一个按照是否有库存(inStock)的布尔值的切面。
...&q=*:*&facet=true&facet.field=cat&facet.field=inStock
Solr可以为任意查询产生汇总.以下示例查询"ipod",并且通过使用在价格字段上的区间查询(range queries)来展示低于和高于100的价格.
...&q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]
Solr甚至可以按照数值区间(包括日期)进行切面。这个示例请求按照制造日期(manufacturedate_dt字段),从2004年到2010年进行逐年汇总。
...&q=*:*&facet=true&facet.rage=manufacturedate_dt&facet.rage.start=2004-01-01T00:00:00Z&facet.rage.end=2010-01-01T00:00:00Z&facet.range.gap=+1YEAR
更多关于切面搜索的信息可以查看切面概述和切面参数页面。
搜索界面
Solr包含一个用velocity模板创建的示例搜索界面,演示了许多特性,包括搜索、切面、高亮、自动填充和地理搜索(原文是“geospatial searching”).
可以在http://localhost:8983/solr/collection1/browse实践下。
文本分析
文本字段是一种典型的,通过将文本分解成符号(Tokens),使用各种诸如转为小写、去除复数词尾(s,es等),去除分词词尾(d,ed,ing等,这两种处理都是针对英文进行的处理)以提高相关性的典型索引。
Schema定义了索引中的字段以及在其上使用的分析器类型.您的collection现在使用的schema可以直接通过管理界面的Schema tab 查看,或者使用Schema Browser tab动态浏览.
适合您文本内容最好的分析组件(tokenization and filtering)严重依赖语言。正如你在Schema Browser中所见,许多在示例schema中的字段使用了一种叫做text_general的字段类型(fieldType),默认情况下它适合大多数的语言.
如果您的文本内容是英语,就像本手册的示例文档一样,您可以使用面向英语的分词和停用词表,分隔复合词,您可以使用字段类型text_en_splitting来代替.继续编辑目录"solr/example/solr/conf"下的文件"schema.xml".在字段text和features上使用字段类型text_en_splitting:
<field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/> ... <field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>
做完这些改变后重启Solr,然后使用“java -jar post.jar *.xml”重新提交所有的示例文档。现在下面列出来的搜索会演示面向英语(English-specific)的转换:
可供使用的关于分析组件、Analyzers、Tokenizers和TokenFilters的完整描述请查看这里.
分析调试
有一个非常便捷的Analysis tab ,在这里您可以看到一个文本值在索引和检索时如何被分解成单词符号。这个页面展示了它们经过一系列的过滤器链处理后的符号(tokens)结果。
这个URL显示了从“Canon Power-Shot SD500”使用text_en_splitting创建的符号。表格的每一段显示了经过索引分析器的下一个符号过滤器(TokenFilter)的符号结果.注意“powershot”、“power”和"shot"是如何被索引的,使用具有相同"位置(postion)"的符号.(同使用通用字段类型处理产生的符号比较.)
鼠标移动到小节左侧的标签上将会显示出位于整个链上的那个阶段的分析器组件的全名称。选择或反选复选框"Verbose Output"将会显示或隐藏详细的符号属性.
当索引和查询值同时提供时,两个表将并排显示每个链条上的结果.最终等于查询链上的词干的索引链上的词干将会高亮显示。
其他值得关注的示例:
English stemming and stop-words 使用 text_en 字段类型
Half-width katakana normalization with bi-graming 使用 text_cjk 字段类型
Japanese morphological decomposition with part-of-speech filtering 使用text_ja 字段类型
Arabic stop-words, normalization, and stemming 使用 text_ar 字段类型
结论
恭喜您!您已经成功运行了一个小的Solr实例,并且添加了一些文档,同时对索引和schema做了修改。您了解了查询、文本分析已经Solr管理界面。您已经做好了在您项目中使用Solr的准备!请继续以下步骤:
Solr拥有太多的在这里我们没有提及的特性,包括处理海量文档集合的分布式搜索,函数查询,数值类型字段统计以及搜索结果聚集。浏览Solr Wiki以更详细的了解Solr的特性。
玩得开心,我们将在Solr的邮件列表里看到您!