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


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

    问: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更可靠些。

    说点题外话:

      感谢大家关注SearchEasy SearchEngine Framework(搜易SDK),浏览量还是挺高的,但从评论数来看,大家使用度并不高,估计都收藏了,但还是有网友再用了,遇到了问题了,但是最近实在太忙了,没能写个完整的demo来帮助大家使用SearchEasy SearchEngine Framework(搜易SDK),目前正在全力开发GUI版的SDK辅助工具,正值18大期间,因工作关系,被当地宣传部调去协助监控舆情。晚上值夜班,白天睡觉,颠倒的生活快点结束啊。

       其实搜易SDK早在2009年的时候已经完成了的,仅仅用了20天时间,现在回看这些代码,真的很惊叹当时的开发效率啊!而且当时刚从大城市广州回到了自己的老家小城市工作,写完了这个SDK,闲适的生活方式,让我忽然间失去了那种追求技术的感觉,没有了写下去的灵感了。如今,依然奋斗在开发第一线,今天看了自己的博客园,显示园龄8年多,是啊,岁月如歌,是该做点什么的时候了。所以请关注或打算使用搜易SDK的园友给点时间我。

       搜易SDK一直会持续更新,而且一直免费开源,回馈给技术社区的朋友。

    分类: 搜易SDK
  • 相关阅读:
    命令行参数
    数组的使用
    Hello World 和 模块分解
    20155234 2016-2017-2 《Java程序设计》第2周学习总结
    20155234 2016-2017-2 《Java程序设计》第1 周学习总结
    与虚拟机和linux的初次接触
    优秀技能经验及对java学习展望
    预备作业01
    20155231 实验三 敏捷开发与XP实践
    20155231 第十一周课堂代码练习
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2764373.html
Copyright © 2020-2023  润新知