Lucene.net常见功能实现知识汇总

在开发SearchEasy Site SearchEngine(搜易站内搜索引擎)的时候,经常会遇到一些搜索引擎的常见功能如何实现的问题,比如实现相关度百分比显示?如何实现在结果中搜索等等诸如此类常见的问题,本文总结我在开发SearchEasy Site SearchEngine(搜易站内搜索引擎)过程中遇到的问题,整理分享给需要的博友们:

问:Lucene.net的搜索结果的百分比相关度值是如何实现的?
答:
    Hits result = searcher.Search(q);
    float score = result.Score(n) ;//n为查询结果文挡序号,返回的是一个<=1f的float的值,表示为百分比字符串:score.ToString("0%") ;

问:如何通过编程的方式改变Lucene.net的锁文件存放的位置?
答:
    Lucene.net的锁文件默认是存放系统临时文件夹,可以通过下面的语句来修改
    System.Configuration.ConfigurationSettings.AppSettings.Add("Lucene.Net.lockDir", "your new lockDir") ;
    通过FSDirectory.LOCK_DIR可以获得锁文件存放的位置(文件夹)
   
问:如何判断某个索引库被锁定,如何强制解除锁定?
答:
   具体实现,可以参看Lucene.Net.Store.FSDirectory的Obtain()(判断是否锁定)方法和Release()方法(解除锁定)  
   备注:还有一个IsLocked方法也可以参考下。
  
问:如何实现多个索引的联合搜索 ?
答:
   IndexSearcher[] searchers = new IndexSearcher[2];
   searchers[0] = new IndexSearcher(dir1) ;
   searchers[1] = new IndexSearcher(dir2) ;
  
   MultiSearcher searcher = new MultiSearcher(searchers) ;//或ParallelMultiSearcher searcher = new ParallelMultiSearcher(searchers) ;
   searcher.Search(query) ;
  
   ParallelMultiSearcher与MultiSearcher的区别,前者为每一个索引单独开一个线程,以多线程的方式同步搜索;后者是逐个依次搜索,然后合并;
   所以ParallelMultiSearcher的搜索总用时是最慢的哪个索引的搜索用时,MultiSearcher则是搜索总用时等于所有索引搜索用时之和;
  
问:如何实现在结果中搜索 ?
答:
    *方法一,使用CachingWrapperFilter。不能实现无限级的“在结果中搜索”:
    QueryParser parser = new QueryParser("content", analyzer);
   
    Query currentQuery = parser.Parse(currentKeyword) ;
 Query oldQuery = parser.Parse(oldKeyword) ;

 QueryFilter oldFilter = new QueryFilter(oldQuery) ;
 CachingWrapperFilter filter = new CachingWrapperFilter(oldFilter) ;
 
 IndexSearcher searcher = new IndexSearcher(indexDir);
 
 Hits result = searcher.Search(currentQuery, filter) ;
 
 *方法二,将多个查询关键词做AND的BooleanQuery或者直接构造查询Sytax传给QueryParser,都可以实现无限级的“在结果中搜索“。
 
问:BooleanQuery.maxClauseCount的含义 ?
答:
    添加到BooleanQuery的最多的Query数,默认是1024。超过该值会抛出TooManyClauses异常,可以通过BooleanQuery.SetMaxClauseCount(int)设置新的值。

    备注:含义解释未明确。

