2014-06-25 5 views
0

저는 Lucene .NET v3 on .NET 4.5를 사용하고 있습니다. 내 쿼리에서 잘못된 결과를 얻는 이유가 확실하지 않습니다. 다음은 간단한 테스트 응용 프로그램입니다 :Lucene 숫자 범위 쿼리 결과가 반환되지 않음/예기치 않은 결과가 발생했습니다.

static class Program 
{ 
    static Document MakeDocument(String rcaName, int statusCode) 
    { 
     var doc = new Document(); 

     doc.Add(new Field("RCAName", rcaName, Field.Store.YES, Field.Index.NO)); 
     doc.Add(new Field("ActionId", Guid.NewGuid().ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 

     var status = new NumericField("Status", Field.Store.YES, true); 
     status.SetLongValue(statusCode); 
     doc.Add(status); 

     return doc; 
    } 

    static void Main() 
    { 
     var dir = new SimpleFSDirectory(new DirectoryInfo("C:/Sologic/temp/bsindex")); 
     // var analyzer = new SologicAnalyzer() { StopWords = StopAnalyzer.ENGLISH_STOP_WORDS_SET }; 
     var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 

     using (var writer = new Lucene.Net.Index.IndexWriter(dir, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED)) 
     { 
      writer.AddDocument(MakeDocument("RCA 1", 2)); 
      writer.AddDocument(MakeDocument("RCA 2", 4)); 
      writer.AddDocument(MakeDocument("RCA 3", 2)); 
      writer.AddDocument(MakeDocument("RCA 4", 4)); 
     } 

     var searcher = new Lucene.Net.Search.IndexSearcher(IndexReader.Open(dir, true)); 
     var query = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Status", analyzer).Parse("2"); 

     var hits = searcher.Search(query, 100); 

     Console.WriteLine(hits.TotalHits); 
     Console.Read(); 
    } 
} 

내가 루크와 인덱스를 열 때, 나는 다음과 같은 쿼리를 실행 :

Status:[2 TO 2] - 0 
Status:[4 TO 4] - 0 
Status:[0 TO 4] - 4 
Status:[0 TO 2] - 4 
Status:[0 TO 0] - 0 

나는 조금 당황 해요. 누구든지 내가 뭘 잘못하고 있는지 알아?

답변

0

두 가지 :

A.) int로 긴 값을 설정합니다. 나는 아마 이것이 아마 약간의 유분 사고를 아래 레벨로 이끌고 있다고 생각하고있다. 그만해.

status.SetLongValue(statusCode); 

는 int를 얻을 수있는 문자열을 구문 분석하지 마십시오)

status.SetIntValue(statusCode); 

B.된다. 기본적으로 QueryParser는 잘못된 선택입니다.

var query = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Status", analyzer).Parse("2"); 

당신이 당신의 문제가 해결되어 이제

var query = NumericRangeQuery.NewIntRange("Status", 4, 4, true, true); 

필요하지만, 난 여전히 루크에서 어떤 결과를 얻을 수 없습니다 : 당신은 어디. 아마도 도구 자체에 대한 오해 때문일 것입니다. 어쨌든, 행복한 산책로 친구.

+0

status.SetLongValue()가 SetIntValue()가되는 방법은 무엇입니까? statusCode는 암시 적으로 long으로 형변환됩니다. – HelloWorld