<iframe marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/images/b.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
在前面的系列我们一直在介绍有关索引建立的问题,现在是该利用这些索引来进行搜索的时候了,Lucene良好的架构使得我们只需要很少的几行代码就可以为我们的应用加上搜索的功能,首先让我们来认识一下搜索时最常用的几个类.
查询特定的某个概念
当我们搜索完成的时候会返回一个按Sorce排序的结果集Hits. 这里的Score就是接近度的意思,象Google那样每个页面都会有一个分值,搜索结果按分值排列. 如同你使用Google一样,你不可能查看所有的结果, 你可能只查看第一个结果所以Hits返回的不是所有的匹配文档本身, 而仅仅是实际文档的引用. 通过这个引用你可以获得实际的文档.原因很好理解, 如果直接返回匹配文档,数据量太大,而很多的结果你甚至不会去看, 想想你会去看Google 搜索结果10页以后的内容吗?
下面用一个例子来简要介绍一下Search
先建立索引
namespace dotLucene.inAction.BasicSearch
{
[TestFixture]
public class BaseIndexingTestCase
{
protected String[] keywords = {"1930110994", "1930110995"};
protected String[] unindexed = {"Java Development with Ant", "JUnit in Action"};
protected String[] unstored = {
"we have ant and junit",
"junit use a mock,ant is also",
};
protected String[] text1 = {
"ant junit",
"junit mock"
};
protected String[] text2 = {
"200206",
"200309"
};
protected String[] text3 = {
"/Computers/Ant", "/Computers/JUnit"
};
protected Directory dir;
[SetUp]
protected void Init()
{
string indexDir = "index";
dir = FSDirectory.GetDirectory(indexDir, true);
AddDocuments(dir);
}
protected void AddDocuments(Directory dir)
{
IndexWriter writer=new IndexWriter(dir, GetAnalyzer(), true);
for (int i = 0; i < keywords.Length; i++)
{
Document doc = new Document();
doc.Add(Field.Keyword("isbn", keywords[i]));
doc.Add(Field.UnIndexed("title", unindexed[i]));
doc.Add(Field.UnStored("contents", unstored[i]));
doc.Add(Field.Text("subject", text1[i]));
doc.Add(Field.Text("pubmonth", text2[i]));
doc.Add(Field.Text("category", text3[i]));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Close();
}
protected virtual Analyzer GetAnalyzer()
{
PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(
new SimpleAnalyzer());
analyzer.AddAnalyzer("pubmonth", new WhitespaceAnalyzer());
analyzer.AddAnalyzer("category", new WhitespaceAnalyzer());
return analyzer;
}
}
}
这里用到了一些有关Analyzer的知识,将放在以后的系列中介绍.
查询特定的某个概念
然后利用利用TermQery来搜索一个Term(你可以把它理解为一个Word)
[Test]
public void Term()
{
IndexSearcher searcher = new IndexSearcher(directory);
Term t = new Term("subject", "ant");
Query query = new TermQuery(t);
Hits hits = searcher.Search(query);
Assert.AreEqual(1, hits.Length(), "JDwA");
t = new Term("subject", "junit");
hits = searcher.Search(new TermQuery(t));
Assert.AreEqual(2, hits.Length());
searcher.Close();
}
利用QueryParse简化查询语句
显然对于各种各样的查询(与或关系,等等各种复杂的查询,在下面将介绍),你不希望一一对应的为它们写出相应的XXXQuery. Lucene已经为你考虑到了这点, 通过使用QueryParse这个类, 你只需要写出我们常见的搜索语句, Lucene会在内部自动做一个转换.
这个过程有点类似于数据库搜索, 我们已经习惯于使用SQL查询语句,其实在数据库的内部是要做一个转换的, 因为数据库不认得SQL语句,它只认得查询语法树.
让我们来看一个例子.
[Test]
public void TestQueryParser()
{
IndexSearcher searcher = new IndexSearcher(directory);
Query query = QueryParser.Parse("+JUNIT +ANT -MOCK",
"contents",
new SimpleAnalyzer());
Hits hits = searcher.Search(query);
Assert.AreEqual(1, hits.Length());
Document d = hits.Doc(0);
Assert.AreEqual("Java Development with Ant", d.Get("title"));
query = QueryParser.Parse("mock OR junit",
"contents",
new SimpleAnalyzer());
hits = searcher.Search(query);
Assert.AreEqual(2, hits.Length(), "JDwA and JIA");
}
由以上的代码可以看出我们不需要为每种特定查询而去设定XXXQuery 通过QueryParse类的静态方法Parse就可以很方便的将可读性好的查询口语转换成Lucene内部所使用的各种复杂的查询语句. 有一点需要注意:在Parse方法中我们使用了SimpleAnalyzer, 这时候会将查询语句做一些变换,比如这里将JUNIT 等等大写字母变成了小写字母,所以才能搜索到(因为我们在建立索引的时候使用的是小写),如果你将StanderAnalyzer变成WhitespaceAnalyzer就会搜索不到.具体原理以后再说.
+A +B表示A和B要同时存在,-C表示C不存在,A OR B表示A或B二者有一个存在就可以..具体的查询规则如下:
其中title等等的field表示你在建立索引时所采用的属性名.
相关推荐
Lucene.Net ultra fast search for MVC or WebForms site => made easy!
Apache Lucene.Net is a C# full-text search engine. Apache Lucene.Net is not a complete application, but rather a code library and API that can easily be used to add search capabilities to applications...
产品开发目前基于C# Lucene.Net 软件包括两个个部分: 1、jwSearchEngine索引器: 索引器是用来把数据库内的数据索引成索引文件来使用的,注意目前的1.0版本仅仅支持 SqlServer数据库 2、网站程序 网站直接...
Apache Lucene.NET网站位于: : 支持的框架Lucene.NET 3.0.3 .NET Framework 4.0 .NET Framework 3.5Lucene.NET 4.8.0 .NET Framework 4.5地位最新稳定版本:Lucene.NET 3.0.3 致力于Lucene.NET 4.8.0(当前在BETA...
Lucene.net要求您创建索引,然后才能使用Lucene.Net进行查询。 请尝试转到CodeProject搜索页,或者如果需要,请访问Google。 有很多有关使用Lucene和... 实际上,CodeProject使用Lucene.Net进行Search.Indexing ...
基于EntityFrameworkCore和Lucene.NET实现的全文检索搜索引擎 基于EntityFrameworkCore和Lucene.NET实现的全文检索搜索引擎,可轻松实现高性能的全文检索。可以轻松应用于任何基于EntityFrameworkCore的实体框架...
基于ASP.Net和Lucene.Net开发的站内搜索引擎Demo源码+项目说明+sln解决方案.zip 1)EDC.SearchEngine.Dao 顾名思义,数据访问层,与数据库进行交互,各种SQL! (2)EDC.SearchEngine.Service 业务逻辑层,对...
导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单...
LuceneWrapper 基于Lucene.NET的搜索实现的源代码
开源全文搜索工具包Lucene2.9.1的使用。 1. 搭建Lucene的开发环境:在classpath中添加lucene-core-2.9.1.jar包 2. 全文搜索的两个工作: 建立索引文件,搜索索引. 3. Lucene的索引文件逻辑结构 1) 索引(Index)由...
针对已知坐标search一定范围内的其他point,根据分类或名称进行search,源文件为类似"PVID","ELPVID","POINAME" 的UTF-8的csv文件
基于Lucene.Net的快速全文本搜索工具 特征 支持多个索引 自动监视索引文件的更改 支持对文件内容,名称,位置,扩展名的各种搜索(例如:模糊,通配符,区分大小写) 支持Docker 支持Visual Studio 展示现场 指导 ...
通过Examine,您可以轻松地对数据进行索引和搜索,并包装Lucene.Net索引/搜索引擎。 Lucene超级快,即使在非常大量的数据上也允许非常快速的搜索。 检查是非常可扩展的,它允许您配置任意数量的索引,并且每个索引...
源代码全文搜索 用C#编写的用于使用Lucene.Net进行全文本搜索的源代码的小工具 用法 索引源代码 搜索 支持索引源代码文本文件,office,pdf
elasticsearch-8.2.3 windows 版本。 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的...
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级...
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级...
.Net爬虫是用asp.net编写的一个由三部分组成的系统,它包括一个爬虫,索引系统和一个基于lucene的前端搜索引擎。 您也可以通过http://www.gurucoding.com访问我们。
2008年5月份,因学习《信息检索》课程,本人利用java的开源搜索引擎库lucene,以及结合ajax技术google-suggest功能,模仿baidu、google的基本风格做了个“Baioogle-SearchEngine(百歌搜索引擎)”程序。 (源代码见...
本产品是采用C# lucene.net做的产品,使用前请确认: 1、 服务器支持.net 3.5 framework 2、 数据库采用的是SqlServer数据库 3、 需要索引的内容表是一张独立的表 老版本下载地址 1.0.0版本下载地址 ...