我试图将我的应用程序中的Lucene从3.5.0升级到5.0.0。该应用程序具有以下代码:
IndexReader indexReader=IndexReader.open(index);
String[] fields = indexReader.getFieldNames(FieldOption.ALL).toArray(new String[0]);
我需要fieldNames,所以我在MultiFieldQueryParser中使用它们。如何更改版本5.0.0?
答案 0 :(得分:2)
您可以使用LeafReader.getFieldInfos()
方法从阅读器获取字段信息,反过来,您可以从FieldInfo.name
获取字段名称:
public static String[] getFieldNames(IndexReader reader) {
List<String> fieldNames = new ArrayList<String>();
//For a simple reader over only one index, reader.leaves() should only return one LeafReaderContext
for (LeafReaderContext readerCtx : reader.leaves()) {
FieldInfos fields = readerCtx.reader().getFieldInfos();
for (FieldInfo field : fields) {
//Check whether the field is indexed and searchable, perhaps?
fieldNames.add(field.name);
}
}
return fieldNames.toArray(new String[fieldNames.size()]);
}
注意:可能值得考虑使用包含您要搜索的所有内容的catch-all字段。这是一种常见且非常有用的模式(例如Elasticsearch默认使用_all field)
走这条路线,您可以期望索引变得更大,但它使用起来更简单,并且应该提高性能。