人世间Solr为何物

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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文件都以元素开始,这是post.jar可以识别的向Solr Server提交数据进行索引的命令。确保Solr Server运行中,执行如下命令:

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)和一组匹配条件的文档列表,注意:元素的numFound属性反馈了匹配的文档数等于26(exampledocs下一共有26个xml文件被索引),默认Solr只返回了10条记录。因为Solr被设计为可索引上百万的文档,倘若一并返回给你,消耗大量的时间和系统资源,并且没有多少实际的意义(It does not make any sense)。就如你使用百度和谷歌进行搜索一样,搜索结果是分页呈现的,每次只返回一页的内容是合理的。Solr的默认rows等于10,默认start等于1,你可以根据你的实际情况进行指定,比如:

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

相关文档
最新文档