我正在写一个shell脚本(csh),它必须确定lucene索引的版本,然后根据这个版本将索引升级到下一个版本。所以,如果lucene索引是在2.x上,我必须将索引升级到3.x。由于升级索引是一个连续的过程(2.x-〉3.x-〉4.x-〉5.x-〉6.x),因此我必须事先知道索引的版本,以便能够正确地设置类路径并进行升级。请帮我一下。
xpcnnkqh1#
这 不 是 一 个 非常 干净 的 解决 方案 , 但 这 就 是 我 通过 SegmentInfos 所 能 找到 的 全部 。LuceneVersion - - 〉 本次 提交 使用 了 哪个 Lucene 代码 版本 , 写 为 三 个 vInt :主要 、 次要 、 错误 修复当 你 创建 你 的 IndexReader 时 , 它 是 一 个 具体 的 读取 器 类 , 比如 - StandardDirectoryReader , 这个 类 有 一 个 toString() 方法 , 如下 所 示 , 它 打印 每个 段 的 lucene 版本 , 这样 你 就 可以 在 IndexReader 示例 上 调用 - toString() 。@Override public String toString() { final StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('('); final String segmentsFile = segmentInfos.getSegmentsFileName(); if (segmentsFile != null) { buffer.append(segmentsFile).append(":").append(segmentInfos.getVersion()); } if (writer != null) { buffer.append(":nrt"); } for (final LeafReader r : getSequentialSubReaders()) { buffer.append(' '); buffer.append(r); } buffer.append(')'); return buffer.toString(); }我 想 , 一 个 单一 版本 的 整个 索引 没有 意义 , 因为 一 个 索引 可能 有 文件 提交 从 以前 的 版本 作家 了 。如果 版本 距离 不是 Lucene 定义 的 那么 远 , 则 可以 使用 最 新 版本 的 读取 器 搜索 用 较 旧 版本 的 Lucene 编写 器 提交 的 文档 。您 可以 在 Core Java 中 编写 一 个 简单 的 逻辑 , 使用 regex 提取 最 高 的 lucene 版本 作为 lucene 索引 版本 。
IndexReader
toString()
@Override public String toString() { final StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('('); final String segmentsFile = segmentInfos.getSegmentsFileName(); if (segmentsFile != null) { buffer.append(segmentsFile).append(":").append(segmentInfos.getVersion()); } if (writer != null) { buffer.append(":nrt"); } for (final LeafReader r : getSequentialSubReaders()) { buffer.append(' '); buffer.append(r); } buffer.append(')'); return buffer.toString(); }
0tdrvxhp2#
这是我写的打印索引版本的代码。
import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexFormatTooNewException; import org.apache.lucene.index.IndexFormatTooOldException; import org.apache.lucene.index.StandardDirectoryReader; import org.apache.lucene.store.SimpleFSDirectory; import org.junit.Test; public class TestReindex { public void testVersion() throws IOException{ Path path = Paths.get("<Path_to_index_files>"); try (DirectoryReader reader = StandardDirectoryReader.open(new SimpleFSDirectory(path))){ Pattern pattern = Pattern.compile("lucene.version=(.*?),"); Matcher matcher = pattern.matcher(reader.toString()); if (matcher.find()) { System.out.println("Current version: " + matcher.group(1)); } } catch(IndexFormatTooOldException ex) { System.out.println("Current version: " + ex.getVersion()); System.out.println("Min Version: " + ex.getMinVersion()); System.out.println("Max Version: " + ex.getMaxVersion()); } catch (IndexFormatTooNewException ex) { System.out.println("Current version: " + ex.getVersion()); System.out.println("Min Version: " + ex.getMinVersion()); System.out.println("Max Version: " + ex.getMaxVersion()); } } }
如果你试图读取一个相对于所使用的Lucene版本来说太新或太旧的索引,就会抛出一个异常。异常包含了关于版本的信息,可以相应地利用这些信息。
2条答案
按热度按时间xpcnnkqh1#
这 不 是 一 个 非常 干净 的 解决 方案 , 但 这 就 是 我 通过 SegmentInfos 所 能 找到 的 全部 。
LuceneVersion - - 〉 本次 提交 使用 了 哪个 Lucene 代码 版本 , 写 为 三 个 vInt :主要 、 次要 、 错误 修复
当 你 创建 你 的
IndexReader
时 , 它 是 一 个 具体 的 读取 器 类 , 比如 - StandardDirectoryReader , 这个 类 有 一 个toString()
方法 , 如下 所 示 , 它 打印 每个 段 的 lucene 版本 , 这样 你 就 可以 在IndexReader
示例 上 调用 -toString()
。@Override public String toString() { final StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('('); final String segmentsFile = segmentInfos.getSegmentsFileName(); if (segmentsFile != null) { buffer.append(segmentsFile).append(":").append(segmentInfos.getVersion()); } if (writer != null) { buffer.append(":nrt"); } for (final LeafReader r : getSequentialSubReaders()) { buffer.append(' '); buffer.append(r); } buffer.append(')'); return buffer.toString(); }
我 想 , 一 个 单一 版本 的 整个 索引 没有 意义 , 因为 一 个 索引 可能 有 文件 提交 从 以前 的 版本 作家 了 。
如果 版本 距离 不是 Lucene 定义 的 那么 远 , 则 可以 使用 最 新 版本 的 读取 器 搜索 用 较 旧 版本 的 Lucene 编写 器 提交 的 文档 。
您 可以 在 Core Java 中 编写 一 个 简单 的 逻辑 , 使用 regex 提取 最 高 的 lucene 版本 作为 lucene 索引 版本 。
0tdrvxhp2#
这是我写的打印索引版本的代码。
如果你试图读取一个相对于所使用的Lucene版本来说太新或太旧的索引,就会抛出一个异常。异常包含了关于版本的信息,可以相应地利用这些信息。