亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Lucene.net站內搜索-最簡單搜索引擎代碼

2019-11-17 02:03:00
字體:
來源:轉載
供稿:網友

Lucene.net站內搜索-最簡單搜索引擎代碼

Lucene.Net核心類簡介

先運行寫好的索引的代碼,再向下講解各個類的作用,不用背代碼。

(*)Directory表示索引文件(Lucene.net用來保存用戶扔過來的數據的地方)保存的地方,是抽象類,兩個子類FSDirectory(文件中)、RAMDirectory (內存中)。使用的時候別和IO里的Directory弄混了。

創建FSDirectory的方法,FSDirectory directory =FSDirectory.Open(new DirectoryInfo(indexPath),new NativeFSLockFactory()), path索引的文件夾路徑

IndexReader對索引進行讀取的類,對IndexWriter進行寫的類。IndexReader的靜態方法bool IndexExists(Directory directory)判斷目錄directory是否是一個索引目錄。IndexWriter的bool IsLocked(Directory directory) 判斷目錄是否鎖定,在對目錄寫之前會先把目錄鎖定。兩個IndexWriter沒法同時寫一個索引文件。IndexWriter在進行寫操作的時候會自動 加鎖,close的時候會自動解鎖。IndexWriter.Unlock方法手動解鎖(比如還沒來得及close IndexWriter 程序就崩潰了,可能造成一直被鎖定)。

創建索引

構造函數:IndexWriter(Directorydir, Analyzer a, bool create, MaxFieldLength mfl)因為IndexWriter把輸入寫入索引的時候,Lucene.net是把寫入的文件用指定的分詞器將文章分詞(這樣檢索的時候才能查的快), 然后將詞放入索引文件。

void AddDocument(Document doc),向索引中添加文檔(Insert)。Document類代表要索引的文檔(文章),最重要的方法Add(Field field),向文檔中添加字段。Document是一片文檔,Field是字段(屬性)。Document相當于一條記錄,Field相當于字段。

Field類的構造函數 Field(string name, string value, Field.Store store, Field.Indexindex, Field.TermVector termVector):name表示字段名; value表示字段值;

store表示是否存儲value值,可選值Field.Store.YES存儲,Field.Store.NO不存 儲,Field.Store.COMPRESS壓縮存儲;默認只保存分詞以后的一堆詞,而不保存分詞之前的內容,搜索的時候無法根據分詞后的東西還原原 文,因此如果要顯示原文(比如文章正文)則需要設置存儲。

index表示如何創建索引,可選值Field.Index. NOT_ANALYZED,不創建索引,Field.Index. ANALYZED,創建索引;創建索引的字段才可以比較好的檢索。是否碎尸萬段!是否需要按照這個字段進行“全文檢索”。

termVector表示如何保存索引詞之間的距離。“北京歡迎你們大家”,索引中是如何保存“北京”和“大家”之間“隔多少單詞”。方便只檢索在一定距離之內的詞。

為什么要把帖子的url做為一個Field,因為要在搜索展示的時候先帖子地址取出來構建超鏈接,所以Field.Store.YES;一般不需要 對url進行檢索,所以Field.Index.NOT_ANALYZED 。根據《紅樓夢》構建的“詞:頁數”紙,在構建完成后就可以把原文《紅樓夢》扔了

案例:對1000至1100號帖子進行索引。“只要能看懂例子和文檔,稍作修改即可實現自己的需求”。除了基礎知識外,第三方開發包只要“能看懂,改改即可”

引入命名空間:

  1. usingLucene.Net.Store;
  2. usingSystem.IO;
  3. usingLucene.Net.Index;
  4. usingLucene.Net.Analysis.PanGu;
  5. usingLucene.Net.Documents;
  6. usingLucene.Net.Search;

