国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

【原創(chuàng)】Lucene.Net+盤古分詞器(詳細(xì)介紹)

2019-11-17 01:41:38
字體:
供稿:網(wǎng)友

【原創(chuàng)】Lucene.Net+盤古分詞器(詳細(xì)介紹)

本章閱讀概要

1、Lucenne.Net簡介

2、介紹盤古分詞器

3、Lucene.Net實(shí)例分析

4、結(jié)束語(Demo下載)

Lucene.Net簡介

  Lucene.net是Lucene的.net移植版本,是一個(gè)開源的全文檢索引擎開發(fā)包,即它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎。開發(fā)人員可以基于Lucene.net實(shí)現(xiàn)全文檢索的功能。   

  Lucene.net是Apache軟件基金會贊助的開源項(xiàng)目,基于Apache License協(xié)議。   

  Lucene.net并不是一個(gè)爬行搜索引擎,也不會自動(dòng)地索引內(nèi)容。我們得先將要索引的文檔中的文本抽取出來,然后再將其加到Lucene.net索引中。標(biāo)準(zhǔn)的步驟是先初始化一個(gè)Analyzer、打開一個(gè)IndexWriter、然后再將文檔一個(gè)接一個(gè)地加進(jìn)去。一旦完成這些步驟,索引就可以在關(guān)閉前得到優(yōu)化,同時(shí)所做的改變也會生效。這個(gè)過程可能比開發(fā)者習(xí)慣的方式更加手工化一些,但卻在數(shù)據(jù)的索引上給予你更多的靈活性。

(來自百度百科)

盤古分詞器

盤古分詞是一個(gè)中英文分詞組件。作者eaglet 曾經(jīng)開發(fā)過KTDictSeg 中文分詞組件,擁有大量用戶。作者基于之前分詞組件的開發(fā)經(jīng)驗(yàn),結(jié)合最新的開發(fā)技術(shù)重新編寫了盤古分詞組件。主要有以下功能:

1、中文未登陸詞識別

2、詞頻優(yōu)先

3、一元分詞,多元分詞

4、中文人名分詞

5、繁體中文分詞

6、英文分詞

7、用戶自定義規(guī)則(字典管理,動(dòng)態(tài)加載字典,關(guān)鍵詞高亮)

……

由于盤古分詞器不是本章的重點(diǎn)內(nèi)容,就簡單帶過了。有興趣的朋友可以自己網(wǎng)上找找相關(guān)資料。文章末尾會提供一個(gè)盤古分詞器的應(yīng)用程序供下載

Lucene.Net實(shí)例分析

先上一下Demo的圖把,看下最后運(yùn)行效果:

數(shù)據(jù)是臨時(shí)隨便創(chuàng)建的數(shù)據(jù),表格和樣式也是隨便畫的,不喜歡的朋友多包涵吶!

接下來就一步一步來講解整個(gè)編碼過程(主要對一些核心的類和細(xì)節(jié)作為講解過程),Let's GO

第一步:創(chuàng)建索引

1、由于索引是存放在硬盤里的,所以先定義一個(gè)索引的目錄

 1         /// <summary> 2         /// 索引存放目錄 3         /// </summary> 4         PRotected string IndexDic 5         { 6             get 7             { 8                 return Server.MapPath("/IndexDic"); 9             }10         }

2、創(chuàng)建索引器把要索引的內(nèi)容寫入到指定目錄

?
1IndexWriter writer = new IndexWriter(IndexDic, PanGuAnalyzer, isCreate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);

索引器的構(gòu)造函數(shù)參數(shù)說明:

IndexDic是索引存放目錄

PanGuAnalyzer是盤古解析器(由于默認(rèn)的解析器解析能力不強(qiáng),所以替換為這個(gè))

IsCreate是索引創(chuàng)建方式(true:重新新建索引,false:從舊的索引執(zhí)行追加)

Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED是文件長度是否限制

