2012-10-29 54 views
3

我最近有意識地認爲Nhibernate.Search會將我的類的整數屬性作爲數字字段進行索引。如何在Nhibernate.Search中添加數字字段?

[Indexed] 
public class Location : Entity 
{ 
    [IndexedEmbedded(Depth = 1, Prefix = "Country_")] 
    public virtual Country Country { get; set; } 
    [Field(Index.Tokenized)] 
    public virtual string Name { get; set; } 
    [Field(Index.Tokenized)] 
    public virtual string AlternativeNames { get; set; } 
    [Field(Index.Tokenized)] 
    public virtual string OriginalNames { get; set; } 
    [Field(Index.UnTokenized)] 
    public virtual string LocationType { get; set; } 
    [Field()] 
    public virtual int? Population { get; set; } 
} 

但是,當我設置排序的查詢,像這樣:

var words = query.Split(' '); 

     var luceneQuery = string.Join(" AND ", words.Select(x => "Name:{0}*".F(x))); 
     luceneQuery += " AND LocationType:locality"; 
     var results = search.CreateFullTextQuery<Location>(luceneQuery) 
      .SetSort(new Sort(new SortField("Population", CultureInfo.CurrentCulture, true))) 
      .SetMaxResults(100) 
      .List<Location>(); 

它返回由該號碼相同的樣式排列的結果排序是這樣一句話:

City  Country   Region   Population 
New London  United States North America 998 
Nueva Londres Paraguay   South America 971 
New London  United States North America 967 
Londonderry United Kingdom British Islands 92133 
London  Kiribati   Micronesia 921 
London  United States North America 8122 
London  United Kingdom British Islands 7869322 
New London  United States North America 7316 

所以我的問題是,因爲Nhibernate.Search將此視爲文本字段,我如何將其更改爲數字字段,並且是否可以轉換或者必須重新索引每一條記錄。其中340K。

我開始感受到Nhibernate.Search的便利性,如果它不能做到這一點。也許我將不得不重新開始使用普通的Lucene.Net?

感謝所有幫助

回答

1

更新

可能有用的鏈接:


我想無論是你的問題,在數字和範圍搜索,在這裏解決:http://find.searchhub.org/link?url=http://wiki.apache.org/lucene-java/SearchNumericalFields

由於Apache Lucene是一個全文搜索引擎,而不是一個 傳統的數據庫,它不能處理數字範圍(例如,字段 值在用戶定義的範圍內,甚至日期是數值)。 我們開發了一個Apache Lucene的擴展,它以一種特殊的字符串編碼格式存儲 數值,變量爲 精度(稱爲trie,所有數值如雙打,長整數,日期,浮點數和整數轉換爲字典式排序字符串 表示和索引不同的精度)。

...

數值型字段可以進行排序上(一種特殊的解析器納入FieldCache)和函數查詢中使用(通過FieldCache

我也通過Range searches for numbers發現LongClass.java實現:

我實現了一個「LongField」,它可以將任何+ ve或-ve long編碼成 正確排序的字符串。我在這裏發佈該課程: http://www.mail-archive.com/[email protected]/msg04790.html

做一個字符串範圍搜索應​​該是相當直接從 那裏。如果您有任何問題,請告訴我。

+0

嗨JSuar,我所知道的與Lucene和數字領域的問題,因爲我已經使用數字字段並排序它們在使用Lucene.Net之前,我的問題涉及到何時使用NHibernate.Search以及如何根據分配給模型的屬性對索引進行存儲時的字段。感謝您的建議鏈接,但Java文檔只告訴我在.Net實現中已經知道的內容。 – Richard

+0

請問這是更多你要找的東西:http://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/#d0e5179 – JSuar

相關問題