婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用Lucene.NET實現站內搜索

使用Lucene.NET實現站內搜索

熱門標簽:寧夏機器人電銷 400免費電話怎么辦理 河南語音外呼系統公司 威海電銷 400電話辦理最優質 t3出行地圖標注怎么做 關于宗地圖標注技術規范 外呼電銷機器人軟件 河北網絡回撥外呼系統

導入Lucene.NET 開發包

Lucene 是apache軟件基金會一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。Lucene.Net 是 .NET 版的Lucene。

你可以在這里下載到最新的Lucene.NET

創建索引、更新索引、刪除索引

搜索,根據索引查找

IndexHelper 添加、更新、刪除索引

using System;
using Lucene.Net.Store;
using Lucene.Net.Index;
using Lucene.Net.Analysis.PanGu;
using Lucene.Net.Documents;

namespace BLL
{
  class IndexHelper
  {
    /// summary>
    /// 日志小助手
    /// /summary>
    static Common.LogHelper logger = new Common.LogHelper(typeof(SearchBLL));
    /// summary>
    /// 索引保存的位置,保存在配置文件中從配置文件讀取
    /// /summary>
    static string indexPath = Common.ConfigurationHelper.AppSettingMapPath("IndexPath");
    
    /// summary>
    /// 創建索引文件或更新索引文件
    /// /summary>
    /// param name="item">索引信息/param>
    public static void CreateIndex(Model.HelperModel.IndexFileHelper item)
    {
      try
      {
        //索引存儲庫
        FSDirectory directory = FSDirectory.Open(new System.IO.DirectoryInfo(indexPath), new NativeFSLockFactory());
        //判斷索引是否存在
        bool isUpdate = IndexReader.IndexExists(directory);
        if (isUpdate)
        {
          //如果索引目錄被鎖定(比如索引過程中程序異常退出),則首先解鎖
          if (IndexWriter.IsLocked(directory))
          {
            //解鎖索引庫
            IndexWriter.Unlock(directory);
          }
        }
        //創建IndexWriter對象,添加索引
        IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
        //獲取新聞 title部分
        string title = item.FileTitle;
        //獲取新聞主內容
        string body = item.FileContent;
        //為避免重復索引,所以先刪除number=i的記錄,再重新添加
        //尤其是更新的話,更是必須要先刪除之前的索引
        writer.DeleteDocuments(new Term("id", item.FileName));
        //創建索引文件 Document
        Document document = new Document();
        //只有對需要全文檢索的字段才ANALYZED
        //添加id字段
        document.Add(new Field("id", item.FileName, Field.Store.YES, Field.Index.NOT_ANALYZED));
        //添加title字段
        document.Add(new Field("title", title, Field.Store.YES, Field.Index.NOT_ANALYZED));
        //添加body字段
        document.Add(new Field("body", body, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
        //添加url字段
        document.Add(new Field("url", item.FilePath, Field.Store.YES, Field.Index.NOT_ANALYZED));
        //寫入索引庫
        writer.AddDocument(document);
        //關閉資源
        writer.Close();
        //不要忘了Close,否則索引結果搜不到
        directory.Close();
        //記錄日志
        logger.Debug(String.Format("索引{0}創建成功",item.FileName));
      }
      catch (SystemException ex)
      {
        //記錄錯誤日志
        logger.Error(ex);
        throw;
      }
      catch (Exception ex)
      {
        //記錄錯誤日志
        logger.Error(ex);
        throw;
      }
    }

    /// summary>
    /// 根據id刪除相應索引
    /// /summary>
    /// param name="guid">要刪除的索引id/param>
    public static void DeleteIndex(string guid)
    {
      try
      {
        ////索引存儲庫
        FSDirectory directory = FSDirectory.Open(new System.IO.DirectoryInfo(indexPath), new NativeFSLockFactory());
        //判斷索引庫是否存在索引
        bool isUpdate = IndexReader.IndexExists(directory);
        if (isUpdate)
        {
          //如果索引目錄被鎖定(比如索引過程中程序異常退出),則首先解鎖
          if (IndexWriter.IsLocked(directory))
          {
            IndexWriter.Unlock(directory);
          }
        }
        IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
        //刪除索引文件
        writer.DeleteDocuments(new Term("id", guid));
        writer.Close();
        directory.Close();//不要忘了Close,否則索引結果搜不到
        logger.Debug(String.Format("刪除索引{0}成功", guid));
      }
      catch (Exception ex)
      {
        //記錄日志
        logger.Error(ex);
        //拋出異常
        throw;
      }
    }
  }
}

Search 通過查找索引實現搜索

using Lucene.Net.Analysis;
using Lucene.Net.Analysis.PanGu;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Model.HelperModel;
using System;
using System.Collections.Generic;

namespace BLL
{
  public static class SearchBLL
  {
    //一個類中可能會有多處輸出到日志,多處需要記錄日志,常將logger做成static 靜態變量
    /// summary>
    /// 日志助手
    /// /summary>
    static Common.LogHelper logger = new Common.LogHelper(typeof(SearchBLL));
    /// summary>
    /// 索引保存位置
    /// /summary>
    static string indexPath = Common.ConfigurationHelper.AppSettingMapPath("IndexPath");
    /// summary>
    /// 搜索
    /// /summary>
    /// param name="keywords">用戶搜索的關鍵詞/param>
    /// returns>返回搜索的結果/returns>
    public static ListSearchResult> Search(string keywords)
    {
      try
      {
        //索引存儲庫
        FSDirectory directory = FSDirectory.Open(new System.IO.DirectoryInfo(indexPath), new NoLockFactory());
        //創建IndexReader對象
        IndexReader reader = IndexReader.Open(directory, true);
        //創建IndexSearcher對象
        IndexSearcher searcher = new IndexSearcher(reader);
        //新建PhraseQuery 查詢對象
        PhraseQuery query = new PhraseQuery();
        //把用戶輸入的關鍵詞進行拆詞
        foreach (string word in SplitWord(keywords))
        {
          //添加搜索關鍵詞
          query.Add(new Term("body", word));
        }
        //設置分詞間距為100字之內
        query.SetSlop(100);
        TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
        //根據查詢條件查詢結果
        searcher.Search(query, null, collector);
        //搜索到的ScoreDoc結果
        ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;
        //保存搜索結果的list
        ListSearchResult> listResult = new ListSearchResult>();
        for (int i = 0; i  docs.Length; i++)
        {
          //取到文檔的編號(主鍵,這個是Lucene .net分配的)
          //檢索結果中只有文檔的id,如果要取Document,則需要Doc再去取
          //降低內容占用
          int docId = docs[i].doc;
          //根據id找Document
          Document doc = searcher.Doc(docId);
          string number = doc.Get("id");
          string title = doc.Get("title");
          string body = doc.Get("body");
          string url = doc.Get("url");
          //建立一個搜索結果對象
          SearchResult result = new SearchResult();
          result.Number = number;
          result.Title = title;
          result.BodyPreview = Preview(body, keywords);
          result.Url = url;
          //添加到結果列表
          listResult.Add(result);
        }
        if (listResult.Count == 0)
        {
          return null;
        }
        else
        {
          return listResult;
        }
      }
      catch (SystemException ex)
      {
        logger.Error(ex);
        return null;
      }
      catch (Exception ex)
      {
        logger.Error(ex);
        return null;
      }
    }

