2024年1月18日发(作者:)

Apache Solr 教程

本文介绍的内容是根据 Apache Solr 版本 1.3.0.2009.02.07.10.59.58 编写的,如果你在使用一个不同版本的Solr,请参看伴随发布版中的文档。

● 概述

● 准备

● 开始

● 索引数据

● 更新数据

○ 删除数据

● 查询数据

○ 排序

● 文本分析

○ 分析调试

● 总结

●概述

这个文档使用一个例子来介绍运行Solr的基本知识。

●准备

为了进行这个教程,你需要...

1. Java 1.5或者更高版本。你可以从Sun、IBM、BEA获得它。在命令行中运行 java -version 将显示版本号,确保版本号大于1.5 。

2. 下载一个 Apache Solr 发行版。

3. 一个浏览器用来访问管理页面,IE的标签页看起来不是很好,推荐使用 FireFox 或者 Mozilla 。

●开始

请运行浏览器显示这个教程和在此机器上的Solr服务器,教程会正确地指向你的Solr服务器。

unzip你下载下来的Solr版本,并且改变你的工作目录到"example"目录。(注意,基本的目录结构可能会因你下载的版本不同而有一定的变化)。

chrish@asimov:~solr$ ls

chrish@asimov:~solr$ unzip -q

chrish@asimov:~solr$ cd solr-nightly/example/

Solr可以运行在你选择的 Java Servlet 容器上,为了简化这个教程,例子索引包含了一个Jetty的最小化安装。为了编译JSP,这个版本的Jetty需要你从JDK中运行java,而不是一个JRE中运行Java。

为了运行带有Solr应用程序的Jetty和例子配置,仅需运行 ....

chrish@asimov:~/solr/example$ java -jar

1 [main] INFO - Logging to Logger@1f436f5 via

4jLog

334 [main] INFO - Extract jar:file:/home/chrish/solr/example/webapps/!/

to /tmp/Jetty__solr/webapp

Feb 24, 2006 5:54:52 PM rvlet init

INFO: =/home/chrish/solr/example

Feb 24, 2006 5:54:52 PM nfig

INFO: Loaded Config

...

1656 [main] INFO - Started SelectChannelConnector @ 0.0.0.0:8983

这个将会在8983端口启动Jetty应用服务器,在终端上会显示服务器输出的日志信息。

通过在浏览器中输入 localhost:8983/solr/admin/ 能看到Solr正在运行,这是Solr管理员的入口。

●索引数据

你的Solr服务器运行起来了,但是它没有包含任何数据。你可以通过POST包含指令(添加、更新、删除文档,提交未决的添加、删除和优化索引命令)的XML文档来改变一个Solr索引。

exampledocs目录包含了Solr类型指令的例子,也可以在命令行使用一个java工具POST数据(这个脚本的名称为,但是这个教程里我们将使用跨平台的Java客户端)。

让我们继续这个学习,打开一个终端窗口,进入exampledocs目录,运行"java -jar "命令并提供XML参数文件,指示Solr服务器的URL:

chrish@asimov:~/solr/example/exampledocs$ java -jar

SimplePostTool: version 1.2

SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8, other encodings are

not currently supported

SimplePostTool: POSTing files to localhost:8983/solr/update..

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: COMMITting Solr index changes..

你现在已经在Solr中有了两个已经索引的文档,并已经提交了这些改变。你现在可以在Admin管理页面上的"Make a Query"上搜索 "solr" 就能返回结果。点击 "Search" 按钮,然后浏览下面的

localhost:8983/solr/select/?stylesheet=&q=solr&version=2.1&start=0&rows=10&indent=on

你可以使用下面的命令索引所有的例子数据(假设你的shell支持 *.xml形式的匹配模式):

chrish@asimov:~/solr/example/exampledocs$ java -jar *.xml

SimplePostTool: version 1.2

SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8, other encodings are

not currently supported

SimplePostTool: POSTing files to localhost:8983/solr/update..

SimplePostTool: POSTing file

SimplePostTool: POSTing file ipod_

SimplePostTool: POSTing file ipod_

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: POSTing file

SimplePostTool: COMMITting Solr index changes..

...现在可以你可以使用默认的 Lucene QueryParser语法查询所有排序的内容...

● video

● name:video

● +video +price:[* TO 400]

●更新数据

你可能已经注意到,即使已经被POST到服务器两次,但你搜索"solr"时仍然只得到一个结果。这是因为例子文件指定了一个"uniqueKey"字段作为"id"。无论何时你向Solr发送指令添加一个文档,如果已经存在一个uniqueKey相同的文档,它会自动地为你替换。你通过查看在统计页面的"CORE"部分的numDocs 和 maxDoc值来看刚才发生的事情...

