Comparación de motores de búsqueda de texto completo: ¿Lucene, Sphinx, Postgresql, MySQL? [cerrado]

Resuelto Continuation asked hace 15 años • 9 respuestas

Estoy creando un sitio Django y estoy buscando un motor de búsqueda.

Algunos candidatos:

  • Lucene/Lucene con brújula/Solr

  • Esfinge

  • Búsqueda de texto completo incorporada en Postgresql

  • Búsqueda de texto completo integrada en MySQl

Criteria de selección:

  • Relevancia y clasificación de resultados.
  • velocidad de búsqueda e indexación
  • facilidad de uso y facilidad de integración con Django
  • Requisitos de recursos: el sitio estará alojado en un VPS , por lo que lo ideal es que el motor de búsqueda no requiera mucha RAM y CPU.
  • escalabilidad
  • Funciones adicionales como "¿Quiso decir?", búsquedas relacionadas, etc.

Cualquiera que haya tenido experiencia con los motores de búsqueda anteriores u otros motores que no estén en la lista, me encantaría escuchar sus opiniones.

EDITAR: En cuanto a las necesidades de indexación, a medida que los usuarios siguen ingresando datos en el sitio, esos datos deberían indexarse ​​continuamente. No tiene que ser en tiempo real, pero lo ideal sería que los datos nuevos aparecieran en el índice con un retraso no mayor a 15 a 30 minutos.

Continuation avatar Apr 10 '09 17:04 Continuation
Aceptado

Es bueno ver que alguien intervino sobre Lucene, porque no tengo idea de eso.

Sphinx, por otro lado, lo conozco bastante bien, así que veamos si puedo ser de alguna ayuda.

  • La clasificación de relevancia de los resultados es la predeterminada. Puede configurar su propia clasificación si lo desea y otorgar ponderaciones más altas a campos específicos.
  • La velocidad de indexación es súper rápida porque habla directamente con la base de datos. Cualquier lentitud provendrá de consultas SQL complejas y claves externas no indexadas y otros problemas similares. Tampoco he notado nunca lentitud en la búsqueda.
  • Soy un tipo de Rails, así que no tengo idea de lo fácil que es implementarlo con Django. Sin embargo, existe una API de Python que viene con la fuente Sphinx.
  • El demonio del servicio de búsqueda (searchd) tiene un uso de memoria bastante bajo, y también puede establecer límites sobre la cantidad de memoria que usa el proceso de indexación.
  • La escalabilidad es donde mi conocimiento es más incompleto, pero es bastante fácil copiar archivos de índice a varias máquinas y ejecutar varios demonios de búsqueda. Sin embargo, la impresión general que tengo de los demás es que es bastante bueno bajo cargas elevadas, por lo que ampliarlo en varias máquinas no es algo con lo que debamos ocuparnos.
  • No hay soporte para "¿Quiso decir?", etc., aunque se pueden hacer con otras herramientas con bastante facilidad. Sphinx deriva palabras mediante el uso de diccionarios, por lo que "conducir" y "conducir" (por ejemplo) se considerarían iguales en las búsquedas.
  • Sin embargo, Sphinx no permite actualizaciones parciales del índice de datos de campo. El enfoque común para esto es mantener un índice delta con todos los cambios recientes y volver a indexarlo después de cada cambio (y esos nuevos resultados aparecen en uno o dos segundos). Debido a la pequeña cantidad de datos, esto puede tardar unos segundos. Sin embargo, aún necesitará volver a indexar el conjunto de datos principal con regularidad (aunque la regularidad depende de la volatilidad de sus datos: ¿todos los días? ¿Cada hora?). Sin embargo, las rápidas velocidades de indexación hacen que todo esto sea bastante sencillo.

No tengo idea de cuán aplicable es esto a su situación, pero Evan Weaver comparó algunas de las opciones de búsqueda comunes de Rails (Sphinx, Ferret (un puerto de Lucene para Ruby) y Solr), ejecutando algunos puntos de referencia. Podría ser útil, supongo.

No he sondeado las profundidades de la búsqueda de texto completo de MySQL, pero sé que no compite en velocidad ni en características con Sphinx, Lucene o Solr.

pat avatar Apr 10 '2009 15:04 pat

No conozco Sphinx, pero en cuanto a Lucene frente a una búsqueda de texto completo en una base de datos, creo que el rendimiento de Lucene es incomparable. Debería poder realizar casi cualquier búsqueda en menos de 10 ms, sin importar cuántos registros tenga que buscar, siempre que haya configurado su índice de Lucene correctamente.

