在使用Lucene的过程中,我有点失望。我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西。或者我应该如何继续创建我自己的分析器......
例如,如果我有一个List<MyCustomToken>
,其中已经包含许多令牌(实际上还有更多有关大小写等的信息,我还想将其索引为每个 MyCustomToken 上的功能)
如果我很好地理解了我所读到的内容,我需要对分析器进行子类化,它将调用我自己的分词器对 TokenStream 进行子类化,其中我只需要提供public final boolean incrementToken()
这将完成插入的工作TermAttribute
@ 位置。
顺便说一句,这就是我感到困惑的地方 => 这个 TokenStream 是 java.io.Reader 的子类,因此只能分析流对象,例如文件、字符串......
我怎样才能继续拥有自己的文档分析器来消耗我的列表而不是这个流式的?
看起来整个 Lucene API 是建立在这样的想法之上的:它首先从一个非常低的级别开始分析“字符”的观点,而我需要稍后开始使用它/从已经标记化的单词甚至表达式(组)中插入的单词)。
Lucene 使用的典型示例如下(取自here http://www.lucenetutorial.com/lucene-in-5-minutes.html) :
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 列表中 http://lucene.472066.n3.nabble.com/Apply-custom-tokenization-tt3803765.html#none
EDIT: @ 吉尔斯·范格普=>是的,你说得很对,这是我想到的另一个问题,但首先希望找到一个更优雅的解决方案。因此,如果继续,我仍然可以进行某种序列化,将这个序列化字符串作为文档提供给我自己的分析器,以及自己的分词器,然后反序列化并重新进行一些基本分词(实际上,只需遍历已经完成的分词) ...)顺便说一句,它会添加一些我想避免的较慢且愚蠢的额外步骤...
关于这一部分 => 有人有最近(Lucene >3.6)自定义分词器的样本吗?它提供了 Lucene 索引所需的所有基础数据?我读过有关发出令牌的信息:
posIncrement.setPositionIncrement(increment);
char[] asCharArray = myAlreadyTokenizedString.toCharArray(); // here is my workaround
termAttribute.copyBuffer(asCharArray, 0, asCharArray.length);
//termAttribute.setTermBuffer(kept);
position++;
对于我为什么在这里部分,这是因为我使用了一些外部库,它们对我的文本进行标记,进行一些词性注释和其他分析(人们可能会想到表达识别或命名实体识别,也可以包括关于大写等的一些特殊功能,我想在 Lucene 索引中跟踪(我感兴趣的真正部分是Indexing and Querying,不是分析的第一步,它几乎来自 Lucene 库,仅对我所读到的内容进行标记)。
(另外,我不认为我可以从这些先前/早期的步骤中做一些更聪明的事情,因为我使用许多不同的工具,并非所有工具都是 Java 或可以轻松包装到 Java)
所以我认为这有点悲伤,Lucene 的目标@处理文本是如此受限于单词/标记(字符序列),而文本不仅仅是单个/孤立的单词/标记的并置......