【问题标题】:How can you add numeric fields in Nhibernate.Search?如何在 Nhibernate.Search 中添加数字字段?
【发布时间】:2012-10-29 10:03:06
【问题描述】:

我最近误以为 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?

感谢您的帮助

【问题讨论】:

    标签: nhibernate lucene.net nhibernate.search


    【解决方案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/lucene-dev@jakarta.apache.org/msg04790.html

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

    【讨论】:

    • 嗨 JSuar,我知道 Lucene 和数字字段的问题,因为我在使用 Lucene.Net 之前使用了数字字段并对它们进行了排序,我的问题与使用 NHibernate.Search 以及如何字段在根据分配给模型的属性进行索引时存储。感谢您提供建议的链接,但 Java 文档只是告诉我我在 .Net 实现中已经知道的内容。
    • 这是否是您正在寻找的更多内容:docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/…
    【解决方案2】:

    我知道这是针对 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)

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      相关资源
      最近更新 更多