SOLR之初体验——第一部分

我准备用两部分来讲述SOLR的体验。第一部分,牵涉到后端,主要是SOLR的安装、启动、数据库配置;第二部分,牵涉到前端,主要是用Solarium提供的PHP接口在PHP中进行操作。

本篇是第一部分。

SOLR由Apache发行,是一个源自Apache Lucene的开源、企业级、搜索引擎项目。 在Sitepoint.com的这一系列文章详细讲述了SOLR和Solarium,有兴趣的读者可以自行浏览。

安装、启动SOLR当前版本为4.8.0,以压缩包方式发布,有发行版现成使用和源代码供自行编译。下载地址:https://lucene.apache.org/solr/downloads.html

SOLR发行包不大,压缩后仅150M左右。解压到某个目录后,安装就可以认为已经完成——当然还需要正确版本的Java支持,SOLR对Java的要求是在1.7以上。我的安装目录在:

~/temp/solr-4.8.0

SOLR的发行版有一个内置的样本服务器配置,在example目录下,而其中又有一个样本数据库solr。 首先让我们启动这个数据库,看看有些什么东西。

tr@hp:~/temp/solr-4.8.0/example$ java -jar start.jar

这样就启动了SOLR服务,该服务缺省开放了8983端口的WEB管理界面,我们可以远程访问之:

Ashampoo_Snap_2014.05.03_10h30m21s_011_Solr

出现这个界面后,我们可以放心了:SOLR服务已经正常启动。SOLR确实是非常吃内存的服务,2G的内存空间被吃掉了1.75G。看来,要充分跑起SOLR,4G是最低配置了。

在左侧“Core Selector”下拉框中选择一个我们要管理的核心——目前也只有一个,名叫“collection1”,于是就进入该核心的管理页面。在我看来,一个核心或者说这里的collection1,就相当于一张表格,用来保存我们需要进行索引和搜索的数据。此时界面变为对该核的管理界面:

Ashampoo_Snap_2014.05.03_10h30m03s_010_SolrAdminMozillaFirefox_thumb.png

左侧边栏有不少新的可选命令。我们会慢慢看。

配置Schema和中文支持在上图中,可以看到SOLR这个实例的运行环境。对该实例,我们需要定制它的schema。SOLR使用XML文件来配置表格的结构,该文件名为schema.xml,位于example/solr/collection1/conf目录下。SOLR似乎只依赖这单一一个文件进行数据库的管理。每次SOLR启动的时候会对该文件进行扫描并进行后台的重建(比如增加/删除了字段,改变了字段的类型和属性等),但是并不会丢失数据 SOLR样本数据库中的schema.xml非常庞大,作为用户,有必要进行定制。

另外一个对于全文搜索引擎而言,至关重要的是其对非英文内容的处理,对我来说,就是对中文的处理。所幸的是,SOLR对中文内容处理的非常好。

schema.xml基本结构如下:

  • 首行,必然是标准的XML文件声明:<?xml version=1.0 encoding=UTF-8 ?>
  • 跳过很长的注释后,就进入schema声明:<schema name=resource version=1.5>name用来标记这个schema,而version是该schema定义时用到的语法的版本,目前就用1.5好了。
  • 字段定义。SOLR有几个保留的字段名,分别是_version_(用于schema的版本更新维护),_root_(在使用嵌套文档的时候要用),id(唯一标识符,建议保留)。
  • 字段定义由若干XML属性完成,常见的有:
    • name:字段名
    • type:字段类型
    • indexed:是否要加入索引
    • stored:是否存入数据库
    • required:是否必须
    • multiValued:是否允许有多个该字段的值。比如一个文档的tag通常是多个,因此这个字段的定义我一般会设置multiValued=true
  • 字段类型的元定义。这个用来定义上面定义的字段的类型。比如一个int是怎样的类型?这点很奇怪,因为在我看来,这些基本类型应该不用再定义的。但是既然SOLR有这个要求,我们也不妨遵循。
  • 这个元定义中需要特别提一提text_cjk这个类型。它就是对一个中文字段进行全文分词检索的关键。如果一个字段是中文内容,并且我们要对它进行全文检索,那么将这个字段设置为这个类型比较好。

基本上,我对schema.xml的改动也就限于此。修改完毕后,重新启动SOLR,然后选择一个collection(目前也只有一个),然后用Schema Browser这个命令来看看我们更新后的数据库结构和某个字段的数据类型:

