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

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

4.1 搜索与什么有关

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

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

代码 4.1.1
/// <summary>
/// 搜索
/// </summary>
/// <param name="querystring">搜索输入</param>
private void Searcher(string querystring)
{
Analyzer analyzer = new StandardAnalyzer();
IndexSearcher searcher = new IndexSearcher("IndexDirectory");
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.Parse(querystring);
Hits hits = searcher.Search(query);
for (int i = ; i < hits.Length(); i++)
{
Document doc = hits.Doc(i);
}
}

如代码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的各个子类的用途,从下一篇开始。

Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)的更多相关文章

  1. Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...

  2. Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...

  3. Lucene.Net 2.3.1开发介绍 —— 三、索引(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...

  4. Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...

  5. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  6. Lucene.Net 2.3.1开发介绍 —— 三、索引(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...

  7. Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...

  9. Lucene.Net 2.3.1开发介绍 —— 三、索引(七)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之0505选数

     题目

  2. div无法触发blur事件解决的方法

    默认情况下div无法获取焦点,无法触发focus与blur事件,推測span,a等标签也无法触发焦点事件(input:button.及button标签能够触发) 怎样使div触发blur事件:能够给d ...

  3. oracle dg坏境主库redolog改动大小

    --备库standby 主库四个redolog 曾经都是50M大小 SQL> alter database recover managed standby database cancel;   ...

  4. Qt 学习之路 2(75):线程总结

    前面我们已经详细介绍过有关线程的一些值得注意的事项.现在我们开始对线程做一些总结. 有关线程,你可以做的是: 在QThread子类添加信号.这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送 ...

  5. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  6. spark论坛

    http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...

  7. Swift - .plist文件数据的读取和存储

    每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息.我们也可以自己创建.plist文件来进行数据的存储和读取. .plist文件其实就是一个XML格式 ...

  8. lua语法 - 基础篇

    1. 注释 单行注释:--,类似于C++的// 多行注释:--[[ ... ]],类似于C++的/*...*/ 2. 语句 分隔符:分号或者空格,一般多行写一起,建议用分号 语句块:do ... en ...

  9. UML02-用例图

    1.泛化表示一般和特殊的关系.用例之间存在泛化关系,参与者之间存在泛化关系,参与者和用例之间存在泛化关系. 2.画出用例图. 系统允许管理员通过磁盘加载存货数据来运行存货清单报告: 管理员通过从磁盘加 ...

  10. C++ 中使用boost::property_tree读取解析ini文件

    boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是  ...