欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Drupal集成ApacheSolr-3.x以及中文分词处理

本文主要讲解drupal和Apache solr-3.x的集成以及对中文分词的处理,如需详细了解Drupal Search以及Apache solr的工作原理,请参阅前文《Drupal北京聚会主题之 – Apache Solr》。

在默认情况下,Drupal6使用的是Apache Solr 1.4版本,但是Apache Solr新版本已经升级到了3.x,所以1.x版本可能会慢慢不再支持,所以升级到Apache Solr 3.x还是很有必要的,我们这里做一下简要的介绍以及在Drupal Apachesolr中如何处理中文分词的相关问题。

升级到apachesolr 3.x

由于版本的兼容问题,我们选择第一个3.x版本,Apache Solr-3.1.0作为Apache Solr的主版本,来与Drupal6一起测试。首先要安装Drupal的apachesolr模块,具体的安装操作在Drupal Apchesolr模块的README.txt里面有详细说明,在这只大概列举一下。

  1. 下载apachesolr模块

  2. 下载SolrPhpClient包,具体参考apacheslor README文件

  3. 从Apache网站下载solr包

  4. 把drupal apachesolr中的schema.xml和solrconfig.xml拷贝到solr的example/solr/conf/下(注意备份源文件)

  5. 到solr的example下,java -jar start.jar 启动SOLR


在笔者测试3.1.0的过程中,没有发现不兼容的情况,一切能正常工作。但是Solr 3.1.0带来了几个新的字段类型,在默认的schema文件并没有体现,所有我们可以把这几个字段添加到schema文件中。

<fieldType name="point" dimension="2" subFieldSuffix="_d"/>
<fieldType name="location" subFieldSuffix="_coordinate"/>
<fieldtype name="geohash"/><field name="coordinates" type="location" indexed="true" stored="true"/>
<dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>

其中主要是location字段,用于标记坐标值。然后可以写自定义代码,把这种location字段添加到apachesolr的document中。

function MYMODULE_apachesolr_update_index(&$document, $node) {
  // check for location data
  if (empty($node->field_location[0]['latitude']) || empty($node->field_location[0]['longitude'])) {
     $document->coordinates = $node->field_location[0]['latitude'] . ','
     . $node->field_location[0]['longitude'];
  }
  return;
}

注意:由于升级的原因,一些旧的类可能被弃用,所以在启动的时候,我们能发现很多类似下面的warning,如何修正,请参阅Solr官方文档说明。

LowerCaseFilterFactory is using deprecated

中文分词以及搜索

安装中文分词包

中文分词我们选择IKAnalyzer包,官方地址:http://code.google.com/p/ik-analyzer/

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

注意:本文中使用的是最新版本,3.2.8版本。

下载好jar包之后,放到solr/WEB-INF/lib。

注意:如果是使用的是一个单独的solr.war文件,没法打开WEN-INF/lib文件夹,需要把jar放到servlet能加载到的地方。也可以把IKAnalyzer包重新打包到solr.war里面再部署。笔者使用jetty,把IKAnalyzer放到了jetty自动生成的解压工程项目下面,如work/Jetty_0_0_0_0_8983_solr.war__solr__k1kf17/WEB-INF/lib。

修改schema文件

使用中文字段有两种方法,
1. 定义一种新字段类型,类似solr中schema文件里面的注释,然后把document中的中文字段,设置为该类型。

<fieldType name="text_greek" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
</fieldType>

上面的代码定义了一种新的类型的字段,如果我们要定义中文字段,只需把上面的analyzer修改成org.wltea.analyzer.solr.IKTokenizerFactory即可。
比如,我们可以定义一种字段类型叫text_zh,然后在fields里面定义新的field,type设置成text_zh即可。

2. 修改现有字段
为了简洁,我们可以直接修改FieldType里面对text的定义,把tokenizer全部修改成org.wltea.analyzer.solr.IKTokenizerFactory,然后可以删掉一些用不上的filter。如下:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
...

修改完之后,重启solr服务器。然后在Drupal里面重新运行solr的index,进行测试。

测试结果

无中文分词包
这个界面是在没有使用中文分词时,建立索引之后的页面,没有搜索到任何我们想要的结果。
Drupal搜索中文

这里,我们可以使用solr自带的工具来分析一下,地址如下:

http://127.0.0.1:8983/solr/admin/analysis.jsp

输入一段中文,结果如下

可见,默认的分词——按照空格分词——并不能很好的进行中文分词,所以我们通过solr根本没法搜索出我们想要的结果。

中文分词

这个结果是使用中文分词包后,重新索引数据后的搜索结果

同样地,我们可以使用solr自带的分析工具测试结果 http://127.0.0.1:8983/solr/admin/analysis.jsp

如图,分词包工作良好。由于我们还没有设置相应的过滤词,所以索引结果里面会出现一些没有意义的词,比如“在”、“的”等。具体的设置,IKAnalyzer的文档里面有详细的说明,本文就不做赘述。

至此,Drupal6与ApacheSolr-3.1.0的集成以及中文分词包的安装测试完成,使用ApacheSolr可以很大的提高Drupal性能,提高网站效率。当然,在具体实践中可能出现其他相关问题,我们会在以后的篇幅中另行讨论。

参考文章:
Drupal北京聚会主题之 – Apache Solr
Geospatial Apache Solr searching in Drupal 6 by upgrading Solr to 3.1
solr 3.4配置中文分词IKAnalyzer3.2.8

PS:参考新篇 《Apache Solr 快速启动包以及中文分词集成


声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。 
本文有效链接: http://www.drupal001.com/2012/03/drupal-apachesolr3-chinese/ 
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


来自 http://www.drupal001.com/2012/03/drupal-apachesolr3-chinese/

普通分类: