Question

Je demande Lucene en utilisant le code suivant (PyLucene, pour être précis):

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, les « ET OU » voyages jusqu'à la QueryParser, même si je suis utilisation queryparser.escape. Comment puis-je é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)
Était-ce utile?

La solution

Il est non seulement OR, il est AND OR.

J'utilise la solution suivante:

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

Autres conseils

queryparser.parse n'échappe des caractères spéciaux (comme le montre cette page ) et les feuilles « eT OU » inchangé, il ne travaillerait dans votre cas. Depuis probablement vous avez également utilisé StandardAnalyzer pour analyser votre texte, les termes de votre index sont déjà en minuscules. Vous pouvez donc changer toute la chaîne de requête en minuscules avant de le donner à la QueryParser. Minuscules « et » et « ou » ne sont pas considérés comme des opérateurs si « et ou » ne serait pas déclencher le QueryParser.

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

querytext = "\"THE FOOD WAS ... \""
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top