2013-03-18 37 views
0

我使用的是PerFieldAnalyzer設置ExactTitle使用新LowercaseKeywordAnalyzer組合:的創LowercaseKeywordAnalyzer與TermQuery沒有返回結果

private Analyzer GetDefaultAnalyzer() 
    { 
     var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30)); 
     perFieldAnalyzer.AddAnalyzer(ReportFields.ExactTitle, new LowercaseKeywordAnalyzer()); 
... 

我建立了索引,將在該領域:

var exactTitleField = new Field(ReportFields.ExactTitle, report.PortalReportTitle, Field.Store.NO, 
              Field.Index.NOT_ANALYZED); 
      exactTitleField.Boost = 10.0f; 
      reportDoc.Add(exactTitleField); 

當我使用2個單詞的例子「test abc」搜索它時,在我爲其進行TermQuery搜索時找不到它:

var term = new Term(exactField, "test abc"); 
var exactQuery = new TermQuery(term); 
query.Add(exactQuery,Occur.SHOULD); 
var hits = searcher.Search(query, null, HitsLimit, Sort.RELEVANCE); 

如果我搜索「測試美國廣播公司」,它的作品。我能做些什麼來使這個不區分大小寫的關鍵字/詞搜索工作?

這裏的分析:

public class LowercaseKeywordAnalyzer : Analyzer 
{ 

    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     TokenStream tokenStream = new KeywordTokenizer(reader); 
     tokenStream = new LowerCaseFilter(tokenStream); 
     return tokenStream; 
    } 
} 

在此先感謝。

回答

2

當你指定Field.Index.NOT_ANALYZED當你創建你的領域,分析儀將不會運行和文字不會被轉化爲

也許小寫

開關它Field.Index.ANALYZED

編輯您的索引代碼存在問題,並且不要忘記,如果您在索引時小寫,您還將在搜索時小寫輸入來獲得匹配。

既然你手動構建您的查詢,則需要自己處理。理想情況下,您希望在搜索時在構建Term之前對字符串運行相同的Analyzer

我已經提出了一個小巧的樣品,做你彷彿是試圖做的,也許它會幫助你找出什麼是錯的。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Lucene.Net.Analysis; 
using Lucene.Net.Analysis.Standard; 
using Lucene.Net.Documents; 
using Lucene.Net.Index; 
using Lucene.Net.Search; 
using Lucene.Net.Store; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      RAMDirectory dir = new RAMDirectory(); 
      var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); 
      perFieldAnalyzer.AddAnalyzer("ExactTitle", new LowercaseKeywordAnalyzer()); 

      IndexWriter indexWriter = new IndexWriter(dir, perFieldAnalyzer, IndexWriter.MaxFieldLength.UNLIMITED); 

      Document reportDoc = new Document(); 
      Field exactTitleField = new Field("ExactTitle", 
               "Test Abc", 
               Field.Store.NO, 
               Field.Index.ANALYZED); 

      reportDoc.Add(exactTitleField); 
      indexWriter.AddDocument(reportDoc); 
      indexWriter.Commit(); 

      IndexSearcher searcher = new IndexSearcher(indexWriter.GetReader()); 

      var term = new Term("ExactTitle", "test abc"); //note: for this to work this way you need to always lower case the search too 
      var exactQuery = new TermQuery(term); 

      var hits = searcher.Search(exactQuery, null, 25, Sort.RELEVANCE); 
      Console.WriteLine(hits.TotalHits); // prints "1" 
      Console.ReadLine(); 

      indexWriter.Close(); 

     } 

     public class LowercaseKeywordAnalyzer : Analyzer 
     { 

      public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
      { 
       TokenStream tokenStream = new KeywordTokenizer(reader); 
       tokenStream = new LowerCaseFilter(tokenStream); 
       return tokenStream; 
      } 
     } 
    } 
} 
+0

這是有道理的。但是,當我將其切換到ANALYZED時,無論是「test abc」還是「Test Abc」都找不到。你有沒有看到我錯過的其他東西? – DougJones 2013-03-18 20:15:35

+0

非常感謝您發佈代碼。事實證明,我沒有正確設置分析器索引時(多種方法,改變1和擊中另一種)。這就是說,你幫助我超越了下一個問題,提到我需要小寫正在搜索的輸入。再次感謝! – DougJones 2013-03-19 12:40:37