人世间Solr为何物
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人世间Solr为何物
下面的几张图熟悉吗?
图(1)
图(2)
图(3)
∙高扩展的Java搜索服务器
∙基于Lucene搜索库
∙通过HTTP接收XML/JSON格式的文档(轻量级的"REST"形式)
∙没有内建的索引蜘蛛,可以与Nutch等爬虫集成
∙使用Lucene文档解析器解析HTML, OpenOffice, Microsoft Word, Excel, PowerPoint, IMAP, RTF, PDF等格式的文件
∙不仅支持字段数据模式定义, 也支持Lucene 动态字段
∙自定义分词器(Tokenizer)、过滤器(Filter)、分析器(Analyzer)以便控制索引和查询进程
∙除了支持富文本字段(rich text)和元数据(metadata)外,对数字和日期等进行了很好的区分
∙能合并多个文本字段为一个全文类型(full text)的字段,方便搜索(copy field)
∙可以基于性能的考虑调节各种参数(option tuning)
∙支持所有的Lucene查询语法,包括Internet查询操作符(+, -, "")
∙各种自定义查询处理选项
∙能够跨越多个字段搜索
∙可配置同义词(synonym words)和过滤词(stop words)文本文件
∙支持拼写检查(spell check)器
∙支持高亮(high light)显示搜索结果中的匹配关键字
∙复杂、强大的结果排序选项
∙Faceted metadata搜索结果
∙能够动态分组搜索结果
∙可配置的缓存选项,加速查询响应速度
∙可为扩展性和容灾配置索引复制(replication),like mysql replication?
∙基于web浏览器的管理接口,提供统计、报告、调试等
∙丰富的操作客户端:Client for Ruby, PHP,Java, Python等
How To Get Solr UP And Running?
实际上,得到Solr并且使其运行起来是件很容易的事。首先,从apache的官方网站上下载Solr 的Package。下载后解压zip(for windows)或者tar.gz(for linux),当前最新稳定版本为1.3.0。
Solr包结构图
打开example文件夹,如图:
运行Solr服务实例,命令行:java -jar start.jar
这时候的servlet容器是Jetty,该容器执行上述命令时启动,solr-home是:${example所在目录}/solr,不需要安装Tomcat,只需安装JDK1.6即可。
How To Interacting With Solr?
现在Solr Server已经运行了,是时候跟它交互对话了。作为一个搜索服务,Solr 能够提供的两个主要功能是:索引(Indexing)和检索(Searching)。在发出检索请求(query request)之前,你需要先索引一部分数据,索引什么数据呢,什么格式呢?
A World Of Documents
在 Java世界里,我们喜欢把事物描述为对象(Object)和属性(Property),在索引-检索(IR)世界里,事物被描述为文档 (Documents)和字段(Fields),一个文档表示一组数据,由一个或者多个字段实际构成,一个字段由键值对(key-value pair)组成,承载了真正的数据(actual data),例如:一个Web页面可以表示为由3个字段组成的文档-URL、Title、Body。
用Document简单的描述一个人:
(1)、索引文档(Indexing Documents)
从上面,你了解了数据在Solr中的表示方法,是时候向Solr提交一些格式化的Documents让它Indexing了。在Solr的Package 中,example目录下的exampledocs子目录下,有个post.jar,可以用来向Solr Server提交Documents,exampledocs下的xml文件都以
java -jar post.jar *.xml
该命令把exampledocs目录下的所有xml格式的文件提交给Solr Server进行索引,其具体实现是通过HttpClient(比如:curl命令)向指定的URL Post数据,该URL为:
http://localhost:8983/solr/update
提交完所有文件后,该命令自动向Solr Server发送"commit"指令,其具体实现方法也是向指
定的URL发送请求,该URL为:
http://localhost:8983/solr/commit
如果没有该指令,文件仍然被索引了,但是不能被检索。
(2)、检索文档
通过步骤一,我们已经索引了一部分文档,现在让我们进行查询吧。跟创建索引一样,检索文档也使用专用的URL来实现:
http://localhost:8983/solr/select
但是,当你尝试访问该URL时,Java Exception出现了,因为你并没有组织合理的Query Syntax,增加一个"q"参数:
http://localhost:8983/solr/select?q=*:*
"*:*"是匹配所有(match all)的查询语法,使用该语法意味着你要求Solr返回所有它索引的文档。返回的结果是XML格式的,其中包含了搜索结果的元数据(meta-data)和一组匹配条件的文档列表,注意:
http://localhost:8983/solr/select?q=*:*&rows=5&start=1
(3)、理解和控制返回结果
就像你在返回的XML格式的结果中看到的,结果中的每个document元素由若干field元素组成,当配置Solr的时候,你可以指定索引的模式(schema),怎么配置schema.xml暂不展开,通常schema中制订了一个文档包含的字段名(field name)及其类型(field type),以及Solr如何处理这些字段,字段的处理方式有3种:
∙Indexed - 字段的值做分词(broken into tokens)、过滤(filtered)、索引(indexed)处理,以便可以以该字段进行查询
∙Stored - 字段的值被完整存储,以便在查询的结果中可以完整呈现
∙Index and Stored - 结合前两者
结果集中返回的字段都是标识为Stored,如果一个字段没有被Stored,Solr没有办法从索引中重建它的原始值。你也可以明确指定(explicitly specify)返回哪些字段以便提高检索性能,从索引中读取Stored字段是要花费时间的,这一点跟你在mysql中检索数据类似,只Select你需要的字段,而不是Select * From SomeTable。使用"fl"参数可以做到这一点,使用英文半角逗号(或者空格)来分隔你需要返回的字段列表(field list)。在这里说明一个特殊的字段(伪字段)叫
score(分数),这个字段不属于原始文档的一部分,而是用来标识搜索结果中记录的匹配权重的,可用于排序,下面我们只返回id字段:
http://localhost:8983/solr/select?q=*:*&rows=5&start=1&fl=id,score