    /// summary>
    /// 獲取內容預覽
    /// /summary>
    /// param name="body">內容/param>
    /// param name="keyword">關鍵詞/param>
    /// returns>/returns>
    private static string Preview(string body, string keyword)
    {
      //創建HTMLFormatter,參數為高亮單詞的前后綴 
      PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("font color=\"red\">", "/font>");
      //創建 Highlighter ,輸入HTMLFormatter 和 盤古分詞對象Semgent 
      PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new PanGu.Segment());
      //設置每個摘要段的字符數 
      highlighter.FragmentSize = 100;
      //獲取最匹配的摘要段 
      string bodyPreview = highlighter.GetBestFragment(keyword, body);
      return bodyPreview;
    }

    /// summary>
    /// 盤古分詞,對用戶輸入的搜索關鍵詞進行分詞
    /// /summary>
    /// param name="str">用戶輸入的關鍵詞/param>
    /// returns>分詞之后的結果組成的數組/returns>
    private static string[] SplitWord(string str)
    {
      Liststring> list = new Liststring>();
      Analyzer analyzer = new PanGuAnalyzer();
      TokenStream tokenStream = analyzer.TokenStream("", new System.IO.StringReader(str));
      Lucene.Net.Analysis.Token token = null;
      while ((token = tokenStream.Next()) != null)
      {
        list.Add(token.TermText());
      }
      return list.ToArray();
    }
  }
}

SearchResult 模型

namespace Model.HelperModel
{
  public class SearchResult
  {
    public string Number { get; set; }