3、創(chuàng)建索引Document和往文檔寫入索引內(nèi)容

 1         private void AddIndex(IndexWriter writer, string title, string content,string date) 2         { 3             try 4             { 5                 Document doc = new Document(); 6                 doc.Add(new Field("Title", title, Field.Store.YES, Field.Index.ANALYZED));//存儲且索引 7                 doc.Add(new Field("Content", content, Field.Store.YES, Field.Index.ANALYZED));//存儲且索引 8                 doc.Add(new Field("AddTime", date, Field.Store.YES, Field.Index.NOT_ANALYZED));//存儲且索引 9                 writer.AddDocument(doc);10             }11             catch (FileNotFoundException fnfe)12             {13                 throw fnfe;14             }15             catch (Exception ex)16             {17                 throw ex;18             }19         }

Document是索引文檔,可以理解成數(shù)據(jù)庫里的記錄

Field是索引文檔里的字段,可以直接理解成數(shù)據(jù)庫里的字段

Field構(gòu)造函數(shù)說明:

第一個(gè)是字段名稱(實(shí)例里是Title,Content,AddTime)。

第二個(gè)是字段的存儲方式(Field.Store.YES:進(jìn)行存儲,F(xiàn)iled.Store.No:不進(jìn)行存儲)有些字段值比較大,可以選擇No不存儲,對字段進(jìn)行存儲是為了檢索的時(shí)候?qū)δ承┳侄芜M(jìn)行提取。

第三個(gè)是是否索引(Field.Index.ANALYZED:索引,F(xiàn)ield.Index.NOT_ANALYZED:非索引)

4、到此為止索引就創(chuàng)建完成了,應(yīng)該可以看到索引目錄會產(chǎn)生幾個(gè)文件,如下圖:

第二步:搜索索引

lucene的搜索相當(dāng)強(qiáng)大,它提供了很多輔助查詢類,每個(gè)類都繼承自Query類,各自完成一種特殊的查詢,你可以像搭積木一樣將它們?nèi)我饨M合使用,完成一些復(fù)雜操 作;另外lucene還提供了Sort類對結(jié)果進(jìn)行排序,提供了Filter類對查詢條件進(jìn)行限制。你或許會不自覺地拿它跟SQL語句進(jìn)行比 較:“lucene能執(zhí)行and、or、order by、where、like ‘%xx%’操作嗎?”回答是:“當(dāng)然沒問題!”

 1         private void SearchIndex() 2         { 3             Dictionary<string, string> dic = new Dictionary<string, string>(); 4             BooleanQuery bQuery = new BooleanQuery(); 5             string title = string.Empty; 6             string content = string.Empty; 7             if (Request.Form["title"] != null && Request.Form["title"].ToString()!="") 8             { 9                 title =GetKeyWordsSplitBySpace( Request.Form["title"].ToString());10                 QueryParser parse = new QueryParser("Title", PanGuAnalyzer);11                 Query query = parse.Parse(title);12                 parse.SetDefaultOperator(QueryParser.Operator.AND);13                 bQuery.Add(query, BooleanClause.Occur.MUST);14                 dic.Add("title",Request.Form["title"].ToString());15                 txtTitle = Request.Form["title"].ToString();16             }17             if (Request.Form["content"] != null && Request.Form["content"].ToString() != "")18             {19                 content = GetKeyWordsSplitBySpace(Request.Form["content"].ToString());20                 QueryParser parse = new QueryParser("Content", PanGuAnalyzer);21                 Query query = parse.Parse(content);22                 parse.SetDefaultOperator(QueryParser.Operator.AND);23                 bQuery.Add(query, BooleanClause.Occur.MUST);24                 dic.Add("content",Request.Form["content"].ToString());25                 txtContent = Request.Form["content"].ToString();26             }27             if (bQuery != null && bQuery.GetClauses().Length>0)28             {29                 GetSearchResult(bQuery, dic);30             }31         }

這段代碼創(chuàng)建了一個(gè)索引查詢器,對title和content這兩個(gè)字段進(jìn)行查詢。

1、介紹各種Query

TermQuery: 首先介紹最基本的查詢,如果你想執(zhí)行一個(gè)這樣的查詢:在content字段中查詢包含‘劉備的document”,那么你可以用TermQuery:

1             Term t = new Term("content", "劉備");2             Query query = new TermQuery(t);

BooleanQuery :如果你想這么查詢:在content字段中包含”劉備“并且在title字段包含”三國“的document”,那么你可以建立兩個(gè)TermQuery并把它們用BooleanQuery連接起來:

1             TermQuery termQuery1 = new TermQuery(new Term("content", "劉備"));2             TermQuery termQuery2 = new TermQuery(new Term("title", "三國"));3             BooleanQuery booleanQuery = new BooleanQuery();4             booleanQuery.Add(termQuery1, BooleanClause.Occur.SHOULD);5             booleanQuery.Add(termQuery2, BooleanClause.Occur.SHOULD);

WildcardQuery :如果你想對某單詞進(jìn)行通配符查詢,你可以用WildcardQuery,通配符包括’?’匹配一個(gè)任意字符和’*’匹配零個(gè)或多個(gè)任意字符,例如你搜索’三國*’,你可能找到’三國演義’或者’三國志’:

1             Query query = new WildcardQuery(new Term("content", "三國*"));

PhraseQuery :你可能對中日關(guān)系比較感興趣,想查找‘中’和‘日’挨得比較近(5個(gè)字的距離內(nèi))的文章,超過這個(gè)距離的不予考慮,你可以:

1             PhraseQuery query = new PhraseQuery(); 2             query.SetSlop(5); 3             query.Add(new Term("content ", "中"));4             query.Add(new Term("content", "日"));

那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中國某高層領(lǐng)導(dǎo)說日本欠扁”。

PrefixQuery :如果你想搜以‘中’開頭的詞語,你可以用PrefixQuery:

1             PrefixQuery query = new PrefixQuery(new Term("content ", "中"));

FuzzyQuery :FuzzyQuery用來搜索相似的term,使用Levenshtein算法。假設(shè)你想搜索跟‘wuzza’相似的詞語,你可以:

1             Query query = new FuzzyQuery(new Term("content", "wuzza"));

你可能得到‘fuzzy’和‘wuzzy’。

RangeQuery: 另一個(gè)常用的Query是RangeQuery,你也許想搜索時(shí)間域從20060101到20060130之間的document,你可以用RangeQuery:

1             RangeQuery query = new RangeQuery(new Term("time","20060101"), new Term("time","20060130"), true);

最后的true表示用閉合區(qū)間。

第三步:返回索引結(jié)果

上面介紹完各種查詢的Query,接下來看看LuceneNet返回的數(shù)據(jù)集如何處理,如何顯示高亮,上代碼:

 1 private void GetSearchResult(BooleanQuery bQuery,Dictionary<string,string> dicKeywords) 2         {           3             IndexSearcher search = new IndexSearcher(IndexDic,true); 4             Stopwatch stopwatch = Stopwatch.StartNew(); 5             //SortField構(gòu)造函數(shù)第三個(gè)字段true為降序,false為升序 6             Sort sort = new Sort(new SortField("AddTime", SortField.DOC, true)); 7             TopDocs docs = search.Search(bQuery, (Filter)null, PageSize * PageIndex, sort); 8             stopwatch.Stop(); 9             if (docs != null && docs.totalHits > 0)10             {11                 lSearchTime = stopwatch.ElapsedMilliseconds;12                 txtPageFoot = GetPageFoot(Pa
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 缙云县| 咸丰县| 昌都县| 简阳市| 麻江县| 泽普县| 印江| 柳州市| 海安县| 巫山县| 满城县| 凌云县| 永登县| 会理县| 墨玉县| 龙泉市| 鄱阳县| 防城港市| 北海市| 临沭县| 富裕县| 绥德县| 淮北市| 星座| 万州区| 蛟河市| 师宗县| 萍乡市| 梁山县| 郸城县| 电白县| 保康县| 伊宁县| 阳高县| 香河县| 石河子市| 成武县| 阿尔山市| 德江县| 固阳县| 松原市|