2012-11-07 42 views
1

我在使用lucene查詢大於某個值的值時遇到問題。我的數據是動態的,所以Linq不是一種選擇。WhereGreaterThan在LuceneQuery中返回沒有結果(RavenDB)

問題簡而言之就是當我使用WhereGreater查詢時,即使我的Asset.Data的價格大於某個值,我也會得到零結果。這適用於WhereGreaterThanOrEquals,WhereLessThan和WhereLessThanOrEquals。

public class AssetDataSearch : AbstractIndexCreationTask<Asset> 
{ 
    public AssetDataSearch() 
    { 
     Map = (docs) => 
      from d in docs 
      select new 
      { 
       DataType = d.DataType, 
       _ = d.SearchableParameters.Select(s => CreateField(s.Key, s.Value)) 
      }; 
    } 
} 

public class Test 
{ 
    public void TestMethod() 
    { 
     var assets = new [] 
     { 
      new Asset() 
      { 
       ID = Guid.NewGuid().ToString(), 
       Data = new ListingData() 
       { 
        Beds = 5, 
        Baths = 5, 
        ListingType = ListingTypeEnum.Condo, 
        Price = 100 
       } 
      }, 
      new Asset() 
      { 
       ID = Guid.NewGuid().ToString(), 
       Data = new ListingData() 
       { 
        LotSize = 55, 
        SqFeet = 89, 
        YearBuilt = 1965, 
        Price = 200 
       } 
      }, 
     }; 
     RavenHelper.InitTestingStore(); 
     using (var session = RavenDB.RavenUtility.OpenSession()) 
     { 
      foreach(var a in assets) 
       session.Store(a); 
      session.SaveChanges(); 
      var assetsInDb = session.Advanced.LuceneQuery<Asset>().WaitForNonStaleResults().ToArray(); 
      var n = session.Advanced.LuceneQuery<Asset, AssetDataSearch>().WhereEquals("Price", 100).ToArray(); // returns expected results 
      var gt = session.Advanced.LuceneQuery<Asset, AssetDataSearch>().WhereGreaterThan("Price", 60).ToArray(); // returns nothing 
      var lt = session.Advanced.LuceneQuery<Asset, AssetDataSearch>().WhereLessThan("Price", 60).ToArray(); // returns nothing 
     } 
    } 
} 

我在做什麼錯?

+0

問題是RavenDB將價格值解釋爲字符串,而不是數字。看看[這裏](http://ravendb.net/docs/appendixes/lucene-indexes-usage)。 – eulerfx

回答

0

我在Raven Google小組中找到了答案。事實證明,我必須使用與數據相同的數據類型進行查詢。因此,在這種情況下,由於「價格」是一個小數,我必須將60M傳遞給where子句:

var gt = session.Advanced.LuceneQuery<Asset, AssetDataSearch>().WhereGreaterThan("Price", 60M).ToArray();