Apache Solr 使用

Apache Solr 使用
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工作的例子。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值