1

私は 200,000 冊以上の書籍のインデックス作成に whoosh を使用しています。しかし、私はそれでいくつかの問題に遭遇しました。whoosh クエリ パーサーは、"C#"、"C++" などのメタ文字を含む単語、およびその他の短い単語に対して NullQuery を返します。この単語は一部のドキュメントのタイトルと本文で使用されているため、キーワード タイプは使用していません。問題は、検索またはインデックス作成の分析またはクエリ解析フェーズにあると思いますが、やみくもにデータに触れることはできません。誰でもこの問題を修正するのを手伝ってもらえますか? Tnx。

私の要件を満たす正規表現パターンを使用して StandardAnalyzer を作成することで問題を修正しました。正規表現パターンは次のとおりです。

'\w+[#+.\w]*'

これにより、フィールドのトークン化が正常に行われ、検索もうまくいきます。しかし、「some query++*」や「some##*」などのクエリを使用すると、解析されたクエリは単一の Every クエリになり、「*」だけになります。また、これは私のアナライザーとは関係がなく、これが Whoosh のデフォルトの動作であることもわかりました。ここに私の新しい質問があります: この動作は正しいですか、それともバグですか??

注: クエリ パーサーから WildcardPlugin を削除すると、この問題は解決しますが、WildcardPlugin も必要です。


今、私は次のコードを使用しています:

from whoosh.util import rcompile
#for matching words like: '.NET', 'C++' and 'C#'
word_pattern = rcompile('(\.|[\w]+)(\.?\w+|#|\+\+)*')
#i don't need words shorter that two characters so i don't change the minsize default
analyzer = analysis.StandardAnalyzer(expression=word_pattern)

...今私のスキーマで:

...
title = fields.TEXT(analyzer=analyzer),
...

はい、これで最初の問題は解決します。しかし、主な問題は検索にあります。Everyユーザーにクエリまたはを使用して検索させたくありません*。しかし、クエリを解析するC++*と、クエリが終了しEvery(*)ます。何か問題があることは知っていますが、それが何であるかわかりません。

4

1 に答える 1

2

私は同じ問題を抱えていて、それがデフォルトでStandardAnalyzer()使用されていることがわかりました。minsize=2したがって、スキーマでは、そうでないことを伝える必要があります。

schema = whoosh.fields.Schema(
  name = whoosh.fields.TEXT(stored=True, analyzer=whoosh.analysis.StandardAnalyzer(minsize=1)),
  # ...
)
于 2013-04-17T18:21:48.930 に答える