2008-08-17 14 views
5

He estado tratando de encontrar una manera fácil de analizar una consulta de búsqueda y convertirla en una consulta SQL para mi base de datos.Análisis de consultas de búsqueda en Java

he encontrado dos soluciones:

  1. Lucene: Potente motor de búsqueda basado en Java, contiene un analizador de consultas, pero no es muy configurable y pude encontrar una manera de cortar con facilidad/adaptarla para crear consultas SQL.
  2. ANTLR: Un texto veterano léxico-analizador. Utilizado para construir cualquier cosa, desde compiladores hasta rascacielos. Antlr es altamente configurable pero todo el mundo tocar el código a partir de ahora tendrá que aprender un nuevo idioma ...

¿Alguna otra idea?

Respuesta

0

Depende mucho del tipo de consultas que tiene que analizar y algo de la estructura de los datos en su base de datos. Voy a suponer que no está tratando de hacer una búsqueda de texto completo en una base de datos (es decir, un motor de búsqueda en todo su banco de datos) porque, como la mayoría de la gente de recuperación de información le dirá, el rendimiento es terrible. Los índices invertidos son sin duda la mejor manera de hacerlo.

Cuéntenos un poco más sobre el problema real: qué van a ingresar los usuarios, qué esperan como salida y cómo es el modelo de datos. Diseñe una solución de búsqueda sin esos elementos de información, y obtendrá un resultado lejos de óptimo.

1

¿Qué tienes en mente exactamente? He usado Lucene para buscar texto, pero donde se destaca es compilar un índice y buscar en su lugar para golpear la base de datos.

Recientemente establecí un sistema en el que indexo una tabla en Lucene al concatenar todas las columnas (separadas por espacios) en un campo, y mostrarlas en Lucene, y luego también agregar la clave principal en una columna separada. Lucene hace toda la búsqueda y devuelve una lista de claves principales, que utilicé para desplegar un conjunto poblado de resultados y mostrar al usuario.

La conversión de una consulta de búsqueda en una declaración de SQL me parece un poco desordenada.

Además, aquí está a great beginning tutorial explaining the basic structure of Lucene.

0

Tiene razón al suponer que no estoy buscando la búsqueda de texto completo. La información es como la siguiente esquema para información sobre el libro: Nombre: cadena, editor: secuencia, int NUM_PAGES, publish_date: Fecha ...

búsqueda Las consultas son de la especie:

  1. Harry Potter (buscar cualquier libro nombre quien tiene tanto Harry y Potter)
  2. editor: Naturaleza * páginas> 100 (libros de una editorial a partir de la naturaleza con más de 100 libros)
  3. ("Año Nuevo" o Navidad) y presente (se obtiene la imagen ...)
  4. la física y publicar> 1/1/2008 (nuevos libros de física)
1

Usted podría tratar de usar algo como javacc (compilador compilador de Java) para implementar un programa de análisis o de lo contrario simplemente analizar manualmente la cadena de fuerza bruta. Cada vez que te encuentras con una expresión, la representas como un objeto. Entonces solo tienes que traducir tu árbol de expresiones a una cláusula where.

Por ejemplo: "Harry Potter" se convierte en

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

Y "editor: Naturaleza * Páginas> 100" se convierte en

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

Entonces, una vez que tenga estos, es bastante fácil de convertirlos en SQL:

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

Te puedes imaginar el resto. Puedes anidar Y expresiones tan profundamente como quieras.

3

SQL-ORM es una biblioteca muy ligero de Java que incluye la capacidad de construir un (dinámico) consulta SQL en Java como un gráfico de objetos

en mi humilde opinión, esto es una mejor técnica para construir consultas SQL dinámico que el de costumbre Método de concatenación de cadenas

de responsabilidad: He hecho algunos muy menor contribución a este proyecto

+0

Muy interesante. Parece que IBatis sin el mapeo y las cosas XML –

0

tratar de combinar una herramienta ORM (como OpenJPA) y Compass (marco para OSEM). Indexa automáticamente las actualizaciones realizadas a través de las herramientas ORM y le proporciona la potencia de búsqueda de Lucene. Después de eso, puede, por supuesto, recuperar el objeto de la base de datos. Supera a cualquier solución de búsqueda basada en SQL.

-2

String [] array;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

Esto realmente no responde la pregunta. –