Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
原文: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开发介绍 —— 四、搜索(一)的更多相关文章
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(四)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(四)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(三)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(七)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...
随机推荐
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- UItableViewCell上的button点击无响应的办法
由于IOS7中添加了滑动后出现编辑按钮的操作,所以使用scrollView来处理,UITableViewCellScrollView有对触摸的相应处理,导致按钮的点击效果被屏蔽了,但是点击事件还是在的 ...
- CSS3_3D效果(IE10_火狐_谷歌)
好久没写博客了,看了下记录,上次最后写的最后一篇已经是8月1号了,最近有些小东西整理下,当巩固吧 废话少说,直奔本文主题 css3提供了很多新鲜好玩的东西,transform就是其中一个,可以进行 2 ...
- 在win8.1上用Bitvise SSH Server 6.24(原名winsshd)搭建SSH2服务器
注意:此SSH是指运维领域的 SSH,不是指JavaWeb框架中的SSH. 运维领域:SSH=Secure Shell安全外壳协议 JavaWeb框架:SSH=Spring+Struts+Hibern ...
- X窗口系统名词解释
前端时间Gentoo的桌面环境出了点问题,发现自己对Linux的桌面环境了解的很少,于是恶补了一下知识,以下名词解释基本上都是来自维基百科的条目和<Linux程序设计(第三版)>.一般而言 ...
- Android 修改屏幕解锁方式
Android 修改屏幕解锁方式 问题 在手机第一次开机的时候,运行手机激活的APP 在激活APP允许过程中,当用户按电源键的时候,屏幕黑掉,进入锁屏状态 手机默认的锁屏是滑动解锁 用户这个时候再一次 ...
- GPSR协议移植
修改的文件有packet.h.cmu-trace.cc.priqueue.cc.ns-packet.tcl.Makefile 1.在 $HOME/ns-allinone-2.29/ns-2.29下新建 ...
- 高斯拉普拉斯算子(Laplace of Gaussian)
高斯拉普拉斯(Laplace of Gaussian) kezunhai@gmail.com http://blog.csdn.net/kezunhai Laplace算子作为一种优秀的边缘检测算子, ...
- QQ登录-第三方SDK的接入总结
由于项目的需要,使用了[QQ登录]SDK 的相关功能! 1.集成[QQ登录]SDK [QQ登录]SDK下载地址: http://wiki.open.qq.com/wiki/website/SD ...
- 利用T4模版生成EF实体
直接上代码,只需要修改EF实体的地址就可以了. <#@ template language="C#" debug="false" hostspecific ...

代码 4.1.1