0

作業中のlucene.net実装(2.3.2)を編集して、ステミングと自動ワイルドカード(単語の末尾に*を追加)を含めています。

ワイルドカードを使用した正確な単語は機能しないことがわかりました。(したがって、stack *はstackoverflowに対して機能しますが、stackoverflow *はヒットしません)、これの原因と修正方法について疑問に思っていました。

前もって感謝します。(また、自動ワイルドカードとステミングの両方を実装している理由を尋ねないでくれてありがとう。)

クエリを常にプレフィックスクエリにするので、クエリに「*」を追加する必要はありません。その場合、何かが明らかになるかどうかを確認します。

編集:語幹化された単語のみがワイルドカードで機能しません。例Silicate*は機能しませんが、silic*は機能します。

4

1 に答える 1

1

機能しない理由は、コンテンツをステム処理して用語を変更するためです。

たとえば、「バルブ」という言葉を考えてみましょう。Snowball アナライザーはそれを「valv」に絞り込みます。

したがって、検索時に、入力クエリを語幹化するため、"valve" と "valves" の両方が "valv" に語幹変換されます。ステム化された「valv」TermQueryを使用すると、「valve」と「valves」の両方のオカレンスで一致が得られます。Term

しかし、インデックスにTerm「valv」を保存したため、「valve*」のクエリは何にも一致しません。これは、がワイルドカード クエリをQueryParser実行しないためです。Analyzer

これらのケースのいくつかを処理できるAnalyzingQueryParserがありますが、Lucene の 2.3.x バージョンにはなかったと思います。とにかく、それは普遍的な適合ではありません、ドキュメントには次のように書かれています:

警告: このクラスは、ストップワードを使用しない、またはトークンを追加するアナライザーでのみ使用する必要があります。また、いくつかのステミング アナライザーは不適切です。たとえば、GermanAnalyzer はハウザーをハウザーに変換しますが、このパーサーを使用すると H?user は h?user になるため、一致するものは見つかりません (つまり、このパーサーを使用しても、そのような場合)。

リンクした複製で言及されている解決策はすべてのケースで機能しますが、より大きなインデックスが得られます。

于 2012-08-07T15:50:51.353 に答える