2013-03-18 1 views
0

TermQuery 반환하지 결과와 함께 Zoom_out 개월은 LowercaseKeywordAnalyzer 내가 새로운 LowercaseKeywordAnalyzer를 사용하는 ExactTitle을 설정하는 PerFieldAnalyzer을 사용하고

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 검색을 수행 할 때 찾지 못합니다.

"Test Abc"에 대한 검색을 수행하면 작동합니다. 이 경우 대소 문자를 구분하지 않는 키워드/용어 검색 작업을 수행하려면 어떻게해야합니까? 사전에

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; 
    } 
} 

감사 :

여기 분석기입니다. 당신이 당신의 필드를 만들 때 Field.Index.NOT_ANALYZED를 지정하면

답변

2

은 분석기가 실행되지 않고 텍스트는 경우를

전환이 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

+0

코드를 게시 해 주셔서 감사합니다. 색인을 생성 할 때 (여러 방법, 1을 변경하고 다른 하나를 누르는 경우) 분석기를 올바르게 설정하지 않았 음이 밝혀졌습니다. 즉, 다음 문제를 넘어 나를 도왔다. 입력 된 내용을 소문자로 검색해야한다고 언급했다. 다시 한 번 감사드립니다! – DougJones