    public string Title { get; set; }

    public string BodyPreview { get; set; }

    public string Url { get; set; }
  }
}

以上所述就是本文的全部內容了,希望大家能夠喜歡。

您可能感興趣的文章:
  • Lucene.Net實現搜索結果分類統計功能(中小型網站)
  • Java實現lucene搜索功能的方法(推薦)
  • 基于Lucene的Java搜索服務器Elasticsearch安裝使用教程
  • 使用Java的Lucene搜索工具對檢索結果進行分組和分頁
  • 基于ASP.NET的lucene.net全文搜索實現步驟
  • 使用Lucene實現一個簡單的布爾搜索功能

標簽:咸寧 樂山 廣元 吉林 池州 固原 賀州 淮北

巨人網絡通訊聲明:本文標題《使用Lucene.NET實現站內搜索》,本文關鍵詞  使用,Lucene.NET,實現,站內,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Lucene.NET實現站內搜索》相關的同類信息!
  • 本頁收集關于使用Lucene.NET實現站內搜索的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    肉丝袜脚交视频一区二区| 亚洲三级电影网站| 国产suv一区二区三区88区| 日韩av一区二区三区四区| 亚洲精品视频在线看| 成年人午夜久久久| 99国内精品久久| 91天堂素人约啪| 99国产麻豆精品| 欧美日韩中文国产| 欧美羞羞免费网站| 91亚洲精品乱码久久久久久蜜桃| 99视频在线精品| bt7086福利一区国产| 99久久精品免费看| 欧美久久久影院| 欧美撒尿777hd撒尿| 欧美精品一二三区| 国产欧美日韩精品a在线观看| 国产三级欧美三级| 国产精品乱码一区二区三区软件 | 中文字幕av不卡| 国产精品沙发午睡系列990531| 国产精品家庭影院| 国产欧美日本一区视频| 欧美一区二区三区在线看| 精品国产一区二区三区四区四| 欧美电影免费观看高清完整版在| 2020国产精品自拍| 国产精品二三区| 亚洲永久免费视频| 亚洲天堂福利av| 亚洲成人av一区二区三区| 国产综合成人久久大片91| 欧美性色黄大片| 精品国产91乱码一区二区三区| 欧美国产日韩在线观看| 欧美一级欧美一级在线播放| 日韩免费看网站| 亚洲特黄一级片| 一区二区三区在线免费视频| 极品少妇xxxx精品少妇| 成人91在线观看| 国产精品中文字幕日韩精品| 欧美亚洲一区三区| 精品国产在天天线2019| 亚洲日本一区二区| 国产呦精品一区二区三区网站| 成人久久久精品乱码一区二区三区| 在线观看亚洲精品视频| 中文字幕日本乱码精品影院| |精品福利一区二区三区| 婷婷一区二区三区| 欧美日韩三级视频| 亚洲视频狠狠干| 国产在线视视频有精品| 精品日韩一区二区三区免费视频| 综合电影一区二区三区 | 欧美少妇性性性| 欧美日韩国产一区| 亚洲午夜精品在线| 欧美中文字幕一二三区视频| 综合自拍亚洲综合图不卡区| 国产美女精品人人做人人爽| 欧美精品欧美精品系列| 国产精品国产三级国产aⅴ入口 | 午夜电影一区二区三区| 国产成都精品91一区二区三| 91精品国产综合久久精品| 久久精品视频免费| 国产成人av网站| 精品99999| 午夜精品久久久久久久| 在线免费观看视频一区| 中文字幕一区二区三区不卡在线| 婷婷亚洲久悠悠色悠在线播放| 91麻豆精品国产91久久久使用方法 | 欧美日韩亚洲高清一区二区| 国产精品欧美久久久久无广告 | 欧美日韩不卡在线| 日韩不卡一二三区| 欧美色老头old∨ideo| 最新久久zyz资源站| 欧美日韩五月天| 午夜免费久久看| 欧美色成人综合| 精品一区二区三区免费观看 | 亚洲精品一区二区三区在线观看| 视频一区中文字幕国产| 精品久久久久久综合日本欧美| 日本中文字幕不卡| 麻豆成人久久精品二区三区小说| 一本一本久久a久久精品综合麻豆| 亚洲国产成人tv| 91久久国产最好的精华液| 91成人在线观看喷潮| 亚洲精品久久久蜜桃| 色综合网站在线| 香蕉成人伊视频在线观看| 久久久久国产精品厨房| 成人av网在线| 一区二区免费视频| 欧美岛国在线观看| 丁香天五香天堂综合| 亚洲日本在线a| 欧美丝袜丝交足nylons| 蜜臀久久99精品久久久久久9| 国产乱人伦精品一区二区在线观看| 久久久久久亚洲综合影院红桃| 东方aⅴ免费观看久久av| 亚洲精品伦理在线| 欧美日韩精品久久久| 久久激情五月激情| 国产日韩av一区二区| 欧美日产在线观看| 国产成人午夜99999| 一区二区三区 在线观看视频| 久久日韩粉嫩一区二区三区| 99久久久精品免费观看国产蜜| 亚洲国产精品精华液网站| 国产精品理论在线观看| 欧美卡1卡2卡| 成人午夜激情影院| 狠狠色丁香婷综合久久| 亚洲日本在线观看| 欧美第一区第二区| 制服.丝袜.亚洲.中文.综合 | 欧美中文字幕不卡| 成人激情小说乱人伦| 日韩国产精品久久久| 国产精品高潮呻吟| 国产日韩亚洲欧美综合| 欧美性猛交xxxx黑人交| 国产成人精品免费一区二区| 国产福利视频一区二区三区| 天堂成人免费av电影一区| 欧美国产精品v| 亚洲精品大片www| 亚洲最大色网站| 91免费版在线看| 夜夜嗨av一区二区三区| 中文一区在线播放| 欧美v亚洲v综合ⅴ国产v| 午夜成人免费电影| 亚洲成人精品一区| 亚洲日本欧美天堂| 亚洲成人自拍网| 性做久久久久久久免费看| 中国av一区二区三区| 欧美三区在线观看| 欧美性videosxxxxx| 成人晚上爱看视频| 视频一区二区中文字幕| 日本亚洲电影天堂| 一区二区三区在线播放| 欧美一区二区三区性视频| 91精品国产一区二区三区蜜臀| 国产一区二区三区| 日韩二区三区四区| 精品一区二区三区在线观看| 日日夜夜一区二区| 午夜亚洲福利老司机| 青娱乐精品视频| 日本女人一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 五月婷婷色综合| 亚洲va韩国va欧美va| 亚洲男人电影天堂| 午夜精品一区二区三区电影天堂| 中文无字幕一区二区三区 | 久久男人中文字幕资源站| 欧美极品aⅴ影院| 国产无一区二区| 日韩三级在线观看| 91精品国产综合久久久久| 在线成人av影院| 欧美国产一区二区在线观看| 欧美激情一区二区三区四区 | 国产精品一区二区黑丝| 韩国三级在线一区| 另类小说综合欧美亚洲| 亚洲视频1区2区| 国产精品高潮呻吟| 国产一区亚洲一区| 国产精品91一区二区| 国产精品一区二区三区99| 成a人片亚洲日本久久| 成人欧美一区二区三区视频网页| 国产精品免费av| 亚洲成a天堂v人片| 国产乱码精品一区二区三| 99这里只有久久精品视频| 欧美日韩一区二区在线观看| xnxx国产精品| 亚洲国产另类av| 国产剧情一区二区| 欧美精品自拍偷拍| 国产精品入口麻豆原神| 日韩激情av在线| 91老司机福利 在线|