2010-08-10 24 views
4

J'appelle Lucene en utilisant le code suivant (PyLucene, pour être précis):Lucene QueryParser interprète 'AND AND OR' comme une commande?

analyzer = StandardAnalyzer(Version.LUCENE_30) 
queryparser = QueryParser(Version.LUCENE_30, "text", analyzer) 
query = queryparser.parse(queryparser.escape(querytext)) 

Mais considérez si tel est le contenu de querytext:

querytext = "THE FOOD WAS HONESTLY NOT WORTH THE PRICE. MUCH TOO PRICY WOULD NOT GO BACK AND OR RECOMMEND IT" 

Dans ce cas, le « ET OU "se déplace le queryparser, même si je suis utiliser queryparser.escape. Comment éviter le message d'erreur suivant?

Java stacktrace: 
org.apache.lucene.queryParser.ParseException: Cannot parse 'THE FOOD WAS HONESTLY NOT WORTH THE PRICE. MUCH TOO PRICY WOULD NOT GO BACK AND OR RECOMMEND IT': Encountered " <OR> "OR "" at line 1, column 80. 
Was expecting one of: 
    <NOT> ... 
    "+" ... 
    "-" ... 
    "(" ... 
    "*" ... 
    <QUOTED> ... 
    <TERM> ... 
    <PREFIXTERM> ... 
    <WILDTERM> ... 
    "[" ... 
    "{" ... 
    <NUMBER> ... 
    <TERM> ... 
    "*" ... 

at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:187) 
    .... 
at org.apache.lucene.queryParser.QueryParser.generateParseException(QueryParser.java:1759) 
at org.apache.lucene.queryParser.QueryParser.jj_consume_token(QueryParser.java:1641) 
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1268) 
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1207) 
at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167) 
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182) 

Répondre

1

Il ne suffit pas OR, il est AND OR.

J'utilise la solution suivante:

query = queryparser.parse(queryparser.escape(querytext.replace("AND OR", "AND or"))) 
1

queryparser.parse échappe uniquement des caractères spéciaux (comme le montre this page) et les feuilles « ET OU » inchangé, il ne fonctionnerait pas dans votre cas. Puisque vous avez probablement utilisé StandardAnalyzer pour analyser votre texte, les termes de votre index sont déjà en minuscules. Vous pouvez donc modifier toute la chaîne de requête en minuscules avant de la donner au queryparser. Les minuscules "et" et "ou" ne sont pas considérées comme des opérateurs, de sorte que "et ou" ne déclencherait pas le vérificateur.

0

Je me rends compte que je suis un peu tard pour le parti, mais mettre des citations autour de la chaîne de recherche est une meilleure option:

querytext = "\"THE FOOD WAS ... \""