3

我最近假设 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?

谢谢你的帮助

4

2 回答 2

1

更新

可能有用的链接:


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

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

...

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

我还LongClass.java通过Range 搜索数字找到了一个实现:

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

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

于 2013-01-09T12:52:41.807 回答
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)

于 2013-01-09T14:44:45.917 回答