Lucene的,索引已经/外部标记化的标记,并限定自己的分析处理(Lucene, indexing

2019-09-18 08:49发布

在使用Lucene的过程中,我有点disapointed。 我没有看到或理解我应该如何着手的东西,已经是直接可转位喂任何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的知识仍然很差,所以我可能错过一些明显的关于读者<=>列表模式?)

这个问题几乎是和我一样的Lucene名单

编辑:@ Jilles面包车Gurp =>是的,你说的很对,这是另一个问题。我想的,但首先希望找到一个更好的解决方案。 所以,如果继续,我还是可以做一些系列化,满足这种序列化的字符串作为文档我自己的分析,和自己的标记生成器,然后将反序列化和重新做一些基本的标志化(实际上,刚刚经历已经做了一个走...)BTW它会增加,我将不得不像避免一些慢又笨额外的步骤...

关于这部分=>是否有人有最近(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的libary只Tokenising什么,我已阅读)。

(另外,我不认为我可以从这些以前/早期步骤做一些更聪明,因为我用许多不同的工具,不是所有的人都是Java或可以很容易地缠到Java)

所以我觉得这是有点难过,那Lucene的是瞄准@文字工作是如此界字/标记(字符序列),而文字是不是只单/孤立的单词/令牌并列更多...

Answer 1:

而不是试着实现类似addDoc(w, MyOwnObject)你可以使用MyOwnObject.toString()和实施@Override String toString()在你的MyOwnObject类?



Answer 2:

Lucene的被设计成索引文本,其通常进来字符的序列的形式。 因此,分析框架是所有有关分析文本,并将其转化为标记。

现在,你不知何故带着令牌的列表,现在想将它送入Lucene的。 这并不太符合这个用例Lucene是优化。 最简单的方法就是代表名单作为字符串(如逗号分隔),然后执行一个简单的TokenStream上无论你选择的分离器分离。

现在真正的问题是,你如何结束了与列表,您是否可以做一些更聪明,但我缺少您的使用情况的洞察力,使这个意义上说。



文章来源: Lucene, indexing already/externally tokenized tokens and defining own analyzing process