主页 > 数据库技术 | 服务器技术 > Drupal北京聚会主题之 – Apache Solr

Drupal北京聚会主题之 – Apache Solr

PDF版本

此文是 “drupal北京秋季聚会”的演讲主题之一《drupal search和Apache solr应用》,这里做一个简单介绍以及附件下载。
关于Drupal的性能优化讲座的PPT请参考《让猪去飞-Drupal性能优化经验贴》。

内容列表:
1. Drupal Search介绍及原理
2. Apache solr和Luncene原理介绍
3. Drupal和apachesolr模块
4. Apache Solr的扩展 

Drupal Search原理及介绍
Drupal 默认搜索是用Search模块实现搜索,该模块是用数据库建立索引,,通过数据 库查询来实现全文索引 。
Search模块主要用简单的英文分词法(空格),中文默认采用双字、三字分割 (@see search_expand_cjk) 。中文分词模块参考 csplitter.module 。
(原理请参见附件中插图。)
主要数据表:
search_dataset 已经被索引的数据表,将被搜索的对象。
search_index 索引后的索引,以及关联的sid、dataset。
search_node_links 这个表存储了链接到其它节点的项目(比如,节点);它用来改进那些拥有较多外链的节点的搜索分数。
search_total 这个表存储字词的搜索总数。
Apache Solr基本流程
Apache Solr是⼀一个Java的Web应用程序。
需要Java的Servlet容器,需要了解JavaEE的应用和部署。 Apache Solr基于Lucene需要了解Lucene的文档结构。
流程:HTTP请求 -> JavaServer -> Solr.war (根据solr.solr.home变量) ->Solr_Home目录/solr.xml ->操作Solr的实例、索引目录等。
(详见附件插图)。

Apache Solr索引原理与CCK字段

索引原理比较重要,所以单独贴出来。

apache solr索引机制

apache solr索引机制

默认情况下ApacheSolr 不索引CCK字段。 如果要索引CCK字段我们必须实现相应的HOOK,其中有两个HOOK可以实现。
1. HOOK_apachesolr_cck_fields_alter
参数 &$mappings, 把需要索引的字段放到$mapping[‘per-field’][$name]。
2. HOOK_apachesolr_update_index
参数 $document, $node, $namespace. 可以给$document对象添加任何field。
Apache Solr 配置文件之 solrconfig.xml1. solr服务器信息设置,

比如索引数据目录( !很重要)、多核索引、管理界面默 认查询分析器等。(注意:默认是solr不是lucene)

2. Lucence索引行为设置。

Apache Solr 配置文件之shema.xml

shema主要分两个部分 types和fields

types定义 => 一种字段类型
a. 每种类型里面可以有两个analyzer,⼀一个负责索引,⼀一个负责查询。 b. analyzer里面可以定义分词class的Factory
c. analyzer里面可以定义多个filter
d. 自定义分词需要在这里添加。比如中文分词。

fields定义 => 一个字段实例
a. 独立字段。⼀一个字段里面可以存储多个值。
b. 拷贝字段。
c. 动态字段。 比如 im_*, is_*等。 以is_开始的字段都应用此规则。

最后补充一下,制作ApacheSolr的启动脚本,文件放置于 /etc/init.d/solr

测试已通过,参考之 John的博客

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  !/bin/bash
  # description: Starts and stops Solr production
  set -e
  PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
  SOLR_DIR=/var/solr/ #SOLR DIR
  JAVA_OPTIONS="-Dsolr.solr.home=./solr -Djava.util.logging.config.file=logging.properties -server -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -Xmx1024M -Xms128M -jar start.jar"
  JAVA="/usr/bin/java"
  LOG_FILE="/var/log/solr/console.log"
 
  case $1 in
    start)
      echo "Starting Solr"
      cd $SOLR_DIR
    nohup $JAVA $JAVA_OPTIONS 2> $LOG_FILE &   
      echo "ok - remember it may take a minute or two before Solr responds on requests"
    ;;  
    stop)
      echo "Stopping Solr"
      cd $SOLR_DIR
      $JAVA $JAVA_OPTIONS --stop  
      echo "ok"
    ;;  
    restart)
      $0 stop
      sleep 3
      $0 start  
    ;;  
   *)  
      echo "Usage: $0 {start|stop|restart}" >&2exit 1
    ;;  
 esac

演讲PPT附件下载:
Drupal搜索原理及其Apache Solr.PDF

Solr性能优化讨论强烈推荐参考:
Scaling Lucene and Solr

推荐新篇
《Apache Solr 3.x与Drupal6以及中文分词的处理》


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


, ,

评论:6

发表评论
  1. avatar
    回复 Rebecca
    11/12/16

    博主很强大,我支持

  2. avatar
    回复 Alan
    11/12/20

    博主, drupal里solr对中文无法检索, 有什么解决办法吗? 感谢

  3. avatar
    回复 anson
    12/01/23

    Hi – (pardon me, do not speak chinese) we’re using http://drupal.org/project/apachesolr_custom_fields and want to add the new cck field into our display – our field is a text field “ts_new_description” what do we need to add to search-result.tpl.php? thank you very much

    • avatar
      回复 robbin
      12/01/27

      Apachesolr_custom_field is for apachesolr indexing, not for searching, so if you want to display any fields you want, I think the workflow is,

      indexing cck(using apache_custom_field) –> searching with criteria (e.g cck_field_value==’xxx’) —> parse the searching result (such as get nid) –> load node from Drupal DB (via nid) –> display it (cck_field is same, add any fields into tpl result).

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


8 − 六 =

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

顶部