如何在Nhibernate.Search中添加数字字段?

时间:2012-10-29 10:03:06

标签: nhibernate lucene.net 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的便利性。如果不能做到这一点,搜索就会丢失。也许我将不得不重新使用正常的Lucene.Net?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

<强>更新

可能有用的链接:


我认为您在数字和范围搜索方面的问题都在这里解决:http://find.searchhub.org/link?url=http://wiki.apache.org/lucene-java/SearchNumericalFields

  

因为Apache Lucene是一个全文搜索引擎而不是   传统的数据库,它不能处理数值范围(例如,字段   value在用户定义的范围内,偶数日期是数值)。   我们开发了Apache Lucene的扩展,用于存储   带有变量的特殊字符串编码格式的数值   精度(称为trie,所有数值,如双,长,   日期,浮点数和整数将转换为字典可排序字符串   表示和索引与不同的精度)。

     

...

     

可以对数字字段进行排序(特殊解析器包含在FieldCache中)并用于函数查询(通过FieldCache

我还通过Range searches for numbers找到了LongClass.java实施:

  

我实现了一个“LongField”,它将任何+ ve或-ve long编码为a   正确排序的字符串。我在这里发了一堂课:   http://www.mail-archive.com/lucene-dev@jakarta.apache.org/msg04790.html

     

进行字符串范围搜索应​​该相当直接   那里。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

我知道这是针对hibernate.search的,而不是针对NHibernate.search,但是你可以在列上指定一个[NumericField]吗? (因为所有其他类似; - )

http://docs.jboss.org/hibernate/search/3.3/reference/en-US/html_single/#basic-mapping (4.1.1.3。@NumericField)