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

时间:2012-06-21 16:05:50

标签: java lucene indexing tokenize

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

例如,如果我有一个List<MyCustomToken>,它已经包含许多令牌(实际上还有很多关于大小写的信息等,我也希望将其作为每个MyCustomToken上的特征索引)

如果我完全理解我读过的内容,我需要继承一个Analyzer,它将调用我自己的tokenizer子类化TokenStream,在那里我只需要提供一个public final boolean incrementToken()来完成插入{ {1}} @ position。

BTW这里是我困惑的地方=&gt;这个TokenStream是java.io.Reader的子类,因此只能分析像文件,字符串这样的流对象......

如何继续使用我自己的文档分析器来消耗我的List而不是这个流式的?

看起来整个Lucene API的构想基于它首先开始分析@一个非常低级别的“角色”观点,而我需要稍后开始使用它/插入已经标记化的单词甚至表达式(单词组)。

Lucene使用的典型样本是这样的(取自here):

TermAttribute


ps :(我的java / lucene知识仍然很差,所以我可能会错过一些关于Reader&lt; =&gt; List模式的明显内容吗?)

这个问题与我的on lucene list

几乎相同

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

关于这部分=&gt;有人有最新的(Lucene&gt; 3.6)自定义标记器的样本,提供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);
}

为什么我在这里的一部分,这是因为我使用了一些外部库,标记了我的文本,做了一些词性注释,以及其他分析(人们可能会想到表达识别或命名实体识别,还可以包括一些关于大写等的特殊功能,我想跟踪一个Lucene指数(我感兴趣的真实部分是索引查询,而不是分析的第一步几乎来自Lucene图书馆,只有我所读过的Tokenising)。

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

所以我觉得这有点难过,Lucene瞄准@使用文本是如此受限于单词/令牌(字符序列),而文本不仅仅是单个/隔离单词/标记的并置。

2 个答案:

答案 0 :(得分:1)

您可以使用addDoc(w, MyOwnObject)并在MyOwnObject.toString()课程中实施@Override String toString(),而不是尝试实施MyOwnObject之类的内容吗?

答案 1 :(得分:0)

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

现在你以某种方式结束了一个令牌列表,现在想把它送进lucene。这不太适合lucene优化的用例。最简单的方法是简单地将列表表示为字符串(例如逗号分隔),然后实现一个简单的TokenStream,它将您选择的任何内容分隔开来。

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