我最近认为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?
感谢您的帮助
答案 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)