Lucene.net 3.0.3排序问题

时间:2015-01-20 09:59:49

标签: lucene lucene.net

我正在使用Lucene.Net 3.0.3。我试图按产品价格和库存对结果进行排序。但排序似乎没有做任何事情。我尝试在Visual Studio中调试lucene searcher.Search(),但最终会抛出一个调试异常:http://i62.tinypic.com/m7zyi9.png

我的代码如下所示:

将字段添加到文档中:

doc.Add(new NumericField("Price", Field.Store.YES, true).SetFloatValue(productLucene.Price));
doc.Add(new NumericField("Stock", Field.Store.YES, true).SetIntValue(productLucene.Stock));

创建排序:

switch (sortField)
{
    case "Price":
        sortFieldType = SortField.FLOAT;
        break;
    case "Stock":
        sortFieldType = SortField.INT;
        break;
}
sort = new Sort(new SortField(sortField, sortFieldType, false));

对结果集进行排序:

var hits = searcher.Search(booleanQuery, null, _hitsLimit, sort).ScoreDocs;
var results = _mapLuceneToDataList(hits, searcher);

我也尝试过按字符串和String_val排序,但这没有任何区别。我知道字段应该被索引以便能够排序。我知道该字段应该是未标记的,但我在lucene.net 3.0.3中找不到未标记的索引选项。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

对我来说,排序也没有达到我的预期。 来自another stackoverflow thread的以下解决方案帮助了我:

  

...只有在以下情况下才能进行排序   被满足:

     

1)您必须指定SortField(String field,int   类型),以使Lucene可以找到您的领域,即使这很正常   

     

2)必须对排序字段建立索引,但不能将其标记化:

     

document.add(新字段(“ byNumber”,Integer.toString(x),   Field.Store.NO,Field.Index.NOT_ANALYZED));

     

3)排序字段内容必须仅是纯文本。如果只有一个   元素在使用的字段之一中具有特殊字符或重音   进行排序时,整个搜索将返回未排序的结果。

我添加了一个额外的字段,用于使用上述配置进行排序: document.add(new Field(“ MunicipalitySort”,value,Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS));