【问题标题】:Lucene.net 3.0.3 sort issueLucene.net 3.0.3 排序问题
【发布时间】:2015-03-18 12:13:06
【问题描述】:

我正在使用 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 中找不到未标记的索引选项。任何帮助将不胜感激。

【问题讨论】:

  • 排序不起作用是什么意思?你能按一个字段排序吗?
  • @Mysterion 我的数据显示的顺序似乎并没有随着排序而改变。所以基本上 searcher.search() 以相同的方式返回数据,有或没有排序。
  • 也坚持这一点。尝试了 Index 和 Store 的所有组合..仍然没有骰子

标签: lucene lucene.net


【解决方案1】:

对我来说,排序也没有像我预期的那样进行。 another stackoverflow thread 的以下解决方案帮助了我:

...在满足以下条件之前,排序将不起作用 满足:

1) 你必须指定 SortField(String field, int type) 让 Lucene 找到你的字段,即使这很正常 可选。

2) 排序字段必须被索引但不能被标记:

document.add (new Field ("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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多