Tutorial de Elasticsearch (5): Cómo consultar Elasticsearch a través de SQL
Prefacio
Esta publicación de blog fue originalmente pensada para ser discutida aproximadamente en el quinto o sexto artículo de la serie. Después de todo, las consultas se realizan durante la creación del índice, la generación de datos del documento de índice y. Sólo es necesario después de que se hayan introducido algunos conceptos básicos. Es mejor explicar la consulta después de explicar todos los conceptos de conocimiento previo. Sin embargo, la empresa ha estado ocupada con proyectos recientemente y, a menudo, trabaja horas extras. Después de todo, es fin de año. Pero si no lo escribo, me temo que tomará cada vez más tiempo y eventualmente no pasará nada. Así que estaba nevando en Shanghai el fin de semana y hacía demasiado frío para salir, así que me senté. frente a la computadora y escribí esta publicación de blog. Como soy responsable de la consulta de la empresa, he investigado más y es más fácil de escribir. Luego ingrese el texto.
Por qué utilizar consultas SQL
Como se mencionó en el artículo anterior, el lenguaje de consulta oficial de Elasticsearch es Query DSL. Dado que está designado oficialmente, significa que es más consistente con el. potentes funciones de ES y está diseñado para ser compatible con ES. Entonces, ¿por qué seguimos utilizando consultas SQL? ¿Es esto innecesario?
De hecho, después de todo, existe una razón para la existencia, y la existencia es razonable. Como lenguaje de consulta de bases de datos, SQL tiene una sintaxis simple y es fácil de escribir. La mayoría de los programadores de servidores comprenden claramente y están familiarizados con su método de escritura. Pero como recién llegado a ES, incluso si ya es un veterano en el mundo de la programación, si no está familiarizado con ES, si quiere utilizar el servicio ES que la empresa ha configurado, primero debe aprender Query DSL. El costo también es un factor que afecta el progreso del desarrollo tecnológico y es altamente inestable. Pero si la consulta ES admite SQL, entonces tal vez incluso si es un compañero de clase que ha estado trabajando durante uno o dos años, aunque no comprende los conceptos complejos de ES, aún puede usar ES bien y unirse con éxito al equipo de desarrollo. Todos, ¿quién es SQL? ¿No sabes escribir?
Elasticsearch-SQL
Presentamos formalmente a nuestro protagonista: Elasticsearch-SQL no es oficial de Elasticsearch. Es de código abierto de NLPChina (Organización de código abierto de procesamiento de lenguaje natural de China). ) Un complemento de ES cuya función principal es consultar ES a través de SQL. De hecho, su capa inferior es interpretar SQL, convertir SQL a sintaxis DSL y luego consultar a través de DSL.
Elasticsearch-SQL actualmente es compatible con todas las versiones de ES, y también es compatible con la última versión 6.5.x, por lo que se puede ver que el mantenimiento es bastante frecuente.
Instalación de complementos
Debido a las diferencias de versión entre ES 2.x y 5.x (para obtener más detalles, consulte: Selección de versión), nuestra instalación del complemento ES ins es un poco diferente,
El método de instalación anterior a 5.0 es: instalación del complemento
./bin/plugin install lt;/groupIdgt;
lt;artifactIdgt ;elasticsearch-sqllt;/artifactIdgt;
p>
lt; versiongt; La relación se puede consultar aproximadamente en la siguiente figura:
Pero no se pueden obtener todas las versiones de el repositorio de Maven Si obtenemos directamente las dependencias de las siguientes versiones del repositorio de Maven, faltan muchas de ellas Versión:
Entonces, si estamos usando otras versiones de ES, cómo resolver el problema. ¿Dependiendo de los paquetes jar? ¿Aún recuerdas la carpeta SQL que descargamos y descomprimimos cuando comenzamos a descargar el complemento? Por ejemplo, el contenido de la carpeta descomprimida de la versión 6.5.0 del complemento es el siguiente:
Aquí está el paquete jar que necesitamos. Con el paquete jar, es fácil de manejar. Podemos agregarlo directamente al proyecto. Por supuesto, la mejor manera es cargarlo en el almacén privado de la empresa y luego depender de él a través del archivo pom.
Construya el proyecto
Una vez resuelto el problema del paquete jar, puede ingresar oficialmente a la etapa de desarrollo. Cree un nuevo proyecto springboot, introduzca varias dependencias y todo estará listo. conectarse a ES?
Hay dos formas de implementar nuestras funciones. Una es usar JDBC para conectarse a la base de datos como ES. Otra forma es a través del cliente tansport.
Forma JDBC
Ejemplo de código
public void testJDBC() arroja una excepción {
Propiedades propiedades = nuevas Propiedades();
Propiedades propiedades = nuevas Propiedades();< / p>
properties.put("url", "jdbc:elasticsearch://192.168.3.31:9300, 192.168.3.32:9300/" TestsConstants.TEST_INDEX);
DruidDataSource dds = ( DruidDataSource ) ElasticSearchDruidDataSourceFactory.createDataSource(properties);
Conexión conexión = dds.getConnection();
PreparedStatement ps = conexión.prepareStatement("SELECT género, apellido, edad de " TestsConstants. TEST_INDEX " donde apellido='Heath'");
ResultSet resultSet = ps.executeQuery();
Listlt; resultado = new ArrayListlt (); >
p>
while (resultSet.next()) {
System.out.println(resultSet.getString("apellido") "," resultSet.getInt("edad") "," resultSet .getString("género"))
}
ps.close()
conexión.close();
dds .close();
}
Este método es el más intuitivo y utiliza el grupo de conexiones Druid, por lo que también necesitamos introducir dependencias druid en el proyecto, y debemos prestar atención a las dependencias de la versión; de lo contrario, se informará un error.
lt;dependencygt;
lt;groupIdgt;com.alibabalt;/groupIdgt;
lt;artifactIdgt;druidlt;/artifactIdgt;
lt;versiongt;1.0.15lt;/versiongt;
lt;/dependencygt;
Este método es fácil de entender y fácil de desarrollar, pero lo aplico en el proyecto. Descubrí que tenía muchas deficiencias, así que finalmente miré el código fuente yo mismo y volví a encapsular la llamada a través de la API.
Método API
De hecho, elasticsearch-sql no proporciona documentos de desarrollo y no presenta cómo desarrollar llamando a la API de Java. Necesitamos leer el código fuente de elasticsearch-sql. para descubrirlo y luego empaquetarlo en lo que necesitamos. Al leer el código fuente, encontramos la siguiente clase de Servicio con funciones obvias.
Clase pública SearchDao {
Setlt final estático privado; END_TABLE_MAP = new HashSetlt (); > END_TABLE_MAP.add("límite");
END_TABLE_MAP.add("pedido");
END_TABLE_MAP.add("dónde");
END_TABLE_MAP .add("grupo");
}
Cliente privado = null
SearchDao público (Cliente cliente) {
this.client = cliente;
}
public Client getClient() {
return cliente
}
/**
* Preparar acción y transformar sql
* en ES ActionRequest
* @param sql Consulta SQL para ejecutar.
* @return Solicitud ES
* @throws SqlParseException
*/
public QueryAction explica(String sql) lanza SqlParseException, SQLFeatureNotSupportedException {
return ESActionFactory.create(client, sql);
}
}
Hay un método de explicación en la clase SearchDao y el parámetro recibido es una cadena sql de un carácter, el resultado de retorno es QueryAction, QueryAction es una clase abstracta y tiene las siguientes subclases
Se puede ver que cada subclase corresponde a una función de consulta, consulta agregada, consulta predeterminada, eliminar, consultas de unión hash, consultas de unión, consultas anidadas, etc.
Podemos aceptar la QueryAction obtenida a través del método ejecutarAnyAction de la clase QueryActionElasticExecutor, procesarla internamente y luego obtener el resultado de ejecución correspondiente.
objeto estático público ejecutarAnyAction(cliente cliente, QueryAction queryAction) lanza SqlParseException, IOException {
if(queryAction instancia de DefaultQueryAction)
return ejecutarSearchAction((DefaultQueryAction) queryAction );
if(queryAction instancia de AggregationQueryAction)
return ejecutarAggregationAction((AggregationQueryAction) queryAction);
if(queryAction instancia de ESJoinQueryAction)
devolver ejecutarJoinSearchAction(cliente, (ESJoinQueryAction) queryAction);
if(queryAction instancia de MultiQueryAction)
devolver e