Java 如何在lucene中对索引文件进行排序

Java 如何在lucene中对索引文件进行排序,java,sorting,lucene,indexing,Java,Sorting,Lucene,Indexing,我有一个由lucene制作的索引,其中的每个文档都有3个字段,其中一个是数字字段,这是我的频率。我在索引中搜索,但在搜索之前,我想按数字字段对其进行排序。有没有办法在我搜索之前按lucene对它进行排序?在搜索之前进行排序真的没有什么意义,因为lucene正在创建一个反向索引来搜索,而不是存储和搜索一组连续的文档 但是,听起来您希望运行搜索并获取已按指定方式排序的结果 这是通过将a传递给调用来完成的,如: SortField field = new SortField("frequency",

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

在搜索之前进行排序真的没有什么意义,因为lucene正在创建一个反向索引来搜索,而不是存储和搜索一组连续的文档

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

这是通过将a传递给调用来完成的,如:

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已经将术语频率纳入其相关性得分。如果您想调整这种评分,最好创建一个自定义的
相似性
类来为您计算评分,扩展或,并覆盖方法
tf
,特别是。

我的索引中有很多文档,大约有2000万个。在搜索之前需要排序什么?正如我告诉我的,数字字段是频率,我希望得到频率更高的结果。你有什么建议吗?@anony-no(除了相关链接)根据我的经验,Lucene已经提供了按分数递减排序的搜索结果。我知道这种方法,但它对我没有多大用处,因为我有一个大索引,如果我想使用它,我应该让maxDocs有一个大数字,这会使我的搜索速度变慢。请注意,我想搜索很多次,查询的前缀每次都会改变。所以我需要首先对索引进行排序,然后使用一个小的maxDocs进行搜索,以获得具有最高排名结果的良好搜索性能。除非我不理解你在说什么,否则这不是问题。正确的排序不取决于从索引中提取的文档数量。如果您向搜索者传递您想要返回5个文档,它将根据您的
排序
(除非您使用的是类似
EarlyTerminatingSortingCollector的内容,但我想您可能已经提到了这一点).你的意思是如果我在
Searcher.search中设置maxDocs,例如5,它会为我带来5个文档,其中包含我要在整个索引中排序的最大值?!但我认为它首先带来了索引的前5个文档,然后根据我的
排序对它们进行排序
,然而,在索引末尾或任何其他地方可能会有另一个文档具有我想要的更多价值,而不是前5个!它首先带来5个文档,然后排序,或者它对所有文档进行排序,然后给出前5个?如果是这种情况,我应该将maxDoc设置为一个大值,以确保它带来所有文档,然后对它们进行排序,这会使我的搜索变慢。