當(dāng)幸福來敲門

          我就會(huì)牢牢抓住!
          隨筆 - 50, 文章 - 3, 評論 - 8, 引用 - 0
          數(shù)據(jù)加載中……

          分享示例Lucene.NET 2.9版本基本用法

          5. 排序

          通過 SortField 的構(gòu)造參數(shù),我們可以設(shè)置排序字段,排序條件,以及倒排。
          Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false)); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query, sort);
          排序?qū)λ阉魉俣扔绊戇€是很大的,盡可能不要使用多個(gè)排序條件。

          6. 過濾

          使用 Filter 對搜索結(jié)果進(jìn)行過濾,可以獲得更小范圍內(nèi)更精確的結(jié)果。

          舉個(gè)例子,我們搜索上架時(shí)間在 2005-10-1 到 2005-10-30 之間的商品。
          對于日期時(shí)間,我們需要轉(zhuǎn)換一下才能添加到索引庫,同時(shí)還必須是索引字段。
          // index document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED); //... // search Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-1"), DateTime.Parse("2005-10-30")); Hits hits = searcher.Search(query, filter);
          除了日期時(shí)間,還可以使用整數(shù)。比如搜索價(jià)格在 100 ~ 200 之間的商品。
          Lucene.Net NumberTools 對于數(shù)字進(jìn)行了補(bǔ)位處理,如果需要使用浮點(diǎn)數(shù)可以自己參考源碼進(jìn)行。
          // index document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED)); //... // search Filter filter = new RangeFilter(FieldNumber, NumberTools.LongToString(100L), NumberTools.LongToString(200L), true, true); Hits hits = searcher.Search(query, filter);
          使用 Query 作為過濾條件。
          QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));
          我們還可以使用 FilteredQuery 進(jìn)行多條件過濾。
          Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15")); Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true); Query query = QueryParser.Parse("name*", FieldName, analyzer); query = new FilteredQuery(query, filter); query = new FilteredQuery(query, filter2); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
          7. 分布搜索

          我們可以使用 MultiReader 或 MultiSearcher 搜索多個(gè)索引庫。
          MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:\index"), IndexReader.Open(@"\\server\index") }); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);

          IndexSearcher searcher1 = new IndexSearcher(reader1); IndexSearcher searcher2 = new IndexSearcher(reader2); MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 }); Hits hits = searcher.Search(query);
          還可以使用 ParallelMultiSearcher 進(jìn)行多線程并行搜索。

          8. 合并索引庫

          將 directory1 合并到 directory2 中。
          Directory directory1 = FSDirectory.GetDirectory("index1", false); Directory directory2 = FSDirectory.GetDirectory("index2", false); IndexWriter writer = new IndexWriter(directory2, analyzer, false); writer.AddIndexes(new Directory[] { directory }); Console.WriteLine(writer.DocCount()); writer.Close();
          9. 顯示搜索語法字符串

          我們組合了很多種搜索條件,或許想看看與其對等的搜索語法串是什么樣的。
          BooleanQuery query = new BooleanQuery(); query.Add(query1, true, false); query.Add(query2, true, false); //... Console.WriteLine("Syntax: {0}", query.ToString());
          輸出:
          Syntax: +(name:name* value:name*) +number:[0000000000000000b TO 0000000000000000d]

          呵呵,就這么簡單。

          10. 操作索引庫

          刪除 (軟刪除,僅添加了刪除標(biāo)記。調(diào)用 IndexWriter.Optimize() 后真正刪除。)
          IndexReader reader = IndexReader.Open(directory); // 刪除指定序號(DocId)的 Document。 reader.Delete(123); // 刪除包含指定 Term 的 Document。 reader.Delete(new Term(FieldValue, "Hello")); // 恢復(fù)軟刪除。 reader.UndeleteAll(); reader.Close();
          增量更新 (只需將 create 參數(shù)設(shè)為 false,即可往現(xiàn)有索引庫添加新數(shù)據(jù)。)
          Directory directory = FSDirectory.GetDirectory("index", false); IndexWriter writer = new IndexWriter(directory, analyzer, false); writer.AddDocument(doc1); writer.AddDocument(doc2); writer.Optimize(); writer.Close();
          11. 優(yōu)化

          批量向 FSDirectory 增加索引時(shí),增大合并因子(mergeFactor )和最小文檔合并數(shù)(minMergeDocs)有助于提高性能,減少索引時(shí)間。
          IndexWriter writer = new IndexWriter(directory, analyzer, true);  writer.maxFieldLength = 1000; // 字段最大長度 writer.mergeFactor = 1000; writer.minMergeDocs = 1000;  for (int i = 0; i < 10000; i++) { // Add Documentes... }  writer.Optimize(); writer.Close();
          文章來自學(xué)IT網(wǎng):http://www.xueit.com/LuceneNet/show-10315-2.aspx


          轉(zhuǎn)自《深入 Lucene 索引機(jī)制》

          利用 Lucene,在創(chuàng)建索引的工程中你可以充分利用機(jī)器的硬件資源來提高索引的效率。當(dāng)你需要索引大量的文件時(shí),你會(huì)注意到索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個(gè)問題, Lucene 在內(nèi)存中持有一塊緩沖區(qū)。但我們?nèi)绾慰刂?Lucene 的緩沖區(qū)呢?幸運(yùn)的是,Lucene 的類 IndexWriter 提供了三個(gè)參數(shù)用來調(diào)整緩沖區(qū)的大小以及往磁盤上寫索引文件的頻率。

          1.合并因子 (mergeFactor)

          這個(gè)參數(shù)決定了在 Lucene 的一個(gè)索引塊中可以存放多少文檔以及把磁盤上的索引塊合并成一個(gè)大的索引塊的頻率。比如,如果合并因子的值是 10,那么當(dāng)內(nèi)存中的文檔數(shù)達(dá)到 10 的時(shí)候所有的文檔都必須寫到磁盤上的一個(gè)新的索引塊中。并且,如果磁盤上的索引塊的隔數(shù)達(dá)到 10 的話,這 10 個(gè)索引塊會(huì)被合并成一個(gè)新的索引塊。這個(gè)參數(shù)的默認(rèn)值是 10,如果需要索引的文檔數(shù)非常多的話這個(gè)值將是非常不合適的。對批處理的索引來講,為這個(gè)參數(shù)賦一個(gè)比較大的值會(huì)得到比較好的索引效果。

          2.最小合并文檔數(shù) (minMergeDocs)

          這個(gè)參數(shù)也會(huì)影響索引的性能。它決定了內(nèi)存中的文檔數(shù)至少達(dá)到多少才能將它們寫回磁盤。這個(gè)參數(shù)的默認(rèn)值是10,如果你有足夠的內(nèi)存,那么將這個(gè)值盡量設(shè)的比較大一些將會(huì)顯著的提高索引性能。

          3.最大合并文檔數(shù) (maxMergeDocs)

          這個(gè)參數(shù)決定了一個(gè)索引塊中的最大的文檔數(shù)。它的默認(rèn)值是 Integer.MAX_VALUE,將這個(gè)參數(shù)設(shè)置為比較大的值可以提高索引效率和檢索速度,由于該參數(shù)的默認(rèn)值是整型的最大值,所以我們一般不需要改動(dòng)這個(gè)參數(shù)。

           

          文章來自學(xué)IT網(wǎng):http://www.xueit.com/LuceneNet/show-10315-2.aspx



          posted on 2011-12-14 14:05 wyx 閱讀(1926) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梁山县| 精河县| 西乌| 启东市| 宝鸡市| 茶陵县| 嘉义县| 安达市| 盐亭县| 沅江市| 读书| 策勒县| 阿克苏市| 锦州市| 苏州市| 泽州县| 麦盖提县| 勃利县| 江陵县| 云龙县| 云霄县| 霞浦县| 都兰县| 永福县| 广灵县| 乌鲁木齐县| 鱼台县| 阿拉尔市| 湄潭县| 乾安县| 巴青县| 娱乐| 抚州市| 沙洋县| 水城县| 丁青县| 奎屯市| 保山市| 台湾省| 香港| 清涧县|