Sin embargo, aquí viene el mayor obstáculo: personalmente, creo que integrar Lucene en su proyecto no es fácil . Claro, no es demasiado difícil configurarlo para que puedas hacer una búsqueda básica, pero si quieres aprovecharlo al máximo, con un rendimiento óptimo, definitivamente necesitas un buen libro sobre Lucene.

En cuanto a los requisitos de CPU y RAM, realizar una búsqueda en Lucene no requiere demasiada tarea para su CPU, aunque indexar sus datos sí lo es, aunque no lo hace con demasiada frecuencia (tal vez una o dos veces al día), por lo que no es necesario. gran obstáculo.

No responde a todas tus preguntas, pero en resumen, si tienes muchos datos para buscar y quieres un rendimiento excelente, creo que Lucene es definitivamente el camino a seguir. Si no va a tener tantos datos para buscar, también puede realizar una búsqueda de texto completo en la base de datos. En mi opinión, configurar una búsqueda de texto completo en MySQL es definitivamente más fácil.

Razzie avatar Apr 10 '2009 11:04 Razzie

apache solr


Además de responder las consultas de OP, permítanme brindarles algunas ideas sobre Apache Solr , desde una simple introducción hasta una instalación e implementación detalladas .

Introducción sencilla


Cualquiera que haya tenido experiencia con los motores de búsqueda anteriores u otros motores que no estén en la lista, me encantaría escuchar sus opiniones.

Solr no debería usarse para resolver problemas en tiempo real. Para los motores de búsqueda, Solr es prácticamente un juego y funciona perfectamente .

Solr funciona bien en aplicaciones web de alto tráfico ( leí en alguna parte que no es adecuado para esto, pero estoy respaldando esa afirmación ). Utiliza la RAM, no la CPU.

  • Relevancia y clasificación de resultados.

El impulso le ayuda a clasificar sus resultados para que aparezcan en la parte superior. Supongamos que está intentando buscar un nombre, John , en los campos nombre y apellido , y desea darle relevancia al campo nombre , entonces necesita mejorar el campo nombre como se muestra.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Como puede ver, el campo de nombre aumenta con una puntuación de 2.

Más sobre SolrRelevancia

  • velocidad de búsqueda e indexación

La velocidad es increíblemente rápida y no hay concesiones al respecto. La razón por la que me mudé a Solr .

En cuanto a la velocidad de indexación, Solr también puede manejar UNIONES desde las tablas de su base de datos. Una JOIN más alta y compleja afecta la velocidad de indexación. Sin embargo, una configuración de RAM enorme puede solucionar fácilmente esta situación.

Cuanto mayor sea la RAM, más rápida será la velocidad de indexación de Solr.

  • facilidad de uso y facilidad de integración con Django

Nunca intenté integrar Solr y Django , sin embargo, puedes lograrlo con Haystack . Encontré un artículo interesante sobre el mismo y aquí está el github .

  • Requisitos de recursos: el sitio estará alojado en un VPS, por lo que lo ideal es que el motor de búsqueda no requiera mucha RAM y CPU.

Solr se reproduce en la RAM, por lo que si la RAM es alta, no tiene que preocuparse por Solr .

El uso de RAM de Solr se dispara con la indexación completa. Si tiene unos mil millones de registros, podría utilizar inteligentemente las importaciones de Delta para abordar esta situación. Como se explicó, Solr es solo una solución casi en tiempo real .

  • escalabilidad

Solr es altamente escalable. Eche un vistazo a SolrCloud . Algunas características clave del mismo.

  • Fragmentos (o fragmentación es el concepto de distribuir el índice entre varias máquinas, por ejemplo, si su índice ha crecido demasiado)
  • Equilibrio de carga (si Solrj se usa con la nube Solr, automáticamente se encarga del equilibrio de carga utilizando su mecanismo Round-Robin)
  • Búsqueda distribuida
  • Alta disponibilidad
  • Funciones adicionales como "¿Quiso decir?", búsquedas relacionadas, etc.

Para el escenario anterior, puede utilizar el SpellCheckComponent que viene incluido con Solr . Hay muchas otras características, SnowballPorterFilterFactory ayuda a recuperar registros, por ejemplo, si escribió libros en lugar de libro , se le presentarán resultados relacionados con el libro .


Esta respuesta se centra ampliamente en Apache Solr y MySQL . Django está fuera de alcance.

Suponiendo que se encuentra en un entorno LINUX, puede continuar con este artículo. (la mía era una versión Ubuntu 14.04)

Instalación detallada

Empezando

Descargue Apache Solr desde aquí . Esa sería la versión 4.8.1 . Podrías descargar nuevas versiones, encontré esta estable.

