lucene - examples - solr near
Lucene QueryParser interpreta ''AND OR'' como un comando? (3)
No es solo OR
, es AND OR
Yo uso la siguiente solución:
query = queryparser.parse(queryparser.escape(querytext.replace("AND OR", "AND or")))
Estoy llamando a Lucene usando el siguiente código (PyLucene, para ser precisos):
analyzer = StandardAnalyzer(Version.LUCENE_30)
queryparser = QueryParser(Version.LUCENE_30, "text", analyzer)
query = queryparser.parse(queryparser.escape(querytext))
Pero considere si este es el contenido de querytext
:
querytext = "THE FOOD WAS HONESTLY NOT WORTH THE PRICE. MUCH TOO PRICY WOULD NOT GO BACK AND OR RECOMMEND IT"
En ese caso, el "Y O" dispara el analizador de consultas, aunque yo uso queryparser.escape
. ¿Cómo evito el siguiente mensaje de error?
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)
queryparser.parse solo escapa de los caracteres especiales (como se muestra en esta página ) y deja "Y O" sin cambios, por lo que no funcionaría en su caso. Dado que presumiblemente también utilizó StandardAnalyzer para analizar su texto, los términos en su índice ya están en minúscula. De modo que puede cambiar toda la cadena de consulta a minúsculas antes de pasarla al asesor de consultas. Las letras minúsculas "y" y "o" no se consideran operadores, por lo que "y / o" no desconectarían el analizador de consultas.
Me doy cuenta de que ya llegué tarde a la fiesta, pero poner comillas alrededor de la cadena de búsqueda es una mejor opción:
querytext = "/"THE FOOD WAS ... /""