Comment puis-je utiliser StandardAnalyzer avec TermQuery?
Question
Je suis en train de produire quelque chose de semblable à ce que QueryParser dans Lucene fait, mais sans l'analyseur, à savoir exécuter une chaîne par StandardAnalyzer, tokenizer cela et utiliser TermQuery: s dans un BooleanQuery pour produire une requête. Mon problème est que je ne reçois que Token: s de StandardAnalyzer, et non Terme: s. Je peux convertir un jeton à un terme en tout extraire la chaîne avec de Token.term (), mais c'est 2.4.x seulement et il semble en arrière, parce que je dois ajouter le champ une seconde fois. Quelle est la bonne façon de produire un TermQuery avec StandardAnalyzer?
J'utilise pylucene, mais je suppose que la réponse est la même pour Java, etc. Voici le code que je suis venu avec:
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)
La solution
La façon établie pour obtenir le texte jeton est avec token.termText()
- que l'API a été là pour toujours
Et oui, vous devez spécifier un nom de champ à la fois la Analyzer
et la Term
; Je pense que est considéré comme normal. 8 -)
Autres conseils
Je suis tombé sur le même problème, et, en utilisant l'API Lucene 2.9 et Java, mon extrait de code ressemble à ceci:
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() );
}