4

luceneのQueryParserと同様の機能を作成しようとしていますが、パーサーを使用せずに、つまりStandardAnalyzerで文字列を実行し、これをトークン化し、BooleanQueryでTermQuery:sを使用してクエリを作成しています。私の問題は、Term:sではなくStandardAnalyzerからToken:sのみを取得することです。Token.term()を使用して文字列を抽出するだけで、トークンを用語に変換できますが、これは2.4.xのみであり、フィールドをもう一度追加する必要があるため、逆に見えます。StandardAnalyzerを使用してTermQueryを生成する適切な方法は何ですか?

私はピルセンを使用していますが、答えはJavaなどでも同じだと思います。私が思いついたコードは次のとおりです。

from lucene import *
def term_match(self, phrase):
    query = BooleanQuery()
    sa = StandardAnalyzer()               
    for token in sa.tokenStream("contents", StringReader(phrase)):
        term_query = TermQuery(Term("contents", token.term())
        query.add(term_query), BooleanClause.Occur.SHOULD)
4

2 に答える 2

2

トークンテキストを取得するための確立された方法はtoken.termText()、APIが永遠に存在していることです。

Analyzerはい、との両方にフィー​​ルド名を指定する必要がありますTerm。それは正常だと思います。8-)

于 2009-09-07T18:28:22.853 に答える
0

同じ問題が発生しました。Lucene2.9APIとJavaを使用すると、コードスニペットは次のようになります。

final TokenStream tokenStream = new StandardAnalyzer(Version.LUCENE_29)
    .tokenStream( fieldName , new StringReader( value ) );
final List< String > result = new ArrayList< String >();
try {
while ( tokenStream.incrementToken() ) {
  final TermAttribute term = ( TermAttribute ) tokenStream.getAttribute( TermAttribute.class );
  result.add( term.term() );
}
于 2010-11-24T15:26:27.433 に答える