繁体   English   中英

如何生成 _id 像 elasticsearch 但对于 apache lucene?

[英]How to generate _id like elasticsearch but for apache lucene?

我想在 apache Lucene 中以相同的方式生成 Elasticsearch 文档的 _id,使 _id 像 Elasticsearch 但在 Apache Lucene 中。我该怎么做? 在哪里可以找到生成 Elasticsearch _id 的算法?

Apache Lucene 没有直接等效于 Elasticsearch 中的“_id”字段,但您可以通过使用唯一标识符作为 Lucene 文档中的字段来模拟此行为。

生成唯一标识符的一种方法是使用 UUID。 您可以使用像 Java 的 java.util.UUID 这样的库为每个文档生成一个唯一标识符,并将其作为一个字段存储在 Lucene 文档中。

另一种方法是使用文档的 hash 值作为标识符。 您可以使用 SHA-256 等散列算法对文档的内容进行 hash,并将生成的 hash 值存储为标识符字段。

重要的是要注意 Elasticsearch _id 不仅是唯一的,而且是确定性的。 如果要生成一个在 Apache Lucene 中确定性的_id,则需要使用特定的确定性算法来生成标识符。

这是 Java 中的一个示例,用于使用java.util.UUID为每个文档生成唯一标识符:

import java.util.UUID;
import org.apache.lucene.document.Document;

public class DocumentIDGenerator {
    public static String generateID(Document document) {
        return UUID.randomUUID().toString();
    }
}

在此示例中,generateID 方法将 Lucene 文档 object 作为输入,并以字符串形式返回新生成的 UUID。 要使用此方法,只需在将每个文档添加到索引之前调用它,并将返回的标识符存储为文档中的一个字段。

需要注意的是,UUID 不是确定性的,所以如果需要生成确定性标识符,这种方法不适用。 在这种情况下,您可能需要考虑使用 hash 值,如下一个示例所述。

以下是 Java 中的示例,用于使用 SHA-256 hash 值为每个文档生成确定性标识符:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.lucene.document.Document;

public class DocumentIDGenerator {
    public static String generateID(Document document) {
        StringBuilder sb = new StringBuilder();
        for (IndexableField field : document.getFields()) {
            sb.append(field.stringValue());
        }
        String contents = sb.toString();
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(contents.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02X", b));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

在此示例中,generateID 方法将 Lucene 文档 object 作为输入,并返回文档内容的 SHA-256 hash 的十六进制字符串表示形式。 要使用此方法,只需在将每个文档添加到索引之前调用它,并将返回的标识符存储为文档中的一个字段。

请务必注意,这只是一个示例,还有许多其他方法可以生成确定性标识符。 您应该选择最适合您的用例和要求的方法。

希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM