【发布时间】:2015-06-24 01:47:54
【问题描述】:
我在 Lucene 5.0 中对字符串字段进行排序时遇到问题。显然,自 Lucene 4 以来您可以进行排序的方式已经改变。下面显示了一些正在为我的文档索引的字段的 sn-p。
@Override
public Document generateDocument(Process entity)
{
Document doc = new Document();
doc.add(new IntField(id, entity.getID(), Field.Store.YES));
doc.add(new TextField(title, entity.getProcessName(), Field.Store.YES));
doc.add(new IntField(organizationID, entity.getOrganizationID(), Field.Store.YES));
doc.add(new StringField(versionDate, DateTools.dateToString(entity.getVersionDate(), DateTools.Resolution.SECOND), Field.Store.YES));
doc.add(new LongField(entityDate, entity.getVersionDate().getTime(), Field.Store.YES));
return doc;
}
我想先对相关性进行排序,这很好用。我遇到的问题是标题字段上的排序不起作用。我创建了一个排序字段,我尝试在一系列方法调用之后将其与 TopFieldCollector 一起使用。
public BaseSearchCore<Process, ProcessSearchResultScore>.SearchContainer search(String searchQuery, Filter filter, int page, int hitsPerPage) throws IOException, ParseException
{
SortField titleSort = new SortField(title, SortField.Type.STRING, true);
return super.search(searchQuery, filter, page, hitsPerPage, title);
}
去:
public SearchContainer search(String searchQuery, Filter filter, int page, int hitsPerPage, SortField... sortfields) throws IOException, ParseException
{
Query query = getQuery(searchQuery);
TopFieldCollector paginate = getCollector(sortfields);
int startIndex = (page -1) * hitsPerPage;
ScoreDoc[] hits = executeSearch(query, paginate, filter, startIndex, hitsPerPage);
return collectResults(query, filter, hitsPerPage, hits, page);
}
最后是应用排序字段的方法:
private TopFieldCollector getCollector(SortField sortfield) throws IOException
{
SortField[] sortFields = new SortField[] {SortField.FIELD_SCORE, sortField};
Sort sorter = new Sort(sortFields);
TopFieldCollector collector = TopFieldCollector.create(sorter, 25000, true, false, true);
return collector;
}
使用返回的收集器执行常规查询,并返回结果。但是,如果我尝试使用这个 SortField 进行排序,我会得到这个异常:
java.lang.IllegalStateException:字段“标题”的意外文档值类型 NONE(预期 = SORTED)。使用 UninvertingReader 或 index with docvalues。
我应该如何索引一个字符串字段以便能够在 Lucene 5 中按字母顺序(使用排序字段)对其进行排序?任何代码示例或 sn-ps 都会非常受欢迎。
按相关性搜索效果很好,但是当用户输入空搜索查询时,所有结果都具有相同的相关性。对于这些查询,我宁愿按结果标题进行排序,这会在这次 Lucene 迭代中引起问题。
【问题讨论】:
标签: java string sorting lucene