3

Lucene を使用する過程で、私は少しがっかりしています。既に直接インデックス付け可能なものを Lucene アナライザーにフィードする方法がわかりません。または、独自のアナライザーを作成するにはどうすればよいですか...

たとえば、List<MyCustomToken>すでに多くのトークンが含まれている がある場合 (実際には、各 MyCustomToken の機能としてインデックスを作成したい大文字と小文字などに関するより多くの情報があります)

私が読んだ内容をよく理解している場合は、Analyzer をサブクラス化する必要があります。これは、@ 位置public final boolean incrementToken()を挿入するジョブを実行するを提供するだけでよい TokenStream をサブクラス化する独自のトークナイザーを呼び出します。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 の知識はまだ非常に貧弱なので、Reader <=> List パターンについて明らかな何かを見落としている可能性がありますか?)

この質問は、lucene リストの私の質問とほぼ同じです

EDIT: @ Jilles van Gurp =>はい、あなたはまったく正しいです。それは私が考えている別の問題でしたが、最初はよりエレガントな解決策を見つけることを望んでいます。したがって、続行する場合でも、何らかのシリアル化を実行し、このシリアル化された文字列をドキュメントとして自分のアナライザーにフィードし、独自のトークナイザーが逆シリアル化して基本的なトークン化をやり直すことができます (実際には、既に行われたものを見ていくだけです)。 ...)ところで、それは私が避けたいいくつかの遅くて愚かな余分なステップを追加します...

この部分について => Lucene インデックスに必要なすべての基本データを提供する最近の (Lucene >3.6) カスタムトークナイザーのサンプルを誰かが持っていますか? 私はそのようなトークンの発行について読んだことがあります:

        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 は単語/トークン (文字のシーケンス) に非常に限定されているのに対し、テキストは単一の/孤立した単語/トークンの並置だけではありません...

4

2 に答える 2

1

のようなものを実装しようとする代わりに、クラスでa を使用して実装addDoc(w, MyOwnObject)できますか?MyOwnObject.toString()@Override String toString()MyOwnObject

于 2012-06-22T09:51:57.830 に答える
0

Luceneは、テキストのインデックスを作成するように設計されています。テキストは通常​​、一連の文字の形式で提供されます。つまり、Analyzerフレームワークは、テキストを分析してトークンに変換することです。

これで、どういうわけかトークンのリストができあがり、それをluceneにフィードしたいと思います。これは、luceneが最適化されているユースケースには完全には適合しません。最も簡単な方法は、リストを文字列(コンマ区切りなど)として表すだけで、区切り文字として選択したものを区切る単純なTokenStreamを実装することです。

さて、本当の問題は、どのようにしてリストにたどり着き、そこでもっと賢いことができるかどうかですが、それを理解するためのユースケースの洞察が不足しています。

于 2012-06-21T17:15:00.380 に答える