localhost:8983/solr/admin/

numDoc 应该为16 (因为我们的11个XML例子文件包含了不止一个),maxDoc可能比较大,因为其包含了在逻辑上已经删除了但是还没有从索引中删除的文档。你可以多次提交这些例子文件,但是numDocs将不会增加,因为新的文档会替换旧的文档。

编辑已经存在的XML文件修改一些数据,重新运行 java -jar 命令,你将会在后续的搜索中看到你做的改变。

○删除数据

你可以提交一个删除命令到更新的URL来删除数据,在标识符字段指定值,或者进行匹配多个文档的查询(这个要小心!)。因为这些命令都非常小,在这里我们再命令上进行这些操作,而不是指定一个XML文件。

执行下面的命令来删除一个文档

java -Ddata=args -Dcommit=no -jar "SP2514N"

现在查看统计页面UPDATE HANDLERS 部分,deletesPending 应该为1。

如果你现在搜索id:SP2514N你仍能找到它,因为索引的改变是不可见的直到其数据更新到磁盘。现在向Solr提交一个命令:

java -jar

现在重新执行前面的搜索,将不会有匹配文档被发现。也可以重新访问统计页面,观察UPDATE_HANDLERS和CORE部分的改变。

这里是一个使用delete-by-query来删除在名字中有DDR的内容:

java -Ddata=args -jar "name:DDR"

提交是一个非常费时的操作,最好对一个索引一次提交多个改变,在最后提交再提交命令。也有一个优化命令,除了其完成提交命令相同的事情外,它会合并所有的索引段到一个单个的段中,这让搜索速度会更快,已经删除的文档也会从索引中删除。

为了继续这个教程,我们需要把例子文档重新提交一边,使用下面的命令:

java -jar *.xml

●查询数据

查询可以通过HTTP的GET方式,URL的查询字符串中要包含q参数。你也可以传递一些可选参数来控制请求处理器返回什么信息。例如,你可以使用"fl"参数来控制返回什么存储字段,还有如果关联值(relevancy

score)被返回时...

● 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 降序)

Solr提供了在管理页面进行查询的接口,这个允许设置不同的查询参数,这在调试查询时是很有用的。

○排序

Solr提供了一个简单的方法来排序一个或者多个索引段。使用"sort"参数来指定 "field direction" 参数对...

● q=video&sort=price desc

● q=video&sort=price asc

● q=video&sort=inStock asc, price desc

"score"当指定一个排序时"score"也可以作为一个字段名...

● q=video&sort=score desc

● q=video&sort=inStock asc, score desc

如果没有制定排序,默认是关联值降序,这个和Lucene搜索API是一样的。

●文本分析

文本字段一般通过把字段分割成单词来索引,或者进行不同的转换,例如转换成小写、移出重复值或者填充来增加关联性。通常为了匹配索引使用同样的转换来进行查询。

例子查询阐释了改进关联性的转换:

● 一个搜索power-shot匹配PowerShot, adata 匹配 A-DATA ,因为使用了 WordDelimiterFilter

和LowerCaseFilter.

● 一个搜索 name:printers 匹配 Printer, 和 features:recharging 匹配 Rechargeable,因为使用了EnglishPorterFilter.

●一个搜索 "1 gigabyte" 匹配GB, 和 pixima匹配Pixma因为使用了SynonymFilter.

使用了模式中定义的索引字段和分析类型。当前服务器使用的模式可以使用管理页面的[SCHEMA]连接来访问。

分析组件Analyzers、Tokenizers、TokenFilters的完整描述请访问/solr/AnalyzersTokenizersTokenFilters。

○分析调试

有一个分析调试页面,在这里你能看到文本如何被分割成单词,同时显示了经过过滤器链中每一个过滤器后的结果。这里显示了 "Canon PowerShot SD500"在名称字段如何作为一个值进行索引。表格的每一行显示了经过名称字段分析器TokenFilter之后的结果。在相同位置生成的Tokens显示在同一列,在这里是shot 和powershot。

选择verbose输出能看到更多信息,例如在链中美一个分析组件的名称、分割位置、在原来文本中的起始和终止位置。

这里是一个 stemming和stop-words工作的例子。

●结论

祝贺你!你已经运行了一个小的Solr实例,已经添加了一些文档和改变了索引。你已经学习了关于查询、文本分析和Solr管理接口的知识。你现在可以在自己的项目中使用Solr了!可采取下面的步骤:

● 订阅Solr邮件列表!

● 拷贝一份Solr例子作为你项目的模版。

● 定制schema 和其它在solr/conf/ 的配置来符合你的需求。