提高cms搜索的准确性

2024-07-29

提高cms搜索的准确性

1.提高cms搜索的准确性 篇一

1.1 Lucene.Net简介

Lucene是一个开放的全文搜索引擎架构, 提供了完整的查询引擎和索引引擎, 最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制, 并提供了扩展接口, 以方便针对不同应用的定制。

Lucene.Net是Java Lucene在.NET平台上最完整实现的一个开放源代码搜索引擎架构, 它采用C#开发, 完全实现了Java Lucene的每一个class和API, 因此功能与Java Lucene完全一致。

1.2 Lucene与数据库的对比 (略)

1.3 Lucene全文检索机制

Lucene全文检索通过把信息进行分解, 分解成众多的词元, 对每一个词元建立索引, 指明该词元在信息中出现的次数和位置, 查询的时候就在预先建立的索引中进行查找, 然后把查找的结果返回包含该关键词的文档索引号, 利用索引号就可以把信息展示给用户。因此其核心在于建立和维护索引库、提供快速有效的检索机制。在建立索引方面, Lucene是采用不断增加新的索引文件, 定期把这些小的索引文件进行合并的策略, 充分利用内存而减少对文件的操作, 提高索引效率。

2 CMS索引的建立与维护

2.1 索引内容抽象

CMS中管理的内容形式多样, 我们需要把不同形式的内容进行抽象, 建立需要索引的内容基本模型。用类实体的形式进行表示如下。

这样我们就可以为文章、图片、帖子、留言等不同的信息建立统一的索引模型, 这样当进行模糊查询的时候, 就可以实现对所有的信息进行查询的目的。否则就只能在查询系统中进行区分是查询新闻或者是查询论坛。

2.2 索引文档的建立

在CMS后台或者前台发布信息的时候, 及时增加索引文档。程序先把发布的信息组织成SearchContent, 然后通过如下方法创建索引文档。

Field.Store有两个选项:

COMPRESS压缩内容并存储在索引文件中, 通常用于长文本或二进制数据;

YES存储字段内容在索引文件中;

NO不保存内容到索引文件, 也就是不能通过Get方法获取字段值。

Field.Index有4个选项:

TOKENIZED分词且建立索引;

UN_TOKENIZED不分词但建立索引;

NO_NORMS和UN_TOKENIZED一样, 但是它把词条的附加信息全去掉了;

NO不建立索引。

2.3 索引文档添加到索引文件中

2.4 索引文档的删除和更新

在CMS中删除或者更新了信息之后, 我们也需要体现到索引中。

删除索引文档, 是对短语 (Term) 查询得到的进行删除操作。在索引字段中, Url是唯一标识每一条索引内容, 因此我们可以利用Url字段来实现唯一性查询条件。

由于Lucene中没有更新索引的功能, 因此更新操作需要其实就是先删除原有的索引再重新增加索引。

2.5 Lucene索引的性能优化

对大量信息进行索引是比较消耗时间和资源的操作, Lucene为我们提供了一些性能优化的工具。

MaxBufferedDocs:控制写入一个新的segment前内存中保存的document的数目, 设置较大的数目可以加快建立索引速度, 默认为10。如果内存资源充足, 可以设置多一点以减少文件操作。

MaxMergeDocs:控制一个segment中可以保存的最大document数目, 值较小有利于追加索引的速度, 默认Integer.MAX_VALUE, 无需修改。

MergeFactor:控制多个segment合并的频率, 值较大时建立索引速度较快, 默认是10, 可以在建立索引时设置为100。

由于CMS中对信息的维护是随机而零散的, 很难做到批量建立索引。而在操作一个大的索引文件时, 会消耗太多的系统资源。因此我们可以把索引分成基本不变的索引和经常变化的索引。

对经常变化的索引设置合适的MergeFactor参数, 让索引自动把多个segment进行合并。随着时间的推移, 我们再从经常变化的索引中把不再变化的部分合并到基本不变的索引中。

3 CMS站内搜索

3.1 搜索功能的实现

Lucene提供了很强大的查询接口, 利用这些接口可以实现丰富的查询功能。其中最为简单实用的就是MultiFieldQueryParser, 它封装了基本的查询接口, 让我们可以简单实现同时对多个字段进行查询。

上面的代码, 实现了同时在标题、摘要或者内容字段中对查询文本进行匹配。

有些信息需要授权才能访问, 因此需要对阅读权限进行处理。我们构建一个BooleanQuery查询, BooleanClause用于表示布尔查询子句关系的类, 包括:BooleanClause.Occur.MUST, BooleanClause.Occur.MUST_NOT, BooleanClause.Occur.S-HOULD, 一共有6种组合。

(1) MUST和MUST。取得连个查询子句的交集。

(2) MUST和MUST_NOT。表示查询结果中不能包含MUS T_NOT所对应得查询子句的检索结果。

(3) MUST_NOT和MUST_NOT。无意义, 检索无结果。

(4) SHOULD与MUST、SHOULD与MUST_NOT。SHOULD与MUST连用时, 无意义, 结果为MUST子句的检索结果。与MUST_NOT连用时, 功能同MUST。

(5) SHOULD与SHOULD。表示“或”关系, 最终检索结果为所有检索子句的并集。

3.2 获得分页查询结果

Hits获取到的是所有的查询结果索引, 我们要根据当前页号和页大小计算好记录开始和结束。

然后就可以取出分页的查询结果了。

3.3 查询结果的进一步处理

上面我们仅仅实现了查询结果的基本查询功能, 如果我们需要对结果排序或者过滤, 可以利用Lucene提供的Sort和Filter两个类, 用来实现对查询结果的排序与过滤。

可以利用词条搜索 (TermQuery) 、短语搜索 (PhraseQuery) 、通配搜索 (WildcardQuery) 、模糊搜索 (FuzzyQuery) 、前缀搜索 (PrefixQuery) 、范围搜索 (RangeQuery) 来构建高级搜索功能。

参考文献

[1]开放源代码的全文检索引擎Lucene[EB/OL].http://www.lucene.com.cn/about.htm, 2010.

[2]于天恩.Lucene搜索引擎开发权威经典[M].北京:中国铁道出版社, 2008.

上一篇:初二年级学生优秀自我评价下一篇:高级服务员考核标准