原文: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. Android中文API(129) —— AudioManager

    前言 本章内容是android.media.AudioManager,版本为Android 3.2 r1,翻译来自"文炜",欢迎访问他的博客:"http://www.cn ...

  2. c语言中float、double、long double在内存中存储方式

    存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m  和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...

  3. Python的strip()与split()

    ==>the start 说实话刚开始我对strip()和split()这两个还真的不太懂,后来在网上查了资料才明白. 可能别人觉着这俩很好区分,但是我最开始确实是有点分不清的,或者说不太确定这 ...

  4. 如何在VMware中修改Mac OS的屏幕分辨率

    关于mac os分辨率问题:方法一:临时方法,只对当次启动有效,即在启动倒计时的时候,回车,等待输入参数是输入如下文本:“Graphics Mode"="1280x800x32@6 ...

  5. Android Studio安装教程

    Google在2013 I/O大会上发布Android Studio之后,广大Android开发者欢欣鼓舞,不过很快就有人出现问题,Android Studio无法安装,或者安装后无法启动,这篇文章就 ...

  6. .NET支持上下左右移动操作

    效果如下图: 代码如下: public partial class ShowSet : System.Web.UI.Page { Hashtable resources = EquStatusSear ...

  7. Linux命令之chown

    chown 更改文件全部者和组 语法: chown [OPTION]  [OWNER][:[GROUP]] FILE chown [OPTION] --reference=RFILE  FILE 描写 ...

  8. C#中一些易混知识的比较

     Equals 和==的区别         C#中有两种不同的相等:引用相等和值相等         ==是比较两个变量的值是否相同或两个引用是不是指向同一个内存地址.         Equals ...

  9. QFrame好像是万能的(可以随意画线,或者图片,放在其它元素之间做点缀,还可OnClick)

    QFrame *fr2=new QFrame(this); fr2->setGeometry(0,140,90,40); fr2->setStyleSheet("backgrou ...

  10. QTableWidget表格合并若干问题及解决方法

    Qt提供 QTableWidget作为表格的类以实现表格的基本功能,表格中所装载的每一个单元格由类QTableWidgetItem提供.这是基于表格实现 Qt提供的一个基础类,若想实现定制表格和单元格 ...