Lucene.Net入门基础

简单的例子 //索引 Private void Index() { IndexWriter writer = new IndexWriter(@"E:\Index", new StandardAnalyzer()); Document doc = new Document(); doc.Add(new Field("Text","哦耶,美丽的姑娘。", Field.Store.YES, Field.Index.TOKENIZED)); writer.AddDocument(doc); writer.Close(); } //搜索 Private void Search(string words) { IndexSearcher searcher = new IndexSearcher(@"E:\Index"); Query query = new QueryParser(“Text”, new StandardAnalyzer()).Parse(words); Hits hits = searcher.Search(query); for (int i = 0; i < hits.Length(); i++) System.Console.WriteLine(hits.Doc(i).GetField("Text").StringValue(); searcher.Close(); } 初识Lucene Lucene是什么 Lucene是一个高性能的、可扩展的信息检索工具包。它只是Java类库,并不是现成的应用程序。它提供简单易用却十分强大的API接口,基于它你可以快速的构建功能强大的搜索程序(搜索引擎?)。当前最新版2.9.2.1。 什么是索引 为了实现快速的搜索,Lucene会首先将需要处理的数据以一种称为倒排索引(Inverted Index)的数据结构进行存储。怎样理解倒排索引呢?简单的说,倒排索引并不是回答“这个文档中包含哪些单词?”这个问题,而是经过优化以后用来快速回答“哪些文档包含词XX?”这个问题。就像需要给书籍整理一份供快速查找的目录一样,Lucene也得为需要被搜索的数据整理优化出一份索引文件(Index file),而这个过程称之为“索引”(Indexing)。 Lucene的核心类 索引过程: IndexWriter Directory Analyzer Document Field 搜索过程: IndexSearcher Term Query TermQuery Hits 索引 索引过程的流程图 注:Lucene索引过程分为三个主要的操作阶段:将数据换转成文本、分析文本、并将分析过的文本保存到索引库中 基本的索引操作 添加索引 Document Field(理解Field的参数) 异构Document 追加域 增量索引 删除索引 软删除,仅添加了删除标记。调用 IndexWriter.Optimize() 后真正删除。 IndexReader reader = IndexReader.Open(directory); // 删除指定序号(DocId)的 Document。 reader.Delete(123); // 删除包含指定 Term 的 Document。 reader.Delete(new Term(FieldValue, "Hello")); // 恢复软删除。 reader.UndeleteAll(); reader.Close(); 更新索引 事实上,Lucene没有更新索引的方法 ...

June 13, 2010 · 4 min · 734 words · jabin

.Net下开发Windows Service

Windows服务能做些什么? Windows服务是这些后台程序、后台服务的正规名词。Windows服务的运行可以在没有用户干预的情况下,在后台运行,没有任何界面。通过Windows服务管理器进行管理。服务管理器也只能做些简单的操作:开始,暂停,继续,停止。Windows服务的特点:在后台运行,没有用户交互,可以随Windows启动而启动。 如何实现Windows服务? 下面按”隔一定时间做一些相同的事情”的服务为例,说明Windows服务如何实现。 **1.先按普通Windows程序设计好你的程序逻辑。 ** 建立一个空白解决方案WindowsService.sln 添加Windows类库项目ServiceBLL.csproj 将Class1.cs改名为AppBLL.cs 添加一个方法Dothings(),这个方法用来每隔一段时间调用一次,做些周期性的事情。 namespace ServiceBLL { public class AppBLL { public void Dothings() { //隔一段时间调用一次 LogHelper.WriteLog("test"); } } } **2.向解决方案添加一个WindowsService.csproj ** 将Service1.cs重命名为Service.cs 给WindowsService添加ServiceBLL项目引用 打开Service.cs代码视图,向Service类添加成员 ServiceBLL.AppBLL appBLL; 在构造函数里面对appBLL实例化 appBLL= new AppBLL (); 在using位置添加System.Theading using System.Threading; 给Service类添加计时器 Timer serviceTimer; 添加TimeCallback方法,用于计时器调用 public void TimerCallback(object obj) { //隔一段时间调用一次 appBLL.Dothings(); } 在OnStart()方法中添加方法,用于启动计时器 serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period); 此处,state用于保存状态,如果不需要,保存状态,可以传入null。第三个参数0表示立即调用TimerCallback方法,如果不需要立即调用,可以传入period。period是计时器的计时间隔,单位为毫秒。 重载 OnPause ()和OnContinue ()方法,对计时器进行控制。 Service.cs代码如下 using System.ServiceProcess; using System.Threading; using ServiceBLL; namespace WindowsService { public partial class Service : ServiceBase { private Timer serviceTimer; private AppBLL appBLL; private int period; private object state; public Service() { InitializeComponent(); appBLL = new AppBLL(); } protected override void OnStart(string[] args) { //启动timer period = 10*1000;//10秒,可从配置文件中获取 serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period); LogHelper.WriteLog("OnStart"); } protected override void OnStop() { //停止计时器 serviceTimer.Change(Timeout.Infinite, Timeout.Infinite); LogHelper.WriteLog("OnStop"); } protected override void OnContinue() { //重新开始计时 serviceTimer.Change(0, period); LogHelper.WriteLog("OnContinue"); } protected override void OnPause() { //停止计时器 serviceTimer.Change(Timeout.Infinite, Timeout.Infinite); LogHelper.WriteLog("OnPause"); } public void TimerCallback(object obj) { //隔一段时间调用一次 appBLL.Dothings(); } } } Program.cs代码如下 ...

February 28, 2010 · 2 min · 302 words · jabin

NVelocity直接使用字符串模板

using System; using System.IO; using System.Collections; using System.Collections.Generic; using NVelocity; using NVelocity.App; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string templates = "Hi $name $surname, The date is $date."; Dictionary oo = new Dictionary(); oo.Add("name", "Joe"); oo.Add("surname", "Smith"); oo.Add("date", DateTime.Now.ToString("D")); Console.WriteLine(Fill(templates,oo)); Console.ReadLine(); } static public string Fill(string template, IDictionary values) { var engine = new VelocityEngine(); engine.Init(); var context = new VelocityContext(); if (values != null) foreach (string k in values.Keys) { context.Put(k, values[k]); } using (var writer = new StringWriter()) { engine.Evaluate(context, writer, "", template); return writer.GetStringBuilder().ToString(); } } } }

April 18, 2009 · 1 min · 96 words · jabin