1對數據進行索引

  1. stringindexPath=@"C:/1017index";//注意和磁盤上文件夾的大小寫一致,否則會報錯。
  2. FSDirectorydirectory=FSDirectory.Open(newDirectoryInfo(indexPath),newNativeFSLockFactory());
  3. boolisUpdate=IndexReader.IndexExists(directory);//判斷索引庫是否存在
  4. if(isUpdate)
  5. {
  6. //如果索引目錄被鎖定(比如索引過程中程序異常退出),則首先解鎖
  7. //Lucene.Net在寫索引庫之前會自動加鎖,在close的時候會自動解鎖
  8. //不能多線程執行,只能處理意外被永遠鎖定的情況
  9. if(IndexWriter.IsLocked(directory))
  10. {
  11. IndexWriter.Unlock(directory);//un-否定。強制解鎖
  12. }
  13. }
  14. IndexWriterwriter=newIndexWriter(directory,newPanGuAnalyzer(),!isUpdate,Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
  15. for(inti=1000;i<1100;i++)
  16. {
  17. stringtxt=File.ReadAllText(@"D:/我的文檔/文章/"+i+".txt");
  18. Documentdocument=newDocument();//一條Document相當于一條記錄
  19. document.Add(newField("id",i.ToString(),Field.Store.YES,Field.Index.NOT_ANALYZED));
  20. //每個Document可以有自己的屬性(字段),所有字段名都是自定義的,值都是string類型
  21. //Field.Store.YES不僅要對文章進行分詞記錄,也要保存原文,就不用去數據庫里查一次了
  22. //需要進行全文檢索的字段加Field.Index.ANALYZED
  23. document.Add(newField("msg",txt,Field.Store.YES,Field.Index.ANALYZED,Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
  24. //防止重復索引
  25. writer.DeleteDocuments(newTerm("id",i.ToString()));//防止存在的數據//deletefromtwhereid=i
  26. //如果不存在則刪除0條
  27. writer.AddDocument(document);//把文檔寫入索引庫
  28. }
  29. writer.Close();
  30. directory.Close();//不要忘了Close,否則索引結果搜不到

2、搜索的代碼

  1. stringindexPath=@"C:/1017index";
  2. stringkw=TextBox1.Text;
  3. FSDirectorydirectory=FSDirectory.Open(newDirectoryInfo(indexPath),newNoLockFactory());
  4. IndexReaderreader=IndexReader.Open(directory,true);
  5. IndexSearchersearcher=newIndexSearcher(reader);
  6. PhraseQueryquery=newPhraseQuery();//查詢條件
  7. query.Add(newTerm("msg",kw));//wherecontains("msg",kw)
  8. //foreach(stringWordinkw.Split(''))//先用空格,讓用戶去分詞,空格分隔的就是詞“計算機專業”
  9. //{
  10. //query.Add(newTerm("msg",word));//contains("msg",word)
  11. //}
  12. query.SetSlop(100);//兩個詞的距離大于100(經驗值)就不放入搜索結果,因為距離太遠相關度就不高了
  13. TopScoreDocCollectorcollector=TopScoreDocCollector.create(1000,true);//盛放查詢結果的容器
  14. searcher.Search(query,null,collector);//使用query這個查詢條件進行搜索,搜索結果放入collector
  15. //collector.GetTotalHits()總的結果條數
  16. ScoreDoc[]docs=collector.TopDocs(0,collector.GetTotalHits()).scoreDocs;//從查詢結果中取出第m條到第n條的數據
  17. List<SearchResult>list=newList<SearchResult>();
  18. for(inti=0;i<docs.Length;i++)//遍歷查詢結果
  19. {
  20. intdocId=docs[i].doc;//拿到文檔的id。因為Document可能非常占內存(DataSetDataReader的區別)
  21. //所以查詢結果中只有id,具體內容需要二次查詢
  22. Documentdoc=searcher.Doc(docId);//根據id查詢內容。放進去的是Document,查出來的還是Document
  23. //Console.WriteLine(doc.Get("id"));
  24. //Console.WriteLine(doc.Get("msg"));
  25. SearchResultresult=newSearchResult();
  26. result.Id=Convert.ToInt32(doc.Get("id"));
  27. result.Msg=doc.Get("msg");//只有Field.Store.YES的字段才能用Get查出來
  28. list.Add(result);
  29. }
  30. Repeater1.DataSource=list;
  31. Repeater1.DataBind();

aspx代碼:

  1. <formid="form1"runat="server">
  2. <div>
  3. <asp:ButtonID="Button1"runat="server"onclick="Button1_Click"Text="創建索引"/>
  4. <br/>
  5. <br/>
  6. <asp:TextBoxID="TextBox1"runat="server"></asp:TextBox>
  7. <asp:ButtonID="Button2"runat="server"onclick="Button2_Click"Text="搜索"/>
  8. <br/>
  9. <ul>
  10. <asp:RepeaterID="Repeater1"runat="server">
  11. <ItemTemplate><li>Id:<%#Eval("Id")%><br/><%#Eval("Msg")%></li></ItemTemplate>
  12. </asp:Repeater>
  13. </ul>
  14. </div>
  15. </form>
  16. 本文摘自51CTO;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人交a欧美精品| 国内精品视频一区| 成人免费看黄网站| 欧美乱妇40p| www.久久撸.com| 性欧美激情精品| 欧美孕妇与黑人孕交| 久久精品国产一区二区电影| 欧美激情视频给我| 欧美日韩一区二区三区在线免费观看| 亚洲乱码国产乱码精品精| 久久久久久久影视| 黄色91在线观看| 欧美性xxxxhd| 日韩经典第一页| 国产大片精品免费永久看nba| 久久久人成影片一区二区三区观看| 日韩成人高清在线| 国产日韩在线播放| 亚洲欧美制服另类日韩| 国产成人精品av| 亚洲精品久久久久国产| 国产精品吹潮在线观看| 最新的欧美黄色| 欧美午夜精品久久久久久浪潮| 91免费看国产| 欧美在线观看www| 亚洲护士老师的毛茸茸最新章节| 青青在线视频一区二区三区| 成人午夜小视频| 午夜美女久久久久爽久久| 欧美性猛交xxxx乱大交3| 欧美在线影院在线视频| 国产在线一区二区三区| 欧美精品在线观看91| 欧美一级bbbbb性bbbb喷潮片| 91精品免费久久久久久久久| 国模吧一区二区三区| 亚洲精选在线观看| 久久福利网址导航| 亚洲欧美激情四射在线日| 97视频在线免费观看| 精品久久久久久久久久| 国产日韩精品在线观看| 亚洲综合小说区| 九九久久综合网站| 国产91色在线|免| 久色乳综合思思在线视频| www.久久久久| 国产精品爽爽爽| 亚洲精品之草原avav久久| 国产日本欧美一区| 91精品成人久久| 午夜精品一区二区三区在线| 97国产suv精品一区二区62| 国产一区二区三区精品久久久| 影音先锋日韩有码| 亚洲免费小视频| 欧美日韩激情视频8区| 色综合久久久久久中文网| 日韩在线观看视频免费| 亚洲美女av在线播放| 国产成人短视频| 国产精品视频白浆免费视频| 国产日韩亚洲欧美| 亚洲欧洲视频在线| 18性欧美xxxⅹ性满足| 91精品久久久久久久久久久| 一本色道久久88综合亚洲精品ⅰ| 在线精品国产成人综合| 在线播放国产一区中文字幕剧情欧美| 久久精品2019中文字幕| 另类视频在线观看| 亚洲性生活视频| 欧美疯狂做受xxxx高潮| 欧美另类极品videosbest最新版本| 91免费综合在线| 欧美在线一级va免费观看| 欧美在线播放视频| 亚洲午夜激情免费视频| 国产精品草莓在线免费观看| 日韩精品www| 最近2019年好看中文字幕视频| 亚洲精品自拍视频| 国产精品入口日韩视频大尺度| 97热在线精品视频在线观看| 欧美人成在线视频| 欧美在线视频观看免费网站| 日本精品一区二区三区在线| 国产成人久久久精品一区| 欧洲中文字幕国产精品| 久久国产精品网站| 久久99久久99精品免观看粉嫩| 91po在线观看91精品国产性色| 亚洲午夜av久久乱码| 精品视频一区在线视频| 亚洲综合中文字幕68页| 国产精品视频网站| 成人欧美在线视频| 久久色精品视频| 亚洲国产精品嫩草影院久久| 亚洲人成在线播放| 国产精品无码专区在线观看| 国产精品影片在线观看| 中文字幕亚洲天堂| 精品日本美女福利在线观看| 在线播放日韩专区| 国产午夜精品一区二区三区| 成人xvideos免费视频| 日本道色综合久久影院| 精品成人69xx.xyz| 久久久久久美女| 91超碰中文字幕久久精品| 日韩精品在线免费播放| 青青久久aⅴ北条麻妃| 欧美精品亚州精品| 夜夜嗨av一区二区三区免费区| 亚洲精品福利免费在线观看| 国产精品av免费在线观看| 精品视频中文字幕| 91久久精品视频| 日韩欧美成人区| 日韩电影免费观看中文字幕| 欧美人在线观看| 中文字幕欧美精品在线| 日韩激情在线视频| 日韩专区在线观看| 日韩在线观看高清| 欧美激情aaaa| 国产精品成人观看视频国产奇米| 国外成人在线视频| 成人黄色片网站| 亚洲www永久成人夜色| 97精品国产97久久久久久| 清纯唯美日韩制服另类| 国产精品久久婷婷六月丁香| 91免费版网站入口| 亚洲第一区在线| 成人午夜黄色影院| 亚洲精品乱码久久久久久按摩观| 亚洲国产又黄又爽女人高潮的| 日韩精品免费看| 日韩精品亚洲精品| 国产精品一区二区三区免费视频| 国产精品久久国产精品99gif| 欧美成人免费网| 欧美精品videos| 国内精品视频一区| 国产美女被下药99| 午夜精品在线视频| 久久人人爽人人爽人人片av高清| 欧美大全免费观看电视剧大泉洋| 日韩一区二区av| 91亚洲精华国产精华| 在线观看亚洲区| 国产精品色视频| 欧美日韩亚洲精品一区二区三区| 欧美激情一区二区三区久久久| 亚洲欧美国产精品va在线观看| 精品毛片三在线观看| 国产v综合ⅴ日韩v欧美大片| 日韩**中文字幕毛片| 亚洲老头老太hd| 麻豆精品精华液|