lucene排序、設置權重、優化、分布式搜索_第1頁
lucene排序、設置權重、優化、分布式搜索_第2頁
lucene排序、設置權重、優化、分布式搜索_第3頁
lucene排序、設置權重、優化、分布式搜索_第4頁
lucene排序、設置權重、優化、分布式搜索_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1. 基本應用 using System;using System.Collect ion s.Ge neric;using System.Text;using Luce ne.Net;using Luce ne.Net.A nalysis;using Luce ne.Net.A nalysis.Sta ndard;using Luce ne.Net.Docume nts;using Luce ne.Net.l ndex;using Luce ne.Net.QueryParsers;using Luce ne.Net.Search;using Luce ne.Net.Store;using L

2、uce ne.Net.Util;n amespace Con soleApplicati on 1.Luce nepublic class Luce neTestprivate const stri ng FieldName =a?name ;private const string FieldValue =value ;private Directory directory = new RAMDirectory();private An alyzer an alyzer = new Stan dardA nalyzer();public Luce neTest()private void I

3、n dex()In dexWriter writer = new In dexWriter(directory, an alyzer, true);writer.maxFieldLe ngth = 1000;for (int i = 1; i <= 100; i+)Docume nt docume nt = new Docume nt();document.Add(new Field(FieldName,name ” + i, Field.Store.YES,Field.I ndex.UN_TOKENIZED);docume nt.Add( new Field(FieldValue,He

4、llo, World! ”,Field.Store.YES,Field .In dex.TOKENIZED);writer.AddDocume nt(docume nt);writer.Optimize();writer.Close();private void Search()Query query = QueryParser.Parse( name* ”,FieldName, analyzer);In dexSearcher searcher = new In dexSearcher(directory);Hits hits = searcher.Search(query);Console

5、.WriteLine(符合條件記錄:0;索引庫記錄總數:1 ”, hits.Length(),searcher.Reader.NumDocs();for (int i = 0; i < hits.Le ngth(); i+)int docId = hits .I d(i);string name = hits.Doc(i).Get(FieldName);stri ng value = hits.Doc(i).Get(FieldValue);float score = hits.Score(i);Co nsole.WriteL in e(0: DocId:1; Name:2; Value:

6、3; Score:4 ”,i + 1, docId, n ame, value, score);searcher.Close();除了 RAMDirectory ,還可以使用 FSDirectory。(注意 FSDirectory .GetDirectory 的 create 參數,為true時將刪除已有索引庫文件, 可以通過IndexReader.IndexExists() 方法判斷。) 從指定目錄打開已有索引庫。private Directory directory = FSDirectory.GetDirectory(c:index ”,false);將索引庫載入內存,以提高搜索速度。p

7、rivate Directory directory = new RAMDirectory(FSDirectory.GetDirectory("c:index ”,false);/或/private Directory directory = new RAMDirectory(c:in dex");2. 多字段搜索使用MultiFieldQueryParser可以指定多個搜索字段。Query query = MultiFieldQueryParser.Parse( name* ”new string FieldName,FieldValue , an alyzer);In

8、dexReader reader = In dexReader.Ope n( directory);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);3. 多條件搜索除了使用QueryParser.Parse分解復雜的搜索語法外,還可以通過組合多個Query來達到目的。hame1 "); /詞語搜索name*"); / 通配符name1 "); /字段搜索Query query1 = new TermQuery (new Term(Fiel

9、dValue,Query query2 = new WildcardQuery (new Term(FieldName,/Query query3 = new PrefixQuery (new Term(FieldName, Field:Keyword,自動在結尾添加* /Query query4 = new Ran geQuery (new Term(FieldNumber,NumberTools.LongT oString(1 1L), new Term(FieldNumber,NumberTools.LongT oString(13L), true); / 范圍搜索/Query quer

10、y5 = new FilteredQuery(query, filter); /帶過濾條件的搜索Boolea nQuery query = new Boolea nQuery();query.Add(query1, Boolea nClause.Occur.MUST);query.Add(query2, Boolea nClause.Occur.MUST);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);4. 設置權重可以給Document和Field增加權重(Boo

11、st),使其在搜索結果排名更加靠前。缺省情況下,搜索結果以Document.Score作為排序依據,該數值越大排名越靠前。Boost缺省值為1。Score = Score * Boost通過上面的公式,我們就可以設置不同的權重來影響排名。如下面的例子中根據VIP級別設定不同的權重。Docume nt docume nt = new Docume nt();switch (vip)case VIP .Gold: document.SetBoost(2F); break;case VIP .Argentine: document.SetBoost(1.5F); break;只要Boost足夠大,那

12、么就可以讓某個命中結果永遠排第一位,這就是百度等網站的”收費排名”業務。明顯有失公平,鄙視一把。5. 排序通過SortField的構造參數,我們可以設置排序字段,排序條件,以及倒排。Sort sort = new Sort( new SortField(FieldName, SortField.DOC, false);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query, sort);排序對搜索速度影響還是很大的,盡可能不要使用多個排序條件。6. 過濾使用Filter對搜索結

13、果進行過濾,可以獲得更小范圍內更精確的結果。舉個例子,我們搜索上架時間在2005-10-1至U 2005-10-30 之間的商品。對于日期時間,我們需要轉換一下才能添加到索引庫,同時還必須是索引字段。/indexdocument.Add(FieldDate, DateField.DateToString(date), Field.Store.YES,Field.I ndex.UN_TOKENIZED);/ searchFilter filter = new DateFilter(FieldDate, DateTime.Parse(2005-10-1 ”),DateTime.Parse( 200

14、5-10-30 );Hits hits = searcher.Search(query, filter);除了日期時間,還可以使用整數。比如搜索價格在100 200 之間的商品。Luce ne.Net NumberTools對于數字進行了補位處理,如果需要使用浮點數可以自己參考源碼進行。/indexdocument.Add(new Field(FieldNumber, NumberTools.LongToString(long)price), Field.Store.YES, Fieldn dex.UN_TOKENIZED);/ searchFilter filter = new Ra nge

15、Filter(FieldNumber, NumberTools.Lo ngToStri ng(100L),NumberTools.LongT oString(200L), true, true);Hits hits = searcher.Search(query, filter);使用Query作為過濾條件。QueryFilter filter = new QueryFilter(QueryParser.Parse(name2 ",FieldValue, analyzer);我們還可以使用FilteredQuery進行多條件過濾。Filter filter = new DateFil

16、ter(FieldDate, DateTime.Parse(2005-10-10 ”),DateTime.Parse( 2005-10-15 );Filter filter2 = new Ran geFilter(FieldNumber, NumberTools.L on gToStri ng(11L),NumberTools.LongT oString(13L), true, true);Query query = QueryParser.Parse(name* ”,FieldName, analyzer);query = new FilteredQuery(query, filter);q

17、uery = new FilteredQuery(query, filter2);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);7. 分布搜索我們可以使用 MultiReader 或MultiSearcher 搜索多個索引庫。MultiReader reader = new MultiReader( new In dexReader IndexReader.Open("c:index "),1 ndexReader.Open("serv

18、erindex ");In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);或In dexSearcher searcher1 = new In dexSearcher(reader1);In dexSearcher searcher2 = new In dexSearcher(reader2);MultiSearcher searcher = new MultiSearcher( new Searchable searcher1, searcher2 );Hit

19、s hits = searcher.Search(query);還可以使用 ParallelMultiSearcher進行多線程并行搜索。8. 合并索引庫將 directory1 合并到 directory2 中。Directory directory1 = FSDirectory.GetDirectory(ihdex1 ",false);Directory directory2 = FSDirectory.GetDirectory(ihdex2 ",false);IndexWriter writer = new IndexWriter(directory2, analyz

20、er, false);writer.Add In dexes (new Directory directory );Co nsole.WriteL in e(writer.DocCou nt();writer.Close();9. 顯示搜索語法字符串我們組合了很多種搜索條件,或許想看看與其對等的搜索語法串是什么樣的。Boolea nQuery query = new Boolea nQuery();query.Add(query1, true, false);query.Add(query2, true, false);/Console.WriteLine(Syntax: 0 ”,query.ToString();輸出:Sy ntax: +(name:n ame* value: name*) +nu mber:0000000000000000b TO0000000000000000d呵呵,就這么簡單。10. 操作索引庫刪除(軟刪除,僅添加了刪除標記。調用IndexWriter.Optimize()后真正刪除。)In dexReader reader = In dexReader.Ope n( directory);/刪除指定序號(DocId)的 Document 。reader.Delete(123);II刪除包含指定 Te

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論