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 ...
随机推荐
- win7下wordPress本地搭建博客详解(深度亲测整理---傻瓜式详细教程)
搭建一个wordPress作为一个个人博客本来是特别简单的事情,但是网上的各种转载让初学者举步维艰,我就本身条件而言,会java EE,懂mysql都花费了我好长时间才搭建好本地博客. 注意:这个是本 ...
- C# 窗体在线2,8,16进制转换以及,在线更新时间
class Program { static void Main(string[] args) { //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Consol ...
- Java正则表达式基本应用
一.概述 正则表达式因为其强大的字符串处理能力,刚开始被被广泛地应用到各种UNIX工具中,如大家熟知的 Perl脚本语言 .后来正则表达式在各种 计算机语言 和各种应用领域得到了广泛的应用和发展,目前 ...
- Java:利用java Timer类实现定时执行任务的功能
一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...
- spark论坛
http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...
- TCP拥塞控制算法内核实现剖析(十)
内核版本:3.2.12 主要源文件:linux-3.2.12/ net/ ipv4/ tcp_veno.c 主要内容:Veno的原理和实现 Author:zhangskd @ csdn blog 概要 ...
- 数学之路-python计算实战(15)-机器视觉-滤波去噪(归一化块滤波)
# -*- coding: utf-8 -*- #code:myhaspl@myhaspl.com #归一化块滤波 import cv2 import numpy as np fn="tes ...
- hdu4722之简单数位dp
Good Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- 有关android工程的构建脚本(build.xml)的学习
学习[android-sdk-linux根目录]/tools/ant/build.xml,觉得如下几点很有用,记录之 1)ant脚本中属性值是于前置定义优化的原则,即属性发生重复定义时,前面定义的值不 ...
- ssh登录的时候,根本不给输入密码的机会,直接拒绝,是因为BatchMode的设置
BatchMode no“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止.当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分 ...

代码 4.1.1