乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      [Lucene.Net] 基本用法

       thy 2009-01-15
      本文僅記錄一些簡單的使用方法,供初學(xué)者參考。
      以下例子采用 Lucene.NET 1.9 版本,可取去 Lucene.Net 下載。

      1. 基本應(yīng)用
      using System;
      using System.Collections.Generic;
      using System.Text;
      using Lucene.Net;
      using Lucene.Net.Analysis;
      using Lucene.Net.Analysis.Standard;
      using Lucene.Net.Documents;
      using Lucene.Net.Index;
      using Lucene.Net.QueryParsers;
      using Lucene.Net.Search;
      using Lucene.Net.Store;
      using Lucene.Net.Util;

      namespace ConsoleApplication1.Lucene
      {
      public class LuceneTest
      {
      private const string FieldName = "name";
      private const string FieldValue = "value";

      private Directory directory = new RAMDirectory();
      private Analyzer analyzer = new StandardAnalyzer();

      public LuceneTest()
      {
      }

      private void Index()
      {
      IndexWriter writer = new IndexWriter(directory, analyzer, true);
      writer.maxFieldLength = 1000;

      for (int i = 1; i <= 100; i++)
      {
      Document document = new Document();

      document.Add(new Field(FieldName, "name" + i, Field.Store.YES, Field.Index.UN_TOKENIZED));
      document.Add(new Field(FieldValue, "Hello, World!", Field.Store.YES, Field.Index.TOKENIZED));

      writer.AddDocument(document);
      }

      writer.Optimize();
      writer.Close();
      }

      private void Search()
      {
      Query query = QueryParser.Parse("name*", FieldName, analyzer);

      IndexSearcher searcher = new IndexSearcher(directory);

      Hits hits = searcher.Search(query);

      Console.WriteLine("符合條件記錄:{0}; 索引庫記錄總數(shù):{1}", hits.Length(), searcher.Reader.NumDocs());
      for (int i = 0; i < hits.Length(); i++)
      {
      int docId = hits.Id(i);
      string name = hits.Doc(i).Get(FieldName);
      string value = hits.Doc(i).Get(FieldValue);
      float score = hits.Score(i);

      Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}",
      i + 1, docId, name, value, score);
      }

      searcher.Close();
      }
      }
      }

      除了 RAMDirectory,還可以使用 FSDirectory。(注意 FSDirectory.GetDirectory 的 create 參數(shù),為 true 時(shí)將刪除已有索引庫文件,可以通過 IndexReader.IndexExists() 方法判斷。)

      從指定目錄打開已有索引庫。
      private Directory directory = FSDirectory.GetDirectory("c:\index", false);

      將索引庫載入內(nèi)存,以提高搜索速度。
      private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:\index", false));
      //或
      //private Directory directory = new RAMDirectory(c:\index");

      2. 多字段搜索

      使用 MultiFieldQueryParser 可以指定多個(gè)搜索字段。
      Query query = MultiFieldQueryParser.Parse("name*", new string[] { FieldName, FieldValue }, analyzer);

      IndexReader reader = IndexReader.Open(directory);
      IndexSearcher searcher = new IndexSearcher(reader);
      Hits hits = searcher.Search(query);

      3. 多條件搜索

      除了使用 QueryParser.Parse 分解復(fù)雜的搜索語法外,還可以通過組合多個(gè) Query 來達(dá)到目的。
      Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 詞語搜索
      Query query2 = new WildcardQuery(new Term(FieldName, "name*")); // 通配符
      //Query query3 = new PrefixQuery(new Term(FieldName, "name1")); // 字段搜索 Field:Keyword,自動在結(jié)尾添加 *
      //Query query4 = new RangeQuery(new Term(FieldNumber, NumberTools.LongToString(11L)), new Term(FieldNumber, NumberTools.LongToString(13L)), true); // 范圍搜索
      //Query query5 = new FilteredQuery(query, filter); // 帶過濾條件的搜索

      BooleanQuery query = new BooleanQuery();
      query.Add(query1, BooleanClause.Occur.MUST);
      query.Add(query2, BooleanClause.Occur.MUST);

      IndexSearcher searcher = new IndexSearcher(reader);
      Hits hits = searcher.Search(query);

      4. 設(shè)置權(quán)重

      可以給 Document 和 Field 增加權(quán)重(Boost),使其在搜索結(jié)果排名更加靠前。缺省情況下,搜索結(jié)果以 Document.Score 作為排序依據(jù),該數(shù)值越大排名越靠前。Boost 缺省值為 1。
      Score = Score * Boost

      通過上面的公式,我們就可以設(shè)置不同的權(quán)重來影響排名。

      如下面的例子中根據(jù) VIP 級別設(shè)定不同的權(quán)重。
      Document document = new Document();
      switch (vip)
      {
      case VIP.Gold: document.SetBoost(2F); break;
      case VIP.Argentine: document.SetBoost(1.5F); break;
      }

      只要 Boost 足夠大,那么就可以讓某個(gè)命中結(jié)果永遠(yuǎn)排第一位,這就是百度等網(wǎng)站的"收費(fèi)排名"業(yè)務(wù)。明顯有失公平,鄙視一把。 [no]

      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();

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多