国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
lucene.net 2.0 中文分詞后語法高亮問題 - 智慧掩蓋真相 - 博客園
userphoto

2009.02.11

關注

lucene.net 2.0 中文分詞后語法高亮問題

lucene.net 2.0  src包里自帶了Highlighter.Net-2.0.0,可以用來實現(xiàn)語法高亮。

    //定義多條件搜索分析器
  BooleanQuery bquery = new BooleanQuery();
   //定義分詞器
   Analyzer analyzer  = new StandardAnalyzer();

   //多條件搜索拆分器
            MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[] { "title", "content" }, analyzer);
            query = parser.Parse(key);
            bquery.Add(query, BooleanClause.Occur.MUST);
               
            DateTime now = DateTime.Now;
   //初始化搜索器
   //實現(xiàn)分布式搜索
   List<IndexReader> indexreaders = new List<IndexReader>();
   string[] dirs = Directory.GetDirectories(dir);
   if (searchtype == SearchType.None)
   {
    foreach (string item in dirs)
    {
     //System.Web.HttpContext.Current.Response.Write(item);
     indexreaders.Add(IndexReader.Open(Path.Combine(Path.Combine(dir, item), "Save")));
    }
   }
   else
   {
    //System.Web.HttpContext.Current.Response.Write(searchtype.ToString());
    indexreaders.Add(IndexReader.Open(Path.Combine(Path.Combine(dir, searchtype.ToString()), "Save")));
   }

   MultiReader reader = new MultiReader(indexreaders.ToArray());
   indexSearcher = new IndexSearcher(reader);

   Hits hits = null;
   hits = indexSearcher.Search(bquery);
   timer = (DateTime.Now - now).TotalMilliseconds;

 int count = hits.Length();
   
            /* 計算顯示的條目 */
      int       start = (pageNo - 1) * 10;
      int       end = pageNo * 10 > count ? count : pageNo * 10;
            //Response.Write(readerhelper.MyQuery.ToString());
            /* 語法高亮顯示設置 */
         Highlighter        highlighter = new Highlighter(new QueryScorer(query ));
       highlighter.SetTextFragmenter(new SimpleFragmenter(100));

for (int i = start; i < end; i++)
{
     Lucene.Net.Documents.Document doc = hits.Doc(i);
              System.String text = doc.Get("content");
     //添加結尾,保證結尾特殊符號不被過濾
              string title = doc.Get("title") + "+aaaaaaaaa";
     Lucene.Net.Analysis.TokenStream tokenStream = analyzer  .TokenStream("content", new System.IO.StringReader(text));
     Lucene.Net.Analysis.TokenStream titkeStream = analyzer .TokenStream("title", new System.IO.StringReader(title));
     System.String result = highlighter.GetBestFragments(tokenStream, text, 2, "...");
     string tresult = highlighter.GetBestFragments(titkeStream, title, 0, "..");
     //祛除標題結尾標記
     if (tresult.Length > 10)
      tresult = tresult.Remove(tresult.Length - 10, 10);
     if (string.IsNullOrEmpty(tresult))
      tresult = title.Remove(title.Length - 10, 10);
     //未標注內容讀取
     if (string.IsNullOrEmpty(result))
     {
      if (text.Length > 100)
       result = text.Substring(0, 100);
      else
       result = text;
     }
     if (result.Length < text.Length)
      result = result + "...";
}

這是使用lucene.net的自帶分詞器StandardAnalyzer,有個弊端是一個字就認為是一個詞?,F(xiàn)在我們要用自己的中文詞義分詞器——MyAnalyzer的話,問題來了。Highlighter一直報錯。為什么會出現(xiàn)這種情況呢?那是因為,中文分詞器,分詞完成一般有分割符號。比如,對于詞“滬江英語”,分割完成后變成"滬江 英語"。也就是說,返回的Token是(滬江,0,2)(英語,3,5)。而如果用Highlighter,它想要取得詞是(滬江,0,2)(英語,2,4),這個就是因為空格而產生的偏差,引起了Highlighter的報錯。修改Highlighter比較麻煩,要對分詞器做特殊處理也比較難??梢允褂米值浣忉屍?,分割結果后再高亮。比如,取得"滬江英語"的分詞結果"滬江 英語",然后,把分詞結果傳遞給Highlighter。弊端是,搜索結果會憑空出現(xiàn)很多空格。俺們懶人自然有懶人的解決辦法。那就是用MyAnalyzer實現(xiàn)索引和搜索,用StandardAnalyzer實現(xiàn)高亮:

    //定義多條件搜索分析器
  BooleanQuery bquery = new BooleanQuery();
   //定義分詞器
   Analyzer analyzer  = new MyAnalyzer();
  Analyzer highanalyzer  = new StandardAnalyzer();
MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[] { "title", "content" }, highanalyzer );
Query highquery = parser .Parse(key);

   //多條件搜索拆分器
            MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[] { "title", "content" }, analyzer);
            query = parser.Parse(key);
            bquery.Add(query, BooleanClause.Occur.MUST);
               
            DateTime now = DateTime.Now;
   //初始化搜索器
   //實現(xiàn)分布式搜索
   List<IndexReader> indexreaders = new List<IndexReader>();
   string[] dirs = Directory.GetDirectories(dir);
   if (searchtype == SearchType.None)
   {
    foreach (string item in dirs)
    {
     //System.Web.HttpContext.Current.Response.Write(item);
     indexreaders.Add(IndexReader.Open(Path.Combine(Path.Combine(dir, item), "Save")));
    }
   }
   else
   {
    //System.Web.HttpContext.Current.Response.Write(searchtype.ToString());
    indexreaders.Add(IndexReader.Open(Path.Combine(Path.Combine(dir, searchtype.ToString()), "Save")));
   }

   MultiReader reader = new MultiReader(indexreaders.ToArray());
   indexSearcher = new IndexSearcher(reader);

   Hits hits = null;
   hits = indexSearcher.Search(bquery);
   timer = (DateTime.Now - now).TotalMilliseconds;

 int count = hits.Length();
   
            /* 計算顯示的條目 */
      int       start = (pageNo - 1) * 10;
      int       end = pageNo * 10 > count ? count : pageNo * 10;
            //Response.Write(readerhelper.MyQuery.ToString());
            /* 語法高亮顯示設置 */
         Highlighter        highlighter = new Highlighter(new QueryScorer(highquery));
       highlighter.SetTextFragmenter(new SimpleFragmenter(100));

for (int i = start; i < end; i++)
{
     Lucene.Net.Documents.Document doc = hits.Doc(i);
              System.String text = doc.Get("content");
     //添加結尾,保證結尾特殊符號不被過濾
              string title = doc.Get("title") + "+aaaaaaaaa";
     Lucene.Net.Analysis.TokenStream tokenStream = highanalyzer  .TokenStream("content", new System.IO.StringReader(text));
     Lucene.Net.Analysis.TokenStream titkeStream = highanalyzer  .TokenStream("title", new System.IO.StringReader(title));
     System.String result = highlighter.GetBestFragments(tokenStream, text, 2, "...");
     string tresult = highlighter.GetBestFragments(titkeStream, title, 0, "..");
     //祛除標題結尾標記
     if (tresult.Length > 10)
      tresult = tresult.Remove(tresult.Length - 10, 10);
     if (string.IsNullOrEmpty(tresult))
      tresult = title.Remove(title.Length - 10, 10);
     //未標注內容讀取
     if (string.IsNullOrEmpty(result))
     {
      if (text.Length > 100)
       result = text.Substring(0, 100);
      else
       result = text;
     }
     if (result.Length < text.Length)
      result = result + "...";
}
這樣的結果還是很友好的,例如:
http://so.yeshj.com/so.aspx?key=%E6%B2%AA%E6%B1%9F%E6%97%A5%E8%AF%AD&h=%E6%B2%AA%E6%B1%9F%E6%97%A5%E8%AF%AD
全文完。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Lucene關于幾種中文分詞的總結 (Lucene與搜索引擎技術) - [Matrix - 與 Java 共舞]
Lucene常用的Analyzer功能概述以及自定義Analyzer
Lucene于搜索引擎技術(Analysis包詳解)
讓中科院中文分詞系統(tǒng)ICTCLAS為lucene所用的簡單程序(C#版)
Lucene中文分詞
Analysis分析器(三)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服