gpt4 book ai didi

java - Lucene,索引已经/外部标记化的标记并定义自己的分析过程

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:03 24 4
gpt4 key购买 nike

在使用Lucene的过程中,有点失望。我看不到或不明白我应该如何继续为任何 Lucene 分析器提供已经可以直接索引的东西。或者我应该如何继续创建我自己的分析器...

例如,如果我有一个 List<MyCustomToken> ,它已经包含许多标记(实际上还有更多关于大写等的信息,我也想将其作为每个 MyCustomToken 的特征进行索引)

如果我很好地理解我所读的内容,我需要子类化一个分析器,它将调用我自己的标记器子类化 TokenStream,我只需要提供一个 public final boolean incrementToken()这将完成插入 TermAttribute 的工作@位置。

顺便说一句,这是我感到困惑的地方 => 这个 TokenStream 是 java.io.Reader 的子类,因此只能分析流对象,如文件、字符串...

我怎样才能拥有自己的文档分析器来使用我的列表而不是这个流式处理的?

看起来整个 Lucene API 是建立在这样的想法之上的,即它首先开始分析@一个非常低的级别,即“字符”的观点,而我需要稍后开始使用它/从已经标记化的单词甚至插入表达式(词组)。

Lucene 用法的典型示例如下(取自 here):

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

// 1. create the index
Directory index = new RAMDirectory();

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);

IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action"); // BUT here i would like to have a addDoc(w, MyOwnObject)
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
w.close();

[...]

private static void addDoc(IndexWriter w, String value) throws IOException {
Document doc = new Document();
doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
// SO that i can add here my own analysis base on many fields, with them built from a walk through List or complex structures...
w.addDocument(doc);
}


ps :(我的 java/lucene 知识仍然很差,所以我可能错过了关于 Reader <=> List 模式的一些明显的东西?)

这题和我的差不多on lucene list

编辑: @ Jilles van Gurp => 是的,你说得很对,这是我想到的另一个问题,但首先希望找到一个更优雅的解决方案。所以,如果继续,我仍然可以进行某种序列化,将这个序列化的字符串作为文档提供给我自己的分析器,然后我自己的分词器将反序列化并重新进行一些基本的分词(实际上,只是遍历已经完成的...) 顺便说一句,它会添加一些我想避免的更慢和愚蠢的额外步骤...

关于这部分 => 有人有任何最近的(Lucene >3.6)自定义分词器的样本,它提供了 Lucene 索引所需的所有基础数​​据吗?我读过关于像那样发射 token 的信息:

        posIncrement.setPositionIncrement(increment); 
char[] asCharArray = myAlreadyTokenizedString.toCharArray(); // here is my workaround
termAttribute.copyBuffer(asCharArray, 0, asCharArray.length);
//termAttribute.setTermBuffer(kept);
position++;

为什么我在这里部分,是因为我使用了一些外部库,对我的文本进行标记化,做一些词性注释,以及其他分析(可能会想到表达式识别或命名实体识别,还可以包括一些关于大写等的特殊功能),我想在 Lucene 索引中跟踪(我感兴趣的实际部分是索引查询,而不是Analysis 的第一步几乎来自 Lucene 库,仅对我阅读的内容进行标记化)。

(另外,我不认为我可以从这些先前/早期的步骤中做一些更聪明的事情,因为我使用了许多不同的工具,并不是所有的工具都是 Java 的或者可以很容易地包装到 Java 中)

所以我认为这有点令人难过,旨在处理文本的 Lucene 如此受限于单词/标记(字符序列),而文本不仅仅是单个/孤立的单词/标记的并置。 .

最佳答案

与其尝试实现类似addDoc(w, MyOwnObject) 的方法,不如使用MyOwnObject.toString() 并实现@Override String toString( ) 在您的 MyOwnObject 类中?

关于java - Lucene,索引已经/外部标记化的标记并定义自己的分析过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11142221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com