[Lucene.Net] 基本用法
[Lucene.Net] 基本用法 (2007-10-23 10:44:47)
本文仅记录一些简单的使用方法,供初学者参考。 以下例子采用 Lucene.NET 1.9 版本,可取去 Lucene.Net 下载。 1. 基本应用
using System;
using System.Collections.Generic; using System.Text; using Lucene.Net; using Lucene.Net.Analysis; using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.QueryParsers; using Lucene.Net.Search; using Lucene.Net.Store; using Lucene.Net.Util; namespace ConsoleApplication1.Lucene private Directory directory = new RAMDirectory(); public LuceneTest() private void Index() for (int i = 1; i <= 100; i++) document.Add(new Field(FieldName, "name" + i, Field.Store.YES, Field.Index.UN_TOKENIZED)); writer.AddDocument(document); writer.Optimize(); private void Search() IndexSearcher searcher = new IndexSearcher(directory); Hits hits = searcher.Search(query); Console.WriteLine("符合条件记录:{0}; 索引库记录总数:{1}", hits.Length(), searcher.Reader.NumDocs()); Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}", searcher.Close(); 除了 RAMDirectory,还可以使用 FSDirectory。(注意 FSDirectory.GetDirectory 的 create 参数,为 true 时将删除已有索引库文件,可以通过 IndexReader.IndexExists() 方法判断。) 从指定目录打开已有索引库。
private Directory directory = FSDirectory.GetDirectory("c:\index", false);
将索引库载入内存,以提高搜索速度。
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:\index", false));
//或 //private Directory directory = new RAMDirectory(c:\index"); 2. 多字段搜索 使用 MultiFieldQueryParser 可以指定多个搜索字段。
Query query = MultiFieldQueryParser.Parse("name*", new string[] { FieldName, FieldValue }, analyzer);
IndexReader reader = IndexReader.Open(directory); 3. 多条件搜索 除了使用 QueryParser.Parse 分解复杂的搜索语法外,还可以通过组合多个 Query 来达到目的。
Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 词语搜索
Query query2 = new WildcardQuery(new Term(FieldName, "name*")); // 通配符 //Query query3 = new PrefixQuery(new Term(FieldName, "name1")); // 字段搜索 Field:Keyword,自动在结尾添加 * //Query query4 = new RangeQuery(new Term(FieldNumber, NumberTools.LongToString(11L)), new Term(FieldNumber, NumberTools.LongToString(13L)), true); // 范围搜索 //Query query5 = new FilteredQuery(query, filter); // 带过滤条件的搜索 BooleanQuery query = new BooleanQuery(); IndexSearcher searcher = new IndexSearcher(reader); 4. 设置权重 可以给 Document 和 Field 增加权重(Boost),使其在搜索结果排名更加靠前。缺省情况下,搜索结果以 Document.Score 作为排序依据,该数值越大排名越靠前。Boost 缺省值为 1。
Score = Score * Boost
通过上面的公式,我们就可以设置不同的权重来影响排名。 如下面的例子中根据 VIP 级别设定不同的权重。
Document document = new Document();
switch (vip) { case VIP.Gold: document.SetBoost(2F); break; case VIP.Argentine: document.SetBoost(1.5F); break; } 只要 Boost 足够大,那么就可以让某个命中结果永远排第一位,这就是百度等网站的"收费排名"业务。明显有失公平,鄙视一把。 5. 排序 通过 SortField 的构造参数,我们可以设置排序字段,排序条件,以及倒排。
Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false));
IndexSearcher searcher = new IndexSearcher(reader); 排序对搜索速度影响还是很大的,尽可能不要使用多个排序条件。 6. 过滤 使用 Filter 对搜索结果进行过滤,可以获得更小范围内更精确的结果。 举个例子,我们搜索上架时间在 2005-10-1 到 2005-10-30 之间的商品。
// index
document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED); //... // search 除了日期时间,还可以使用整数。比如搜索价格在 100 ~ 200 之间的商品。
// index
document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED)); //... // search 使用 Query 作为过滤条件。
QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));
我们还可以使用 FilteredQuery 进行多条件过滤。
Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15"));
Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true); Query query = QueryParser.Parse("name*", FieldName, analyzer); IndexSearcher searcher = new IndexSearcher(reader); 7. 分布搜索 我们可以使用 MultiReader 或 MultiSearcher 搜索多个索引库。
MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:\index"), IndexReader.Open(@"\\server\index") });
IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query); 或
IndexSearcher searcher1 = new IndexSearcher(reader1);
IndexSearcher searcher2 = new IndexSearcher(reader2); MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 }); Hits hits = searcher.Search(query); 还可以使用 ParallelMultiSearcher 进行多线程并行搜索。 8. 合并索引库 将 directory1 合并到 directory2 中。
Directory directory1 = FSDirectory.GetDirectory("index1", false);
Directory directory2 = FSDirectory.GetDirectory("index2", false); IndexWriter writer = new IndexWriter(directory2, analyzer, false); 9. 显示搜索语法字符串 我们组合了很多种搜索条件,或许想看看与其对等的搜索语法串是什么样的。
BooleanQuery query = new BooleanQuery();
query.Add(query1, true, false); query.Add(query2, true, false); //... Console.WriteLine("Syntax: {0}", query.ToString()); 输出: 呵呵,就这么简单。 10. 操作索引库 删除 (软删除,仅添加了删除标记。调用 IndexWriter.Optimize() 后真正删除。)
IndexReader reader = IndexReader.Open(directory);
// 删除指定序号(DocId)的 Document。 // 删除包含指定 Term 的 Document。 // 恢复软删除。 reader.Close(); 增量更新 (只需将 create 参数设为 false,即可往现有索引库添加新数据。)
Directory directory = FSDirectory.GetDirectory("index", false);
IndexWriter writer = new IndexWriter(directory, analyzer, false); writer.AddDocument(doc1); writer.AddDocument(doc2); writer.Optimize(); writer.Close(); 11. 优化 批量向 FSDirectory 增加索引时,增大合并因子(mergeFactor )和最小文档合并数(minMergeDocs)有助于提高性能,减少索引时间。
IndexWriter writer = new IndexWriter(directory, analyzer, true);
writer.maxFieldLength = 1000; // 字段最大长度 for (int i = 0; i < 10000; i++) writer.Optimize(); |
转载于:https://www.cnblogs.com/freedom831215/archive/2010/08/13/1799195.html
[Lucene.Net] 基本用法相关推荐
- lucene的丰富的各种查询
lucene支持十分丰富的查询,这里列写其中一些比较常用的查询的用法. term查询.queryParser查询 ,booleanQuery package search; import org.ap ...
- 一个例子学懂搜索引擎(lucene)
http://www.vifir.com/html/20080827/1703937.html 一个例子学懂搜索引擎(lucene) 来源:javaeye 作者: phz50 2008-08-27 1 ...
- Apache Lucene与Lucene.Net——全文检索服务器
lucene学习教程 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一 ...
- lucene,lucene.net学习教程
lucene学习教程 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一 ...
- Pdfbox在linux下生成pdf,使用PDFBox处理PDF文档
下面是自己按照书上的例子写的代码. 1package TestPDF.pdfbox; 3import java.io.File; 4import java.io.FileOutputStream; 5 ...
- 年终总结spring mvc 代码篇结合之前写的
这个例子比较简单 实现的是spring mvc+jdbctemplate.下面有空会加入hibernate的实现.后续会加入quartz持久化的实现.lucene的简单用法等. web.xml < ...
- 【Java】Lucene检索引擎详解
基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...
- 《深入理解Elasticsearch(原书第2版)》——第2章 查询DSL进阶 2.1 Apache Lucene默认评分公式解释...
本节书摘来自华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第2章,第2.1节,作者 [美]拉斐尔·酷奇(Rafal Ku)马雷克·罗戈任斯基(Marek Rogoz ...
- 使用Lucene.Net实现全文检索
目录 一 Lucene.Net概述 二 分词 三 索引 四 搜索 五 实践中的问题 一 Lucene.Net概述 Lucene.Net是一个C#开发的开源全文索引库,其源码包括"核心&quo ...
最新文章
- U-net进行图像分割
- LeetCode Self Crossing(判断是否相交)
- MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
- mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
- java如何运行一个任务_如何每天从Java运行任务?
- HDOJ1879(继续畅通工程)
- ADO.NET Entity Framework 学习
- 关于MongoDB时区问题
- oracle高级函数api,Oracle函数-高阶篇
- 芯片国产化进程提速 赶超洋品牌核心技术尚欠火候
- html静态网站基于数码类电商购物网站网页设计与实现共计30个页面.rar(项目源码+毕业设计+论文+答辩PPT)
- 信使广告终结者 绿色
- google 翻译 tts 语音 tk tkk代码
- 51单片机最小系统及晶振电容的选择
- 书海觅珍 遨游古今——广西国正书吧正式运营开业
- CSS 盒模型 基本术语解释
- CSS渐变背景看这一篇就够了
- 使用Hexo 在本地搭建博客(一)
- 手机浏览器找不到服务器,苹果手机的Safari浏览器找不到服务器怎么办?
- 还在想假期去哪玩?直接做一个旅游攻略小程序
热门文章
- 深度学习(八)caffe源码学习-未完待续
- c++框架有哪些_平顶彩钢活动房特点以及用途有哪些?
- python 财务分析-linux 复制移动命令详解
- android 协程,Android 上的 Kotlin 协程
- win10隐藏linux,Win10如何隐藏Windows Defender任务栏图标
- c语言判断回文字符串递归,用递归实现判断一个字符串是否为回文串
- 基于JBox2d物理引擎和canvas的游戏开发实例
- 为什么只能sudo进mysql_解决项目中MySQL数据库执行删除语句时间太长的问题
- bing浏览器_微软全新Edge浏览器正式发布 支持macOS和iOS
- Java基础---面向对象(OOP)