Ashampoo_Snap_2014.05.03_15h07m27s_001_SolrAdminMozillaFirefox_thumb.png

Ashampoo_Snap_2014.05.03_15h08m48s_002_SolrAdminMozillaFirefox_thumb.png

可以看到,content字段已经被设置为text_cjk类型。

加入文档SOLR显然是NoSQL的数据库,因此所有的数据库记录都以“文档”的形式出现。 由于我们修改了数据库结构,因此我们要对样本文档进行一些修改。所有样本文档都保存在example/exampledocs目录下。该目录下还有一个post.jar文件来帮助我们插入/更新文档。

一个典型的文档如下:

<add>
<doc>
  <field name=id>0000001</field>
  <field name=title>二十世纪唐宋诗之争</field>
  <field name=author>张毅</field>
  <field name=tag>文学</field>
  <field name=tag>唐诗</field>
  <field name=tag>宋诗</field>
  <field name=orig_date>2002-05-15T00:00:00.000Z</field>
  <field name=content>
    主讲人简介张毅,云南人,1957年出生。1991年毕业于南开大学中文系,获文学博士学位。1993年被评为副教授,1995年破格晋升为教授$
    二十世纪唐宋诗之争张毅教授首先介绍了“同光体的宗宋与南社的崇唐”。唐诗宋诗之争,实际上是涉及到了中国文学的发展的一个转折时$
    张毅教授讲到的第二个问题是介绍胡适、胡云翼、程千帆、缪钺、钱钟书等现代学者对宋诗的评价。
    张毅教授的第三个问题是宋人是否懂形象思维的问题。
    张毅教授的第四个问题是对宋诗特征的认识。宋诗的第一个特点,就是人文意象占优势。第二个特点是宋诗的文化蕴涵、艺术风格和唐诗$
</field>
</doc>
</add>

注意两点:

  1. id字段用于唯一标识一个文档。所以,如果id相同,那么进行的是更新操作;id不同,才进行插入操作。
  2. tag字段我们定义了multiValued,所以我们可以给一篇文档挂几个tag。

该文档可以用如下的命令插入数据库:

java -jar post.jar r1.xml

(我们假定post.jar和这个文档r1.xml在同一个目录下。)

用类似的方法,我们可以加入若干个文档。

SOLR还支持其它类型的文档的录入。比如我可以直接将一本ePub电子书加入进去。命令为:

curl http://localhost:8983/solr/update/extract?literal.id=doc1&commit=true -F <a href="mailto:myfile=@solr.epub">myfile=@solr.epub</a>

SOLR对文档进行全文索引的速度是非常非常快的。几乎在文档录入的同时,全文索引已经完毕。

我们接下来要看看如何查询。

查询和索引分析

选择右侧的Query命令,就进入这个界面:

Ashampoo_Snap_2014.05.03_15h24m47s_004_ChromeLegacyWindow_thumb.png

  • 在q中,我们输入要查找的关键词
  • 点选hl,并且
    • 在hl.fl中选择要高亮显示关键词的字段(content和tag)
  • 选择Execute Query,就得到右边的现实。
  • 在右边栏目最顶端,有一个针对该次查询的URI,我们可以点此处然后看完整的输出。

在下图,我们可以看到该次查询的返回是以JSON方式给出。在PHP中,我们已经可以通过访问该页面来获得JSON的返回值并进行进一步处理。

查询找到了两个文档有“唐诗”这个关键词,而且用/对将这个关键词进行了高亮处理。

Ashampoo_Snap_2014.05.03_15h33m10s_001_Chrome

注意,唐诗这个关键词是作为一个词被高亮显示的。这已经表明SOLR正确的对中文进行了分词和索引。我们可以进一步确认这点。

选择左侧的命令Analysis,在右侧的文本输入框中输入如下内容并选择Analyse Values:

Ashampoo_Snap_2014.05.03_15h36m41s_002_Chrome

我们可以很明确地看到,唐诗这个关键词是作为整体出现并被SOLR检索的。这证明了,SOLR对中文的分词是很强大的。

目前这个数据库的应用,我想放在我家中的服务器里,用来收藏我下载的电子书籍的内容(多为HTML,ePub,TXT格式)并进行全文检索。

第一部分就到这里。我们所使用的工具还没有超出SOLR本身。在第二部分,我们将结合使用Solarium这个PHP的SOLR库来进行进一步的处理。敬请期待。

本文收录于[go4pro.org]

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *