tutorial query example java lucene

java - query - lucene tutorial



Búsqueda de palabra clave(OR, AND) en Lucene (6)

Estoy usando Lucene en mi portal (basado en J2EE) para los servicios de indexación y búsqueda.

El problema es sobre las palabras clave de Lucene. Cuando uses uno de ellos en la consulta de búsqueda, obtendrás un error.

Por ejemplo:

searchTerms = "ik OR jij"

Esto funciona bien, porque buscará "ik" o "jij"

searchTerms = "ik AND jij"

Esto funciona bien, busca "ik" y "jij"

Pero cuando buscas:

searchTerms = "OR" searchTerms = "AND" searchTerms = "ik OR" searchTerms = "OR ik"

Etc., fallará con un error:

Component Name: STSE_RESULTS Class: org.apache.lucene.queryParser.ParseException Message: Cannot parse ''OR jij'': Encountered "OR" at line 1, column 0. Was expecting one of: ...

Tiene sentido, porque estas palabras clave son palabras clave para Lucene, probablemente están reservadas y actuarán como palabras clave.

En holandés, la palabra "O" es importante porque tiene un significado para "Ondernemings Raad". Se utiliza en muchos textos y debe encontrarse. Por ejemplo, "o" funciona, pero no devuelve textos que coincidan con el término "O". ¿Cómo puedo hacer que se pueda buscar?

¿Cómo puedo escapar de la palabra clave "o"? O ¿Cómo puedo decirle a Lucene que trate "o" como un término de búsqueda NO como una palabra clave?


¡He leído tu pregunta muchas veces! = [

por favor mira estas sugerencias

¿Cómo se almacena su índice?

El documento que contiene los campos almacenados se puede almacenar como

1) Almacenado 2) Tokenizado 3) Indexado 4) Vector

puede hacer una difference significativa

por favor use getopt.org/luke , puede decirle cómo se almacenan sus índices (en realidad)

Es imprescindible tener a Luke si está trabajando con Lucene, ya que le da una idea real de cómo se almacenan los índices, también ofrece búsqueda. ¡Pruébelo y háganoslo saber con su actualización!


Escapar de OR y AND con dobles comillas me funciona. Así que intente con una cadena de Java como

String query = "field:/"AND/"";


Probablemente estás haciendo algo mal cuando estás construyendo la consulta. Respaldaré la sugerencia de Narayan sobre obtener a Luke (como se publicó en los comentarios) e intentaré realizar sus consultas con eso. Ha pasado un tiempo desde que utilicé a Lucene, pero no recuerdo haber tenido problemas con OR y AND.

Aparte de eso, puede intentar escapar de las cadenas de entrada utilizando QueryParser.escape (userQuery)

Más sobre el escape


Puede escapar del "OR" cuando se trata de un término de búsqueda, o escribir su propio analizador de consultas para una sintaxis diferente. Lucene ofrece una amplia API de consulta además del analizador, con el que admite su propia sintaxis de consulta con bastante facilidad.


Supongo que has intentado poner el "O" entre comillas dobles?

Si eso no funciona, creo que deberías ir tan lejos como para cambiar la fuente de Lucene y luego volver a compilar todo, ya que el operador "OR" está enterrado profundamente dentro del código. En realidad, compilar probablemente no sea suficiente: tendrá que cambiar el archivo QueryParser.jj en el paquete fuente que sirve como entrada para JavaCC, luego ejecute JavaCC y luego vuelva a compilar todo.

La buena noticia, sin embargo, es que solo hay una línea para cambiar:

| <OR: ("OR" | "||") >

se convierte en

| <OR: ("||") >

De esa manera, solo tendrás "||" como operador OR lógico. Existe un build.xml que también contiene la invocación de JavaCC, pero usted debe descargar esa herramienta usted mismo. No puedo probarlo ahora mismo, me temo.

Esta es quizás una buena pregunta para la lista de correo de desarrolladores de Lucene, pero háganos saber si lo hace y encontrarán una solución más simple ;-)


O , NO y AND son palabras clave reservadas. Resolví este problema hace solo 2 días escribiendo en mayúsculas esas 3 palabras en el término de búsqueda del usuario antes de incluirlo en el analizador de consultas de Lucene. Tenga en cuenta que si busca y reemplaza estas palabras clave, asegúrese de usar los límites de las palabras (/ b) para no terminar cambiando palabras como ANDROID y ORDER.

Luego dejo que el usuario especifique NOT y AND utilizando - y +, tal como lo hace Google.