lucene sort field 排序字段

作为感受过whoosh的各种优点的人,初学Lucene,各种不习惯.在使用最新的Lucene5.4的时候,搜索字段一直有问题.报错:

Exception in thread "main" java.lang.IllegalStateException: unexpected docvalues type NONE for field 'id' (expected=NUMERIC). Use UninvertingReader or index with docvalues.

在尝试使用google 和stackoverflow用英语搜索各种问题之后,都没有解决.没想到用中文搜索竟然找到了答案.特写一篇文章,希望被收录,帮到更多的人.

首先,之前的教程都是如下代码:

Sort sort = new Sort(new SortField("id",SortField.INT,false));
TopDocs topDocs = indexSearcher.search(query,100,sort);

而这样的代码直接运行就会报上面的错.

实际上,Lucene在5.X的版本中,应该使用排序专用Field,而不是IntField这种.

NumericDocValuesField  //SortedNumericDocValuesField 已过时的API 

demo:

// doc.add(new IntField("id", article.getId(),Store.YES));
doc.add(new NumericDocValuesField("sortid", article.getId()));

使用一个NumericDocValuesField索引专用字段用来保存需要索引的字段,然后在搜索的时候使用

Sort sort = new Sort(new SortField("sortid", SortField.Type.INT, true));


一月 5th, 2016 by