• Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)


    既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索。搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此,搜索和索引一般是分开部署。简单地说,就是一个应用程序(桌面程序)来索引,一个WEB程序来实现搜索。当然,为了测试的时候简单,这里还是使用NUnit的方式运行。搜索讲完后,将会简单介绍单机搜索引擎如何部署。

    4.1 搜索与什么有关

    搜索与什么有关呢?即使没有看过前面的文章,那么现在来随便猜一猜。

    首先,搜索一定与索引有关,如果无关的话,我们根本不需要建立索引。然后,搜索肯定与分词有关,因为,索引是在分词的基础上建立起来的。还有,分词一定与查询关键字有关,否则,怎么去搜索呢?搜索确实与上面我们猜到的都有关系,但是,在搜索里,分词的作用和索引中的分词的作用是不一样的。

    代码 4.1.1

    如代码4.1.1,构造搜索器用到了上面的三个要素,但是分词器并没有和IndexSearcher产生关系。从上面的代码中也可以看出与搜索紧密相关的一个是索引文件,一个查询表达式。索引文件就像是数据库,而查询表达式就是T-SQL语句。当然,这里的查询表达式需要借用分词器来分词字符串从而获得。

    4.1.1 搜索与索引
    搜索和索引是什么关系?索引是记录数据的操作,而搜索是筛选数据的操作,这个本质上和"select * from table"没有任何区别,但是这里,这样使用将使得查询的速度更加高效。可以说索引在为搜索作准备,或者说索引是搜索的数据源。索引的过程是按照一定的结构把各种分散的数据全都集中到这里来。更准确地说索引这个动作是在为搜索做准备,而索引文件本身则只是数据。

    4.1.2 搜索与表达式
    搜索与表达式是什么关系呢?想想一下,在数据库操作中,那么就是搜索是一个动作,而表达式呢就是一个表达式,用来筛选的条件表达式。它们是不可分割的一个整体。如果没有表达式,搜索就没有意义;如果不进行搜索,表达式就是伪代码,什么也干不了。

    4.1.3 分词器与表达式
    分词器则是充当了翻译的角色,它是索引文件与查询表达式沟通的桥梁。如果搜索和索引使用不同的分词器,注意,这里要的是分词效果不一样的分词器,那就搜索不到想要的东西。表达式解析器将会通过分词器把一个字符串翻译成搜索懂得语言,然后再到索引文件中进行筛选。

    4.1.4 Lucene.Net的搜索流程
    在Lucene.Net中,,把构造表达式考虑进去,那么搜索将会要经历:
    (1)、构造查询表达式;
    (2)、打开索引文件,IndexSearcher会通过IndexReader类打开索引文件;
    (3)、得到查询表达式的一个筛选值——Weight;
    (4)、查询缓冲中是否有适合的记录,如果有则读取,否则扩容,扩容的过程是根据Weight计算出来的;
    (4)、返回结果。

    当然,以上的流程是抛开很多分支处理的。

    4.2 搜索核心类
    在操作中搜索将会有到4个核心类。

    4.2.1 IndexSearcher
    毫无疑问,IndexSearcher肯定是其中的一个。它会打开索引文件,当然,它不会使用Lucene.Net的锁,因此,可以理解为只读操作。Search方法可以说是它最重要的方法,将由这个方法来返回我们需要的结果。

    4.2.2 Query
    Query类作为查询表达式的载体同样至关重要。而它的非常多的子类在让我们头疼的同时也庆幸有这么多,才有那么强大的功能。

    4.2.3 QueryParser
    QueryParser是Query的构造器,后面将会展示QueryParser和Query一起给我们带来的神奇体验。

    4.2.4 Hits
    从语义上命中的集合,当然就是我们要的结果集。它记录了我们查询到的文档指针,以及这些文档的几个重要属性,比如评分,比如内部ID号。

    在讲用各个类配合实现查询之前,将会先浏览一下Query的各个子类的用途,从下一篇开始。

  • 相关阅读:
    fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏
    CI:模拟进化与遗传算法
    贝叶斯网络
    朴素贝叶斯模型
    概率与不确定性(乘法法则与贝叶斯法则)
    关于“启发式”搜索的一个形象解释
    Python 字符串与数字拼接报错
    无法启动此程序因为计算机中丢失 xxx.dll
    Python 以指定的概率选取元素
    验证码之SimpleCaptcha (二)
  • 原文地址:https://www.cnblogs.com/birdshover/p/1297425.html
Copyright © 2020-2023  润新知