zoukankan      html  css  js  c++  java
  • Lucene全文检索-从零开始(3)

    1.传入要检索的关键字和需要检索的字段

     1 /// <Contents>
     2     /// 全文检索
     3     /// </Contents>
     4     /// <param name="keyword">关键词</param>
     5     /// <param name="field">搜索字段</param>
     6     public List<China.Model.LuceneIndexArticle> SearchIndex(string keyword, List<string> field)
     7     {
     8         Dictionary<string, string> dic = new Dictionary<string, string>();
     9         BooleanQuery bQuery = new BooleanQuery();
    10         foreach (string str in field)
    11         {
    12             string key = GetKeyWordsSplitBySpace(keyword);//处理搜索词
    13             QueryParser parse = new QueryParser(str, PanGuAnalyzer);//盘古分词
    14             Query query = parse.Parse(key);
    15             parse.SetDefaultOperator(QueryParser.Operator.AND);
    16             bQuery.Add(query, BooleanClause.Occur.SHOULD);
    17             dic.Add(str, keyword);
    18         }
    19         if (bQuery != null && bQuery.GetClauses().Length > 0)
    20         {
    21             return GetSearchResult(bQuery, dic, keyword);
    22         }
    23         else
    24         {
    25             return null;
    26         }
    27     }

    2.获取搜索结果

     1  /// <Contents>
     2     /// 获取搜索结果
     3     /// </Contents>
     4     /// <param name="bQuery"></param>
     5     public List<China.Model.LuceneIndexArticle> GetSearchResult(BooleanQuery bQuery, Dictionary<string, string> dicKeywords, string keyword)
     6     {
     7         //打开索引位置
     8         IndexSearcher search = new IndexSearcher(IndexDic, true);
     9         //运行时间
    10         Stopwatch stopwatch = Stopwatch.StartNew();
    11         TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
    12         search.Search(bQuery, null, collector);//根据query查询条件进行查询,查询结果放入collector容器
    13         //TopDocs 指定0到GetTotalHits() 即所有查询结果中的文档 如果TopDocs(20,10)则意味着获取第20-30之间文档内容 达到分页的效果
    14         ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;
    15         List<China.Model.LuceneIndexArticle> list = new List<China.Model.LuceneIndexArticle>();
    16         ///TopDocs docs = search.Search(bQuery, (Filter)null, 1000);
    17         stopwatch.Stop();
    18         //搜索结果条数
    19         count = docs.Length;
    20         if (docs != null && docs.Length > 0)
    21         {
    22             //运行时间
    23             lSearchTime = stopwatch.ElapsedMilliseconds;
    24             foreach (ScoreDoc sd in docs)
    25             {
    26                 Document doc = search.Doc(sd.doc);
    27                 string title = doc.Get("Title");
    28                 string content = doc.Get("Contents");
    29                 China.Model.LuceneIndexArticle ar = new China.Model.LuceneIndexArticle();
    30                 {
    31                     ar.ID = Convert.ToInt32(doc.Get("ID"));
    32                     ar.Title = doc.Get("Title").ToString();
    33                     ar.Contents = ReplaceHtmlTag(doc.Get("Contents").ToString());
    34                 };
    35                 PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color="red">", "</font>");
    36                 PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new PanGu.Segment());
    37                 highlighter.FragmentSize = 200;
    38                 string Contentshighlight = highlighter.GetBestFragment(keyword, ar.Contents);
    39                 string titlehighlight = highlighter.GetBestFragment(keyword, ar.Title);
    40                 if (Contentshighlight == "")
    41                 {
    42                     if (ar.Contents.Length > 200)
    43                     {
    44                         ar.Contents = ar.Contents.Substring(0, 200);
    45                     }
    46                     else
    47                     {
    48                         ar.Contents = ar.Contents.Substring(0, ar.Contents.Length);
    49                     }
    50                 }
    51                 else
    52                 {
    53                     ar.Contents = Contentshighlight;
    54                 }
    55                 if (titlehighlight != "") ar.Title = titlehighlight;
    56                 list.Add(ar);
    57             }
    58         }
    59         return list;
    60     }

    随便检索一条数据

    按照常理,我们的数据是有变动的,比如新增数据,对数据的修改、删除。那我们的索引也要随着这些操作而改变,从而保证整个系统数据的一致性。

  • 相关阅读:
    JVM-程序编译与代码晚期(运行期)优化
    JVM-程序编译与代码早期(编译期)优化
    JVM-字节码执行引擎
    JVM-类加载机制
    JVM-字节码指令
    JVM-class文件完全解析-属性表集合
    zabbix配置邮箱报警功能
    Linux Shell 返回值之 PIPESTATUS
    SSH远程登录原理
    Zabbix监控USG6300防火墙及交换机
  • 原文地址:https://www.cnblogs.com/smilejeffery/p/5915453.html
Copyright © 2011-2022 走看看