You are here

drupal索引器的工作原理

g089h515r806 的头像
Submitted by g089h515r806 on 星期四, 2009-08-20 14:55

 

索引器有一个预处理模式,在该模式下将使用一组规则对文本进行过滤从而分配分数。这些规则包括:处理缩略语、URLs、和数字数据。在预处理期间,其它模块有一个机会可用来向这个流程中添加逻辑,从而执行它们自己的数据操作。在针对特定语言调优时,这点会非常方便,如下所示,这里我们使用了第3方模块Porter-Stemmer:
 
• resumé ä resume (accent removal重音符删除)
• skipping ä skip (stemming词干)
• skips ä skip (stemming词干)
 
    另外的一个语言预处理例子就是,对汉语、日语、和韩语所进行的切词,这是为了确保文本被恰当地索引了。
 
提示 Porter-Stemmer模块(http://drupal.org/project/porterstemmer)是一个例子,它通过提供单词词干化来改进英语搜索。同样,中文分词模块(http://drupal.org/project/csplitter)是一个增强的预处理器,用来改进中文、日文、和韩文的搜索。在搜索模块中包含了一个简单的中文分词器,可以在搜索设置页面启用它。
 
    预处理阶段过后,索引器使用HTML标签来查找更重要的字词(称为令牌),基于HTML标签的默认分数和每个令牌出现的次数来为它们分配调整过的分数。这些分数将用来判定令牌的最终相关度。下面是默认HTML标签分数的完整列表(它们定义search_index()中):
 
<h1> = 25
<h2> = 18
<h3> = 15
<h4> = 12
<a> = 10
<h5> = 9
<h6> = 6
<b> = 3
<strong> = 3
<i> = 3
<em> = 3
<u> = 3
 
    让我们摘取一大块HTML,然后使用索引器对其处理,从而来更好的理解索引器的工作原理。图12-6显示了HTML索引器的概览:解析内容,为令牌分配分数,将该信息存储在数据库中。
 
12-6.对一大块HTML进行索引并为令牌分配分数
 
    当索引器碰到一个由标点分隔的数字型数据时,它将删除标点并只对数字进行索引。这使得数字型元素比如日期、版本号、IP地址等将会更容易的被搜索到。图12-6中的中间步骤显示了如何处理一个没有使用HTML标签的字词令牌。这些令牌的重量为1。最后一行显示了使用强调标签<em>的内容。用来决定令牌总分的公式如下:
 
匹配数量 * HTML标签重量
 
    还需要注意的是Drupal索引节点的过滤输出;例如,如果你有一个输入过滤器,它将URL自动转化为了超链接,或者有另外一个过滤器将换行转化为了HTML的<br/>和<p>标签,那么索引器将看到这些带有标签的内容,并会根据这些标签来分配分数。对于使用PHP求值程序过滤器来生成动态内容的节点,对其过滤后的内容进行索引,那么效果会更加明显。索引动态内容可能是非常麻烦的,但是由于Drupal的索引器只看到了由PHP代码生成的内容输出,所以动态内容也是完全可被索引的。
    当索引器碰到内部链接时,也将用一种特殊方式对它们进行处理。如果一个链接指向了另一个节点,那么链接的字词将被添加到目标节点的内容中,这使得能够更方便的搜索常见问题的答案和相关信息。可以使用两种方式钩住索引器:
 
• hook_nodeapi('update index'): 为了调整搜索相关度,你可以向节点中添加在其它情况下不可见的数据。你可以在Drupal核心中看到这方面的实例,比如分类术语和评论,从技术上来讲它们不是节点对象的一部分,但是它们应该能够影响搜索结果。分类模块通过实现nodeapi('update index'),在索引阶段期间,将这些项目添加到了节点中。你应该记起hook_nodeapi()仅用来处理节点。
 
• hook_update_index():通过使用hook_update_index(),你可以使用索引器对那些不属于节点的HTML内容进行索引。Drupal核心中有个hook_update_index()实现,参看modules/node/node.module中的node_update_index()。
 
    在cron运行期间,为了索引新的数据,这两个钩子都将被调用。图12-7显示了这些钩子的运行次序。
 
12-7. HTML索引钩子的概览
 
    我们将在接下来的部分中,来更详细的讨论这些钩子。
 老葛的Drupal培训班 Think in Drupal

Drupal版本: