【问题标题】:Lucene, indexing already/externally tokenized tokens and defining own analyzing processLucene,索引已经/外部标记化的标记并定义自己的分析过程
【发布时间】:2012-06-23 22:15:35
【问题描述】:

在使用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 索引中跟踪(我感兴趣的真正部分是 IndexingQuerying,而不是分析的第一步几乎来自 Lucene 库,仅针对我所阅读的内容进行标记化)。

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

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

【问题讨论】:

    标签: java lucene indexing tokenize


    【解决方案1】:

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

    【讨论】:

    • 好吧,我认为它不适合,因为我将 仍然 必须编写 MyOnwTokenizer 以便然后拆分 MyOwnObject.toString() 并喂食Lucene 与从那里爆炸的 MyTokens。这确实是向 Lucene 提供我已经/外部标记和注释的标记/数据的事实。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2011-11-11
      • 2015-09-21
      • 2020-12-26
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多