如何在TermQuery中使用StandardAnalyzer?
我想做的事情类似于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()
这个函数——这个接口已经存在很久了。
没错,你需要给 Analyzer
和 Term
指定一个字段名称;我觉得这算是正常的做法。 8-)