2011-01-17 11:56
本文介绍的内容是根据 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
solr-nightly.zip
chrish@asimov:~solr$ unzip -q solr-nightly.zip
chrish@asimov:~solr$ cd solr-nightly/example/
Solr可以运行在你选择的 Java Servlet 容器上,为了简化这个教程,例子索引包含了一个Jetty的最小化安装。为了编译JSP,这个版本的Jetty需要你从JDK中运行java,而不是一个JRE中运行Java。
为了运行带有Solr应用程序的Jetty和例子配置,仅需运行 start.jar ....
chrish@asimov:~/solr/example$ java -jar start.jar
1 [main] INFO org.mortbay.log - Logging to org.slf4j.impl.SimpleLogger@1f436f5 via org.mortbay.log.Slf4jLog
334 [main] INFO org.mortbay.log - Extract jar:file:/home/chrish/solr/example/webapps/solr.war!/ to /tmp/Jetty__solr/webapp
Feb 24, 2006 5:54:52 PM org.apache.solr.servlet.SolrServlet init
INFO: user.dir=/home/chrish/solr/example
Feb 24, 2006 5:54:52 PM org.apache.solr.core.SolrConfig <clinit>
INFO: Loaded Config solrconfig.xml
...
1656 [main] INFO org.mortbay.log - Started SelectChannelConnector @ 0.0.0.0:8983
这个将会在8983端口启动Jetty应用服务器,在终端上会显示服务器输出的日志信息。
通过在浏览器中输入 http://localhost:8983/solr/admin/ 能看到Solr正在运行,这是Solr管理员的入口。
●索引数据
你的Solr服务器运行起来了,但是它没有包含任何数据。你可以通过POST包含指令(添加、更新、删除文档,提交未决的添加、删除和优化索引命令)的XML文档来改变一个Solr索引。
exampledocs目录包含了Solr类型指令的例子,也可以在命令行使用一个java工具POST数据(这个脚本的名称为post.sh,但是这个教程里我们将使用跨平台的Java客户端)。
让我们继续这个学习,打开一个终端窗口,进入exampledocs目录,运行"java -jar post.jar"命令并提供XML参数文件,指示Solr服务器的URL:
chrish@asimov:~/solr/example/exampledocs$ java -jar post.jar solr.xml monitor.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 http://localhost:8983/solr/update..
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: COMMITting Solr index changes..
你现在已经在Solr中有了两个已经索引的文档,并已经提交了这些改变。你现在可以在Admin管理页面上的"Make a Query"上搜索 "solr" 就能返回结果。点击 "Search" 按钮,然后浏览下面的URL...
http://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 post.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 http://localhost:8983/solr/update..
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file spellchecker.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..
...现在可以你可以使用默认的 Lucene QueryParser语法查询所有排序的内容...
● video
● name:video
● +video +price:[* TO 400]
●更新数据
你可能已经注意到,即使solr.xml已经被POST到服务器两次,但你搜索"solr"时仍然只得到一个结果。这是因为schema.xml例子文件指定了一个"uniqueKey"字段作为"id"。无论何时你向Solr发送指令添加一个文档,如果已经存在一个uniqueKey相同的文档,它会自动地为你替换。你通过查看在统计页面的"CORE"部分的numDocs 和 maxDoc值来看刚才发生的事情...
http://localhost:8983/solr/admin/stats.jsp
numDoc 应该为16 (因为我们的11个XML例子文件包含了不止一个<doc>),maxDoc可能比较大,因为其包含了在逻辑上已经删除了但是还没有从索引中删除的文档。你可以多次提交这些例子文件,但是numDocs将不会增加,因为新的文档会替换旧的文档。
编辑已经存在的XML文件修改一些数据,重新运行 java -jar post.jar 命令,你将会在后续的搜索中看到你做的改变。
○删除数据
你可以提交一个删除命令到更新的URL来删除数据,在标识符字段指定值,或者进行匹配多个文档的查询(这个要小心!)。因为这些命令都非常小,在这里我们再命令上进行这些操作,而不是指定一个XML文件。
执行下面的命令来删除一个文档
java -Ddata=args -Dcommit=no -jar post.jar "<delete><id>SP2514N</id></delete>"
现在查看统计页面UPDATE HANDLERS 部分,deletesPending 应该为1。
如果你现在搜索id:SP2514N你仍能找到它,因为索引的改变是不可见的直到其数据更新到磁盘。现在向Solr提交一个命令:
java -jar post.jar
现在重新执行前面的搜索,将不会有匹配文档被发现。也可以重新访问统计页面,观察UPDATE_HANDLERS和CORE部分的改变。
这里是一个使用delete-by-query来删除在名字中有DDR的内容:
java -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"
提交是一个非常费时的操作,最好对一个索引一次提交多个改变,在最后提交再提交命令。也有一个优化命令,除了其完成提交命令相同的事情外,它会合并所有的索引段到一个单个的段中,这让搜索速度会更快,已经删除的文档也会从索引中删除。
为了继续这个教程,我们需要把例子文档重新提交一边,使用下面的命令:
java -jar post.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的完整描述请访问http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters。
○分析调试
有一个分析调试页面,在这里你能看到文本如何被分割成单词,同时显示了经过过滤器链中每一个过滤器后的结果。这里显示了 "Canon PowerShot SD500"在名称字段如何作为一个值进行索引。表格的每一行显示了经过名称字段分析器TokenFilter之后的结果。在相同位置生成的Tokens显示在同一列,在这里是shot 和powershot。
选择verbose输出能看到更多信息,例如在链中美一个分析组件的名称、分割位置、在原来文本中的起始和终止位置。
这里是一个 stemming和stop-words工作的例子。
|