3

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

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

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

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

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

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

Lucene 使用的典型示例如下(取自此处):

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 模式的明显内容?)

这个问题和我在 lucene list 上的问题几乎一样

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

关于这部分 => 是否有人有任何最近(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 索引中跟踪(我感兴趣的真正部分是索引查询,而不是分析的第一步,它几乎来自 Lucene 库,仅用于我的标记化已阅读)。

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

所以我认为这有点令人难过,目标@处理文本的 Lucene 与单词/标记(字符序列)如此绑定,而文本不仅仅是单个/孤立的单词/标记的并置......

4

2 回答 2

1

你可以在你的类中addDoc(w, MyOwnObject)使用MyOwnObject.toString()和实现 a ,而不是尝试实现类似的东西吗?@Override String toString()MyOwnObject

于 2012-06-22T09:51:57.830 回答
0

Lucene 旨在索引文本,文本通常以字符序列的形式出现。因此,分析器框架就是分析文本并将其转换为标记。

现在你不知何故得到了一个令牌列表,现在想把它输入到 lucene 中。这不太适合 lucene 优化的用例。最简单的方法是将列表简单地表示为一个字符串(例如逗号分隔),然后实现一个简单的 TokenStream 来分隔您选择的任何分隔符。

现在真正的问题是您如何最终获得列表以及您是否可以在那里做一些更聪明的事情,但我缺乏对您的用例的洞察力来理解这一点。

于 2012-06-21T17:15:00.380 回答