【问题标题】:How to sort an index file in lucene如何在lucene中对索引文件进行排序
【发布时间】:2013-06-14 07:33:18
【问题描述】:

我有一个由 lucene 制作的索引,其中的每个文档都有 3 个字段,其中一个是数字字段,这是我的频率。我在我的索引中搜索,但在它之前我想按数字字段对其进行排序。在我搜索之前有什么方法可以按 lucene 排序吗?

【问题讨论】:

  • 我的索引有很多文档大约2000万。
  • 搜索前需要排序什么?
  • 正如我告诉我的,数字字段是频率,我希望我的结果具有更高的频率。你有什么建议吗?
  • @匿名 - 没有。 (除了相关链接lucene.apache.org/core/4_3_0/misc/org/apache/lucene/index/…
  • 根据我的经验,Lucene 已经呈现了按分数降序排序的搜索结果。

标签: java sorting lucene indexing


【解决方案1】:

在搜索之前排序实际上并没有多大意义,因为 Lucene 正在创建一个倒排索引来进行搜索,而不是存储和搜索一组连续的文档。

但是,听起来您想运行搜索并获得已按指定方式排序的结果。

这是通过将Sort 传递给IndexSearcher.search 调用来完成的,例如:

SortField field = new SortField("frequency", SortField.Type.FLOAT);
//Sorting, first, by "frequency", then by relevance score
Sort sort = new Sort(field, Sort.FIELD_SCORE);
searcher.search(query, maxDocs, sort);

该字段的名称让我想知道您是否没有重新发明轮子。 Lucene 已经将术语频率纳入其相关性分数。如果您想调整这种评分,创建自定义Similarity 类来为您计算分数可能是一个更好的主意,扩展TFIDFSimilarityDefaultSimilarity,并覆盖方法tf,尤其是。

【讨论】:

  • 我知道这种方式,但它对我来说不是那么有用,因为我有一个很大的索引,如果我想使用它,我应该让 maxDocs 成为一个很大的数字,这会使我的搜索变慢。注意我想要搜索了这么多次,并且查询的前缀每次都会改变。所以我需要先对索引进行排序,然后用一个小的 maxDocs 搜索它,以获得良好的搜索性能和排名最高的结果。
  • 除非我无法理解您在说什么,否则这不是问题。正确排序不取决于您从索引中提取的文档数量。如果您向搜索者传递您想要返回 5 个文档的信息,它将根据您的 Sort 为您提供前 5 个文档(除非您使用类似 EarlyTerminatingSortingCollector 的东西,但我假设您会提到这一点)。
  • 您的意思是,如果我在Searcher.search 中设置 maxDocs,例如 5,它会给我带来 5 个文档,其中我想要在整个索引中排序的最大值?!但我认为它首先带来了前 5 个索引文档,然后根据我的Sort 对它们进行排序,但是在索引末尾或任何其他不包含的地方可能会有另一个文档具有我想要的更多价值前5个!它首先带来 5 个文档,然后对它们进行排序,或者对所有文档进行排序,然后给出前 5 个?如果这种情况我应该将 maxDoc 设置为一个很大的值,以确保它带来所有文档并对其进行排序,这会使我的搜索变慢.
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 2016-02-10
  • 2012-03-16
  • 2011-02-05
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多