有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

例如,如果我有一个List<MyCustomToken>,它已经包含了许多标记(实际上还有更多关于资本化等的信息,我还想在每个MyCustomToken上作为功能索引)

如果我很好地理解了我所读到的内容,我需要对一个分析器进行子类化,它将调用我自己的标记器对一个标记流进行子类化,我只需要提供一个public final boolean incrementToken()来完成插入TermAttribute@position的工作

顺便说一句,这是我困惑的地方=>;这个令牌流是java的一个子类。伊奥。读卡器,因此只能分析流对象,如文件、字符串

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

看起来整个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<;=>;列表模式的明显内容?)

这个问题和我的差不多on lucene list

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

关于这部分=>;有人有最近(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索引中跟踪的其他分析(人们可能会想到表达式识别或命名实体识别,还可以包括一些关于大写的特殊功能等)(真正让我感兴趣的部分是索引查询,而不是分析的第一步,这几乎是从Lucene图书馆开始的,只对我读到的内容进行标记)

(此外,我不认为我能从前面/早期的步骤中做得更聪明,因为我使用了许多不同的工具,不是所有工具都是Java,也不是所有工具都可以轻松包装成Java)

所以我觉得这有点悲哀,Lucene是aim@处理文本的,它与单词/标记(字符序列)如此紧密地联系在一起,而文本不仅仅是单个/孤立的单词/标记的并置


共 (1) 个答案

  1. # 1 楼答案

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

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

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