gpt4 book ai didi

java - 在 Lucene 5.0 中按字母顺序对字符串字段进行排序

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:50 24 4
gpt4 key购买 nike

我在 Lucene 5.0 中对字符串字段进行排序时遇到问题。显然,自从 Lucene 4 以来,您可以排序的方式已经改变。下面显示了一些正在为我的文档建立索引的字段的片段。

@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(预期=已排序)。使用 UninvertingReader 或带文档值的索引。

我应该如何索引字符串字段以便能够在 Lucene 5 中按字母顺序(使用排序字段)对其进行排序?非常感谢任何代码示例或片段。

按相关性搜索效果很好,但当用户输入空搜索查询时,所有结果都具有相同的相关性。对于这些查询,我宁愿按结果标题排序,这会在 Lucene 的这次迭代中引起问题。

最佳答案

注意:如果您首先尝试将错误归结为最小的示例,那么找出错误(无论是为您自己还是为您询问的人)要容易得多。与其整理您的架构和我无权访问或对此一无所知的类,我将解决由此重现的问题:

Sort sort = new Sort(new SortField("title", SortField.Type.STRING));
TopDocs docs = searcher.search(new TermQuery(new Term("title", "something")), 10, sort);

标题定义如下:

doc.add(new TextField("title", term, Field.Store.YES));

此处对字段进行排序的最佳方法可能是采用有关文档值的建议。将 DocValues 添加到字段本质上是对其进行索引以进行排序,并且据我了解,Lucene 4.X 中的典型排序方法效率更高。将典型的 TextFieldSortedDocValuesField 添加到同一字段(名称)似乎效果很好,并且支持使用相同的字段名称进行搜索和排序:

doc.add(new TextField("title", term, Field.Store.YES));
doc.add(new SortedDocValuesField("title", new BytesRef(term)));

关于java - 在 Lucene 5.0 中按字母顺序对字符串字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com