2017-06-08 3 views
-1

私は新しい方法で文書を索引付けするための研究を行っています。具体的には、 既存の索引構造を変更して、索引付け技術を試してみたいと思います。例えば、Luceneが索引付け時に用語とDoc IDを保存する索引を逆転させている場合、その構造について、その用語に関する位置や統計などの他の情報を保存するように拡張したいと考えています。どのように私はそのような拡張を作るつもりですか?そのような拡張を行っているLuceneよりも優れたオープンソースプロジェクトがありますか?ありがとう。索引付け(転記)の変更Luceneの構造

答えて

0

のLuceneがインデックス化時に用語とドク同上のを保存し、インデックスを反転した場合、私はそのような用語の位置や統計などの他の情報を保存するためにその構造を拡張したいと思います...

Luceneの各投稿エントリは非常に一般的です。 Luceneはすでに、各投稿エントリに関連付けられたペイロードオブジェクトのオブジェクトの助けを借りて、ジェネリック型(オブジェクト)をバイトストリームの形で保存するための規定を持っています。

ペイロードの非常に一般的な使用は、用語の位置を格納することです。たとえば、用語tの場合は、位置1および3の文書D1、および位置2および5のD2に出現する場合、転記に異なるエントリとしてtの以下のように保存することができます。

*t* => (D1,1) (D1,3) (D2, 2) (D2, 5) 

これを実行する最も簡単な方法は、LuceneのクラスDelimitedPayloadTokenFilterを使用してだろう。テキストを分析しながら、各用語の横にある用語の位置を特定の文字で区切って書き出すだけです。 '|'、次の例に示すように。

class PayloadAnalyzer extends Analyzer { 
private PayloadEncoder encoder; 

PayloadAnalyzer(PayloadEncoder encoder) { 
    this.encoder = encoder; 
} 

public TokenStream tokenStream(String fieldName, Reader reader) { 
    TokenStream result = new WhitespaceTokenizer(reader); 
    result = new LowerCaseFilter(result); 
    result = new DelimitedPayloadTokenFilter(result, '|', encoder); 
    return result; 
} 
} 

ペイロードに格納された値をデコードするには、次のようなものを使用します。

class PayloadSimilarity extends DefaultSimilarity { 
    @Override 
    public float scorePayload(String fieldName, byte[] bytes, int offset, int length) { 
     return PayloadHelper.decodeFloat(bytes, offset); 
    } 
} 

その後、文書のランキングの間、これらの用語オフセットを利用するためにPayloadTermQueryクラスを使用することができます。

あなたは、他の用語に固有の情報を格納することをお勧めします - i)品詞(POS)タグ、ii)用語の単語ベクトルなど - ペイロード内に配置し、ランキング中にこれらの機能をすべて組み合わせて使用​​します。

0

Luceneは良いターゲットです。はい(正直言って良いオプションがあるかどうかはわかりません)。

あなたはカスタムコーデックを作成することになりますね。モダンなLuceneの現在のコーデックの背後にあるメインマンのthis blog postを参照してください。彼はコーデックを理解して遊ぶのに便利なSimpleTextCodecを紹介しています。もちろん、プロダクション用ではありません。例えば

関連する問題