2016-03-30 11 views
0

日時(長い)数値フィールドをソートしようとすると、私は常にFormatExceptionを取得します。Lucene - 日付をNumericFieldとしてソート

doc.Add(new NumericField("creationDate", Field.Store.YES, true) 
    .SetLongValue(DateTime.UtcNow.Ticks); 

が仕分け追加:数値フィールドの追加

When converting a string to DateTime, parse the string to take the date before putting each variable into the DateTime object.

インデックスを検査
// boolean query  
var sortField = new SortField("creationDate", SortField.LONG, true); 
var inverseSort = new Sort(sortField); 
var results = searcher.Search(query, null, 100, inverseSort); // exception thrown here 

を、私は 'のCreationDate' フィールドは、 "長い" の値を格納していることを確認することができます。この例外の原因は何ですか?

EDIT:

クエリ

var query = new BooleanQuery(); 
foreach (var termQuery in incomingProps.Select(p => new TermQuery(new Term(kvp.Key, kvp.Value.ToLowerInvariant())) 
{ 
    query.Add(new BooleanClause(termQuery , Occur.Must)); 
} 

return query; 

バージョン:3.0.3 Lucene.Net

UPDATE:

この問題は、今INT値で、再び発生しています。 Lucene.Netのソースコードをダウンロードし、問題をデバッグしました。

値 "\ b \ 0 \ 0 \ 0"を整数に解析しようとするとFieldCacheのどこかにありますが、少し奇妙です。

FieldCacheException

私は数値フィールドとして、これらの値を追加している:

doc.Add(new NumericField(VersionNum, int.MaxValue, Field.Store.YES, 
true).SetIntValue(VersionValue)); 

私は、少なくとも1が戻って打撃を受けることになってるときに私は例外を取得。

Version Term

とフィールドのテキストは次のとおりです: はインデックスを検査した後、私は次のようにフィールドの用語があることがわかり

enter image description here

EDIT:

私はハードコードしましたint値に変更し、いくつかのセグメントを追加しました:

doc.Add(new Field(VersionNum, NumericUtils.IntToPrefixCoded(1), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
enter image description here

そして私は、私はパースエラーを取得並べ替えしようとすると、まだ、:としてバージョンフィールドを格納になった

すべての例外については

var sortVersion = new SortField(VersionNum, SortField.INT, true); 

を、Luceneのは「解析しようとしている\ b \ 0 \ 0 \ 0 "である。 文字列として格納された接頭語コードを見ると、1は "\ b \ 0 \ 0 \ 0 \ 1"に変換されます。

LuceneはおそらくFieldCacheにいくらかのゴミを残していますか?

+0

"クエリ"の作成方法を表示できますか? – AndyPook

+0

@AndyPook質問を編集して「クエリ」を追加しました。私がDOCでソートすれば正常に動作します。 –

+0

日付フィールドはクエリには含まれていません。ソートにのみ使用されます。結果セットを返すように与えられたカスタムフィールドIDだけをクエリするとします。 –

答えて

1

ここでは、あなたが求めているものをキャプチャしようとする単体テストです。テストは合格になります。あなたのコードとの違いを説明できますか?(完全に失敗したテストを投稿すると、あなたが行っていることを理解するのに役立ちます:-))

using System; 
using System.Linq; 
using System.Collections.Generic; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

using Lucene.Net.Search; 
using Lucene.Net.Index; 
using Lucene.Net.Analysis.Standard; 
using Lucene.Net.QueryParsers; 
using Lucene.Net.Documents; 
using Lucene.Net.Store; 

namespace SO_answers 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void TestShopping() 
     { 
      var item = new Dictionary<string, string> 
      { 
       {"field1", "value1" }, 
       {"field2", "value2" }, 
       {"field3", "value3" } 
      }; 

      var writer = CreateIndex(); 
      Add(writer, item); 
      writer.Flush(true, true, true); 

      var searcher = new IndexSearcher(writer.GetReader()); 
      var result = Search(searcher, item); 

      Assert.AreEqual(1, result.Count); 

      writer.Dispose(); 
     } 

     private List<string> Search(IndexSearcher searcher, Dictionary<string, string> values) 
     { 
      var query = new BooleanQuery(); 
      foreach (var termQuery in values.Select(kvp => new TermQuery(new Term(kvp.Key, kvp.Value.ToLowerInvariant())))) 
       query.Add(new BooleanClause(termQuery, Occur.MUST)); 

      return Search(searcher, query); 
     } 

     private List<string> Search(IndexSearcher searcher, Query query) 
     { 
      var sortField = new SortField("creationDate", SortField.LONG, true); 
      var inverseSort = new Sort(sortField); 
      var results = searcher.Search(query, null, 100, inverseSort); // exception thrown here 


      var result = new List<string>(); 
      var matches = results.ScoreDocs; 
      foreach (var item in matches) 
      { 
       var id = item.Doc; 
       var doc = searcher.Doc(id); 
       result.Add(doc.GetField("creationDate").StringValue); 
      } 
      return result; 
     } 

     IndexWriter CreateIndex() 
     { 
      var directory = new RAMDirectory(); 

      var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 
      var writer = new IndexWriter(directory, analyzer, new IndexWriter.MaxFieldLength(1000)); 

      return writer; 
     } 
     void Add(IndexWriter writer, IDictionary<string, string> values) 
     { 
      var document = new Document(); 
      foreach (var kvp in values) 
       document.Add(new Field(kvp.Key, kvp.Value.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED)); 
      document.Add(new NumericField("creationDate", Field.Store.YES, true).SetLongValue(DateTime.UtcNow.Ticks)); 

      writer.AddDocument(document); 
     } 
    } 
} 
+0

答えをいただきありがとうございます。いつも大変助けになりました。それにもかかわらず、この場合、私は誤った日付値を持つ数千人の間で「忘れられた」文書を持っていました。あなたの答えは受け入れられたとマークします。ありがとうございました –

+0

アロハ・アンドイ、私はあなたの答えを受け入れています。問題はランダムに発生しており、何が起こっているのか分かりません。しかし、根本的な原因につながるいくつかの新しい発見があります。 –

+0

問題を発見しましたか? – AndyPook

関連する問題