Después de descargar el archivo, extráigalo a una carpeta de su elección. Di... Downloadso lo que sea... Así se verá así.Downloads/solr-4.8.1/

Cuando se le indique... Navegue dentro del directorio

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Así que ahora estás aquí..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Inicie el servidor de aplicaciones Jetty

Jetty está disponible dentro de la carpeta de ejemplos del solr-4.8.1directorio, así que navegue dentro de ella e inicie Jetty Application Server.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Ahora bien, no cierres el terminal, minimízalo y déjalo a un lado.

(CONSEJO: use & después de start.jar para que Jetty Server se ejecute en segundo plano)

Para comprobar si Apache Solr se ejecuta correctamente, visite esta URL en el navegador. http://localhost:8983/solr

Ejecutando Jetty en un puerto personalizado

Se ejecuta en el puerto 8983 de forma predeterminada. Puede cambiar el puerto aquí o directamente dentro del jetty.xmlarchivo.

java -Djetty.port=9091 -jar start.jar

Descarga el JConnector

Este archivo JAR actúa como puente entre MySQL y JDBC. Descargue la versión independiente de la plataforma aquí.

Después de descargarlo, extraiga la carpeta, cópiela mysql-connector-java-5.1.31-bin.jary péguela en el directorio lib .

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Creando la tabla MySQL para vincularla a Apache Solr

Para utilizar Solr , debe tener algunas tablas y datos para buscar. Para eso, usaremos MySQL para crear una tabla e insertar algunos nombres aleatorios y luego podríamos usar Solr para conectarnos a MySQL e indexar esa tabla y sus entradas.

1.Estructura de la tabla

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. Complete la tabla anterior

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

Entrar en el núcleo y agregar las directivas lib

1.Navega hasta

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.Modificación de solrconfig.xml

Agregue estas dos directivas a este archivo.

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Ahora agregue el DIH (Controlador de importación de datos)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Cree el archivo db-data-config.xml

Si el archivo existe, ignórelo y agregue estas líneas a ese archivo. Como puede ver en la primera línea, debe proporcionar las credenciales de su base de datos MySQL . El nombre de la base de datos, nombre de usuario y contraseña.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(CONSEJO: puede tener cualquier cantidad de entidades, pero tenga cuidado con el campo de identificación, si son iguales, se omitirá la indexación).

4.Modificar el archivo esquema.xml

Agregue esto a su esquema.xml como se muestra.

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Implementación

Indexación

Aquí es donde está el verdadero problema. Debe indexar los datos de MySQL a Solr para poder utilizar las consultas de Solr.

Paso 1: vaya al panel de administración de Solr

Presione la URL http://localhost:8983/solr en su navegador. La pantalla se abre así.

Este es el Panel de Administración principal de Apache Solr

Como indica el marcador, vaya a Registro para comprobar si alguna de las configuraciones anteriores ha provocado errores.

Paso 2: revisa tus registros

Ok, ahora estás aquí. Como puedes, hay muchos mensajes amarillos (ADVERTENCIAS). Asegúrate de no tener mensajes de error marcados en rojo. Anteriormente, en nuestra configuración habíamos agregado una consulta de selección en nuestro db-data-config.xml , por ejemplo, si hubiera algún error en esa consulta, se habría mostrado aquí.

Esta es la sección de registro de su motor Apache Solr

Fine, no errors. We are good to go. Let's choose collection1 from the list as depicted and select Dataimport

Step 3: DIH (Data Import Handler)

Using the DIH, you will be connecting to MySQL from Solr through the configuration file db-data-config.xml from the Solr interface and retrieve the 10 records from the database which gets indexed onto Solr.

To do that, Choose full-import , and check the options Clean and Commit. Now click Execute as shown.

Alternatively, you could use a direct full-import query like this too..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

El controlador de importación de datos

After you clicked Execute, Solr begins to index the records, if there were any errors, it would say Indexing Failed and you have to go back to the Logging section to see what has gone wrong.

Assuming there are no errors with this configuration and if the indexing is successfully complete., you would get this notification.

Éxito de la indexación

Step 4: Running Solr Queries

Seems like everything went well, now you could use Solr Queries to query the data that was indexed. Click the Query on the left and then press Execute button on the bottom.

You will see the indexed records as shown.

The corresponding Solr query for listing all the records is

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

Los datos indexados

Well, there goes all 10 indexed records. Say, we need only names starting with Ja , in this case, you need to target the column name solr_name, Hence your query goes like this.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Los datos JSON que comienzan con Ja*

That's how you write Solr Queries. To read more about it, Check this beautiful article.

Shankar Narayana Damodaran avatar Jan 19 '2015 10:01 Shankar Narayana Damodaran