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)
Était-ce utile?

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() );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top