问:如何判断一个索引库是否存在?
答:
   string indexPath = "your indexPath" ; //索引所在目录
   if (System.IO.Directory.Exists(indexPath) && System.IO.File.Exists(Path.Combine(indexPath,"segments")
      //存在
   else
      //不存在
  
   当然有更直接的方法
   if (Lucene.Net.Index.IndexReader.IndexExists(indexPath))
     //存在
   else
     //不存在
    
   Lucene.Net.Index.IndexReader.IndexExists方法内部的实现方式和上面的类似,当然直接用Lucene.Net.Index.IndexReader.IndexExists更可靠些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搜易站内搜索引擎(SearchEasy Site Search Engine)是面向互联网网站的站内搜索解决方案,其针对网站使用数据库搜索性能差,体验差等问题,将搜索引擎技术应用于站内搜索;本系统具备中文分词,智能摘要,关键词高亮等技术,可与数据库无缝集成,目前支持MS SQL 2000/2005,My SQL数据库。 软件基于B/S架构技术,前后端设计精美,操作体验佳。 软件特性: 1,智能中文分词:集成自主研发的面向站内搜索优化的细粒度中文分词充分兼顾搜准率和搜全率; 2,多数据库支持:目前支持应用最广泛的MS SQL SERVER 2000/2005,MySQL数据库,在后台点点鼠标即可完成数据库数据汇入索引库的匹配; 3,毫秒级的速度:基于倒排索引全文索引技术核心,实现索引分块存储千万级数据,毫秒级的搜索速度; 4,搜索功能强大:采用数据模型化概念,可以跨数据库,跨表建立博客,视频,下载等多种类别的搜索功能,当然,全站搜索功能自然不会少的! 5,可持续的研发:基于多年研发的搜易全文检索中间件构建,确保有可持续的改进能力,日新月异的互联网,唯有持续不断的研发,才能不断超越用户的搜索期望,发掘出搜索新价值! 更新历史: V1.1修正BUG或新增功能列表 1,新增后台参数设置功能,无需修改页面完成Title等基本设置信息; 2,新增首次使用前台的时候提示,提升操作体验; 3,新增后台操作指引,方便首次使用用户; 4,修复首次使用搜索类型读取索引记录数异常; 5,后台新增加精确搜索或模糊搜索选项,满足不同用户的差异化需求; 6,新增后台退出功能; 7,修复搜索个别单字出错问题; 8,修正从非UTF8编码(如gb2312)页面的搜索框跳转到搜索页乱码问题;
以下是使用C# Lucene.Net创建索引的步骤: 1.添加Lucene.Net库的引用 在Visual Studio中,右键单击项目并选择“管理NuGet程序包”。在搜索框中搜索“Lucene.Net”,然后安装Lucene.Net库。 2.创建索引 ```csharp using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.Store; using System.IO; // 创建索引 public void CreateIndex(string indexPath, string dataPath) { // 创建分析器 var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); // 创建索引存储目录 var directory = FSDirectory.Open(new DirectoryInfo(indexPath)); // 创建索引写入器 var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); // 读取数据文件 var lines = File.ReadAllLines(dataPath); // 遍历数据文件中的每一行 foreach (var line in lines) { // 创建文档 var doc = new Document(); // 添加字段 doc.Add(new Field("content", line, Field.Store.YES, Field.Index.ANALYZED)); // 将文档写入索引 writer.AddDocument(doc); } // 关闭索引写入器 writer.Dispose(); } ``` 3.使用索引 ```csharp using Lucene.Net.Analysis.Standard; using Lucene.Net.QueryParsers; using Lucene.Net.Search; using Lucene.Net.Store; using System.IO; // 使用索引 public void SearchIndex(string indexPath, string queryStr) { // 创建分析器 var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); // 创建索引存储目录 var directory = FSDirectory.Open(new DirectoryInfo(indexPath)); // 创建索引搜索器 var searcher = new IndexSearcher(directory, true); // 创建查询解析器 var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "content", analyzer); // 解析查询字符串 var query = parser.Parse(queryStr); // 执行查询 var hits = searcher.Search(query, null, 10, Sort.RELEVANCE).ScoreDocs; // 遍历查询结果 foreach (var hit in hits) { // 获取文档 var doc = searcher.Doc(hit.Doc); // 输出文档内容 Console.WriteLine(doc.Get("content")); } // 关闭索引搜索器 searcher.Dispose(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值