如何在TermQuery中使用StandardAnalyzer?

4 投票
2 回答
2536 浏览
提问于 2025-04-15 14:08

我想做的事情类似于lucene中的QueryParser,但不使用解析器,也就是说,我想把一个字符串通过StandardAnalyzer处理,分词后再用TermQuery和BooleanQuery来生成查询。我的问题是,我只从StandardAnalyzer得到了Token,而没有得到Term。我可以通过Token.term()方法把Token转换成一个term,但这个方法只在2.4.x版本中可用,而且感觉有点不合理,因为我还需要再添加一次字段。那么,使用StandardAnalyzer生成TermQuery的正确方法是什么呢?

我在使用pylucene,不过我想答案对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)

2 个回答

0

我也遇到过同样的问题,使用的是Lucene 2.9的API和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() );
}
2

获取令牌文本的常用方法是使用 token.termText() 这个函数——这个接口已经存在很久了。

没错,你需要给 AnalyzerTerm 指定一个字段名称;我觉得这算是正常的做法。 8-)

撰写回答