• 利用Lucene.net搭建站内搜索(3)创建索引


    Lucene.net提供了很全面的数据搜索操作,你可以利用Lucene.net检索磁盘中的文件,网页,数据库中的数据,但是前提是预先对数据创建索引。
    Lucene索引过程分为三个主要的操作阶段:将数据转换成文本分析文本、并将分析过的文本保存到索引库中。如图所示:

    1.数据转成文本:须将数据转换成Lucene能够处理的格式——纯文本字符流。

    2.分析文本:完成了针对待索引数据的预处理操作,并创建了带有若干个域的Document对象,就可以调用IndexWriter的addDocument(Document)方法,将数据传递给Lucene来进行索引操作。在对数据进行索引处理时,Lucene会首先分析(analyze)数据使之更加适合被索引。

    3.将分析过的文本保存到索引库中:对输入数据分析处理完之后,就可以将结果写入到索引文件中。Lucene将输入数据以一种称为倒排索引(inverted index)的数据结构进行存储。在进行关键字快速查找时,这种数据结构能够有效地利用磁盘空间。

    下面介绍下Lucene.net中处理索引的类
    IndexWriter
    IndexWriter是索引中负责操作的核心,它负责把索引文件写入存储介质,是控制逻辑存储转换为物理存储的纽带。

    Document
    Document就是一条虚拟记录,可以理解为数据里的一行。正是有了它,才使我们可以很方便并且易于理解地操作索引文件。它一般记录了需要用到的一个文档的属性,当然,这需要和Field联合使用。

    Field
    Field类就是数据库里的一列。一个文档有标题,内容,作者,创建时间这四个属性的话,那么就需要四个Field保存这些属性,然后把四个Field加入到Document中。
    Field的构造函数比较多。其中Store,Index和TermVector是通过内部类指定的。

    (1)--Store 有三个选项:
    Field.Store.COMPRESS表示被压缩存储;
    Field.Store.YES表示储存;
    Field.Store.NO表示不被存储。

    (2)--Index的选项有四个:
    Field.Index.NO表示不建立索引;
    Field.Index.TOKENIZED表示分词后索引;
    Index.NO_NORMS表示值存储内容;
    Field.Index.UN_TOKENIZED表示不分词索引。

    (3)--TermVector这个参数也不常用,它有五个选项。
    Field.TermVector.NO表示不索引Token的位置属性;
    Field.TermVector.WITH_OFFSETS表示额外索引Token的结束点;
    Field.TermVector.WITH_POSITIONS表示额外索引Token的当前位置;
    Field.TermVector.WITH_POSITIONS_OFFSETS表示额外索引Token的当前和结束位置;
    Field.TermVector.YES则表示存储向量。

    通过实例生成数据索引:

    这里我将数据保存在Access数据库中,对Access数据库中的数据进行索引:
    保存数据的表:数据库中保存了1000条数据
     

    为数据创建索引代码:

    Code

    传入参数,生成索引文件:

    Code

    其中dt是保存数据的DataTable,wordpath是分词器的词库文件chsstopwords.txt,engstopwords.txt,dict.dct的路径,indexDirectory是生成索引文件的路径。
    生成索引成功后,我们会在index文件夹下看到生成的文件:

    这样,我们就创建好了数据的索引。检索数据的时候,我们就可以利用它快速的对数据进行检索。

  • 相关阅读:
    mysql 新用户添加和权限
    分治法
    插入排序
    猴子分桃问题
    关于PHP面向对象 静态方法的疑问
    php中static 静态变量和普通变量的区别
    php函数引用返回
    redis 限制请求次数的写法
    cas单点登录认证原理
    聚簇索引和非聚簇索引
  • 原文地址:https://www.cnblogs.com/gaoweipeng/p/1573118.html
Copyright © 2020-2023  润新知