使用SortedSetDocValuesField对多个字段进行排序 - 错误:意外的docvalues为字段键入SORTED_SET

时间:2017-02-20 14:26:51

标签: java sorting jsf lucene

我正在使用Lucene 5.5.0搜索JSF Web应用程序。在应用程序中,多个用户可以编辑文档,并且将创建非常简单(仅日期和用户名)的编辑日志。例如:

2017-02-10 user15
2017-02-01 user14
2017-01-15 user15 

现在我希望有一个搜索功能,用户可以在其中查找自己的编辑 - 按编辑日期排序。看,但我对SORTING有疑问。请注意,我在每个文档中都有几个编辑条目。

我的索引编写的java代码:

doc.add(new StoredField(fieldName, fieldValue));
doc.add(new SortedSetDocValuesField(fieldName, new BytesRef(fieldValue)));

我的排序代码:

Sort sort = new Sort(new SortField("UserID", SortField.Type.STRING));
docs = searcher.search(finalQuery, hitsPerPage, sort);

索引工作正常,但如果我正在搜索某些内容,则会收到以下错误消息:

unexpected docvalues type SORTED_SET for field 'UserID' (expected=SORTED).
Use UninvertingReader or index with docvalues.

错误消息说我应该使用docvalues - 但我已经使用SortedSetDocValuesField执行此操作。你真正的问题是如何摆脱这个错误信息。

我的代码为based on this answer ,但我将SortedDocValuesField更改为SortedSETDocValuesField。否则,我在创建索引时会收到错误DocValuesField "UserID" appears more than once in this document (only one value is allowed per field)

那么,我是否必须为SortedSETDocValuesField设置特殊设置?我也看了一下this question,但它对我来说没用,因为我正在使用字符串(想要按字母顺序排序)而不是Double。非常感谢你提前:)。

对于这个问题并不重要,但是要了解我的搜索如何适用于此字段:

在“UserID”字段中,我存储了一个字符串“2017-02-10 === user15”,我将自定义分析器(仅用于索引)拆分为令牌“2017-02-10”, “user15”。然后我将这些字符串添加到每个文档中。搜索时,结果(结果的确定已经有效)应按降序排序(最高/最新日期)。

1 个答案:

答案 0 :(得分:1)

是的,您需要使用SortedSetSortField,而不是标准SortField