【简介】
好多人都知道的吧反正我是最近才好好的看了一下别笑我拿历史当新闻哦不太了解Lucence的朋友先听我说两句哦Lucene的知识主要分为索引搜索分析器性能优化几个部分索引和搜索没啥可说的看几个例子就会了来回那一套儿按部就班做几个实验就熟悉了分析器是Lucence的精华又分为分词和过滤两部分而且中文分词更是难点我的例子里是用从博客园程序中提取出来的LuceneNetAnalysisCndll来实现中文分词的谁有中科院的那套中科院ICTCLAS分词工具的C#版麻烦提供一下哦性能优化也很重要因为如果要索引的文件比较大的话建立索引的性能就会很大的下降你可以调整IndexWriter的几个参数来优化索引性能还有可以用IndexWriterOptimize()方法(这个方法主要是优化查询速度反而使索引性能有所下降)另外就是可以用多线程来分别对不同的内容进行索引并保存到RAMDirectory里然后再把所有的内存索引合并到FSDirectory里甚至可以让多台服务器分别处理内容的各个部分然后把索引结果放到一个队列里再有一台机器去读取索引结果队列并合并索引结果
做这个示例主要是为了演示一下的功能它可以对你指定的目录里的l文件进行全文索引然后对其进行查询由于如果要索引的目录里文件特别多特别大的话建立索引需要花费很长的过程所以我在示例程序里使用了异步编程以便在建立索引的时候不阻塞界面线程
【内容】
先看一个简单例子
public void Test()
{
//建立一个内存目录
LuceneNetStoreRAMDirectory ramDir = new LuceneNetStoreRAMDirectory();
//建立一个索引书写器
IndexWriter ramWriter = new IndexWriter(ramDirnew ChineseAnalyzer() true);
//要索引的词这就相当于一个个的要索引的文件
string[] words = {中华人民共和国 人民共和国 人民共和国};
//循环数组创建文档给文档添加字段并把文档添加到索引书写器里
Document doc = null;
for (int i = ; i < wordsLength; i++)
{
doc = new Document();
docAdd(FieldText(contents words[i]));
ramWriterAddDocument(doc);
}
//索引优化
ramWriterOptimize();
//关闭索引读写器一定要关哦按理说应该把上面的代码用try括主在finally里关闭索引书写器
ramWriterClose();
//构建一个索引搜索器
IndexSearcher searcher = new IndexSearcher(ramDir);
//用QueryParserParse方法实例化一个查询
Query query = QueryParserParse(中华人民contentsnew ChineseAnalyzer());
//获取搜索结果
Hits hits = searcherSearch(query);
//判断是否有搜索到的结果当然你也可以遍历结果集并输出
if (hitsLength() != )
MessageBoxShow(有);
else
MessageBoxShow(没有);
}
其它的具体看下载代码吧
下载的文件里有个doc的文件夹里面有个文本文件大家可以试着给那个目录建立索引然后搜索一下人民中华等几个关键字看看能出来搜索结果吗?简单说一下示例程序就是遍历一个目录找出所有文本和网页的文件建立Lucene的Document文件并索引了文件的目录和内容然后添加到索引器里最后在程序执行目录的Index子目录里建立索引这一部分的调用使用了异步委托搜索的时候就是在Index目录里检索符合某个关键字的条目
【注意】
建立完索引后一定要调用IndexWriter的Close方法否则如果你要索引的目录里的文件少于minMergeDocs的话是不能建立索引的
FieldText的静态方法有两个重载版本如果第二个参数是string的话那么这个字段既索引也存储如果是TextReader的话只索引不存储这点要搞清楚另外在构建TextReader的时候要注意使用合适的编码格式否则有的文件读出来是乱码建立的索引肯定也是按乱码建立的咯
【小节】
其实lucene大家谁也是学学就会关键要是整一个像googlebaidu这样的搜索引擎就难了好歹这搜索引擎也是一个行业呢所以谁有兴趣好好钻研一下搜索行业的相关技术没准靠这个还能创业呢是吧
再问一下《lucence实战》有中文版吗?或者其它关于Lucence的中午图书给推荐一本
最后借贵地和大家讨论一个问题从长远考虑程序员学那项技术比较有前途?做程序也好几年了想找一个领域好好深入一下以后做一个行业的领域专家那样才不会太累要不什么都鼓捣太累了而且还不容易出成绩我列举了几个方向大家帮忙分析分析谢谢
Linux+oracle(走数据库管理的路线)
汇编c底层驱动开发(据说很简单就那么几个指令学一年就精通了不像NET得老跟着走)
ec++kjava嵌入式开发(包括手机游戏路由固件等开发)
即时通讯行业(网络编程包括网络游戏的服务端编程这些)
搜索行业(不太了解)
OA工作流(自己做一套不用编程拖拖拽拽画画就能实现企业业务流程的电子化infopathOSSformserverWF的那一套)
网站开发(范围很大要掌握的东西太多会的人很多深入的很少)
流媒体开发(G时代这玩意儿不知道能不能派上用场)
【参考】
idior的《系列》
李刚宋伟邱哲的《ajax+lucene构建搜索引擎》
下载地址