私は lucene 3.5 をSpanishAnalyzerで使用しています (それ自体は SpanishStemmerとStandardTokenizerを使用しています)。
SpanishAnalyzer が "claramente" と "claro" などの単語を含むドキュメントをインデックス化すると、両方とも "clar" としてインデックス化されます。
この動作は理解されており、私のニーズに役立ちます。今日、クエリを実行する前に、Analyzer のtokenStream
+incrementToken()
を使用して検索語のトークンを取得し、それをインデックス付きドキュメントに対して検索します。私は QueryParser を使用していませんが、コードで lucene クエリ オブジェクトを作成しています。
ただし、SpanishAnalyzer の形態学的機能を失うことなく、正確な単語 (この例では claro) を検索する機能が必要です。
上記の手順 (tokenStream) をスキップして「claro」を直接検索できますが、「clar」としてインデックス付けされているため見つかりません。また、1 つの正確な単語と 1 つの通常の用語 (形態学的) を含むorを
使用する機能が必要なため、2 つの異なるアナライザーでフィールドを 2 回インデックス付けしたくありません。
それで…そして私は要点に達しています…トークナイザーまたはステマーまたはフィルター(?)を変更することを考えたので、インデックス作成時に、語幹が付けられたトークンと元のトークンの2つのトークンがインデックス付けされます。この場合は「claro " および "clar" 以降、クエリを実行するときに、正確な単語を使用するか、語幹の付いたトークンを使用するかを選択できます。
どのように (そしてどこで) それを行うことができるかを理解する助けが必要です。編集は Stemmer のどこかで行う必要があると思います。 PhraseQuery
SpanNearQuery
ちなみに、使用時にテキスト内の単語ごとにいくつかのトークンを返すヘブライ語アナライザーでまったく同じことを行いますincrementToken()
(ただし、ソースコードはありません)