2012-11-07 3 views
1

lucene을 사용하여 특정 값보다 큰 값을 쿼리하는 데 문제가 있습니다. 내 데이터는 동적이므로 Linq는 옵션이 아닙니다.WhereGreaterThan은 LuceneQuery (RavenDB)에서 결과를 반환하지 않습니다.

간단히 말해서 문제는 Asset.Data의 가격이 값보다 큰 경우에도 WhereGreaterThan을 사용하여 쿼리를 수행 할 때 제로 결과가 발생한다는 것입니다. 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 그룹에서 답을 찾았습니다. 데이터와 동일한 데이터 형식으로 쿼리해야합니다. 그래서, "가격"이후이 경우 소수, 나는 where 절에 60M에 통과해야 :

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