Pregunta

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 se alojará 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 sigan ingresando datos en el sitio, esos datos deberán 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.

¿Fue útil?

Solución

Es bueno ver que alguien intervino sobre Lucene -. Porque no tengo ni idea de eso

Sphinx, por el contrario, sé bastante bien, así que vamos a ver si puedo ser de alguna ayuda.

  • nivel de relevancia resultado es el valor predeterminado. Usted puede configurar su propia clasificación si lo desea, y dar a campos específicos ponderaciones más elevadas.
  • velocidad de indexación es súper rápido, porque habla directamente a la base de datos. Cualquier lentitud vendrá de consultas SQL complejas y las claves externas no-indexados y otros problemas similares. Nunca he notado ninguna lentitud en la búsqueda tampoco.
  • Soy un tipo rieles, por lo que no tengo idea de lo fácil que es implementar con Django. Hay una API Python que viene con la fuente Esfinge sin embargo.
  • El demonio de servicio de búsqueda (searchd) es bastante bajo en el uso de la memoria - y se puede establecer límites a la la cantidad de memoria el proceso paso a paso utiliza también.
  • La escalabilidad es donde mi conocimiento es más vaga - pero es bastante fácil de copiar los archivos de índice de múltiples máquinas y ejecutar varios demonios searchd. La impresión general que recibo de los demás, aunque es que es muy muy buena con una carga elevada, por lo que su reducción a cabo a través de múltiples máquinas no es algo que necesita ser tratado.
  • No hay soporte para 'hizo-que-media', etc - a pesar de estos se puede hacer con otras herramientas con bastante facilidad. Sphinx hace frenar palabras, aunque el uso de diccionarios, por lo que 'conducir' y 'duro' (por ejemplo) que se consideraría la misma en las búsquedas.
  • Esfinge no permite actualizaciones de índices parciales de datos de campo sin embargo. El enfoque común para esto es para mantener un índice de delta con todos los cambios recientes, y volver a índice de esto después de cada cambio (y los nuevos resultados aparecen dentro de uno o dos segundos). Debido a la pequeña cantidad de datos, esto puede tomar una cuestión de segundos. Usted todavía tendrá que volver a indexar el conjunto de datos principal con regularidad, aunque (a pesar de la regularidad depende de la volatilidad de sus datos -?? Todos los días, cada hora). Las velocidades rápidas de indexación mantener todo esto bastante rápido sin embargo.

No tengo ni idea de cómo se aplica a su situación esto es, pero Evan Weaver comparó algunos de los rieles comunes opciones de búsqueda (Sphinx, Hurón (un puerto de Lucene para Ruby) y Solr), la ejecución de algunos puntos de referencia. Podría ser útil, supongo.

No he sondeado las profundidades de búsqueda de texto completo de MySQL, pero sé que no compite velocidad-sabia ni En cuanto a prestaciones con Sphinx, Lucene o Solr.

Otros consejos

No sé Esfinge, pero en cuanto a Lucene vs una búsqueda de texto completo de base de datos, creo que el rendimiento Lucene es inigualable. Usted debe ser capaz de hacer casi cualquier búsqueda en menos de 10 ms, no importa cuántos registros hay que buscar, siempre que se haya configurado el índice Lucene correctamente.

A continuación viene el mayor obstáculo sin embargo: personalmente, creo que la integración de Lucene en su proyecto no es fácil . Claro, no es demasiado difícil configurarlo para que pueda hacer un poco de búsqueda básica, pero si se desea obtener el máximo provecho de ella, con un rendimiento óptimo, entonces definitivamente necesita un buen libro sobre Lucene.

En cuanto a los requisitos de CPU y RAM, realizando una búsqueda en Lucene no la tarea de la CPU demasiado, sin embargo la indexación de los datos es, a pesar de que no lo hace con demasiada frecuencia (tal vez una o dos veces al día), de manera que no es mucho de un obstáculo.

No responde a todas sus preguntas, pero en pocas palabras, si usted tiene una gran cantidad de datos para buscar, y desea un gran rendimiento, entonces creo Lucene es definitivamente el camino a seguir. Si no vas a tener que muchos datos para buscar, a continuación, que también podría ir para una búsqueda de texto completo de base de datos. La creación de una búsqueda de texto completo de MySQL es definitivamente más fácil en mi libro.

Me sorprende que no haya más información publicada acerca de Solr. Solr es bastante similar a la Esfinge, pero tiene características más avanzadas (que yo sepa que no he utilizado Sphinx - sólo lectura al respecto).

La respuesta en el enlace de abajo detalla algunas cosas acerca de la esfinge que se aplica también a Solr. Comparación de texto completo motor de búsqueda - Lucene, Sphinx, PostgreSQL, MySQL

Solr también proporciona las siguientes características adicionales:

  1. compatible con la replicación
  2. múltiples núcleos (piensan de estas bases de datos como independientes con su propia configuración y propios índices)
  3. búsquedas booleanas
  4. resaltado de palabras clave (bastante fácil de hacer en el código de la aplicación si tiene expresiones regulares-fu, sin embargo, ¿por qué no dejar que una herramienta especializada hacer un mejor trabajo para usted)
  5. índice de actualización a través de XML o un archivo delimitado
  6. Comunicarse con el servidor de búsqueda a través de HTTP (que puede incluso volver JSON, nativo de PHP / Ruby / Python)
  7. PDF, Word indexación de documentos
  8. Campos dinámicos
  9. Facetas
  10. campos de agregado
  11. Dejar de palabras, sinónimos, etc.
  12. de la misma familia ...
  13. Índice directamente de la base de datos con consultas personalizadas
  14. La sugerencia automática
  15. Caché Autowarming
  16. indexación rápida (en comparación con MySQL tiempos de búsqueda de texto completo de indexación) -. Lucene utiliza un formato de índice invertido binario
  17. Impulso (reglas personalizadas para aumentar la relevancia de una palabra clave o frase en particular, etc.)
  18. búsquedas por campos (si un usuario conoce el campo de búsqueda que él / ella quiere buscar, que Afine su búsqueda escribiendo el campo, entonces el valor, y sólo ese campo se buscaron en lugar de todo - mucho mejor experiencia de usuario)

Por cierto, existen muchas más características; Sin embargo, he enumerado sólo las características que realmente he utilizado en la producción. Por cierto, fuera de la caja, MySQL soporta # 1, # 3, y # 11 (limitado) en la lista anterior. Por las características que usted está buscando, una base de datos relacional no se va a cortar. Me eliminar aquellos enseguida.

Además, otro beneficio es que Solr (bueno, Lucene en realidad) es una base de datos de documentos (por ejemplo NoSQL) que muchos de los beneficios de cualquier otra base de datos de documentos se puede realizar con Solr. En otras palabras, se puede usar para algo más que buscar (es decir, el rendimiento). Sea creativo con él:)

apache solr


Además de responder las consultas de OP, permítanme brindarles algunas ideas sobre apache solr de introducción sencilla a instalación detallada y implementación.

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 debe usarse para resolver problemas en tiempo real.Para los motores de búsqueda, solr es prácticamente un juego y funciona impecablemente.

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

  • Relevancia y clasificación de resultados.

El aumentar le ayuda a clasificar sus resultados para que aparezcan en la parte superior.Digamos que estás intentando buscar un nombre. John en los campos nombre de pila y apellido, y quieres darle relevancia a la nombre de pila campo, entonces necesitas aumentar hasta el nombre de pila campo como se muestra.

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

Como se puede ver, nombre de pila el campo es impulsado arriba con una puntuación de 2.

Más en 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 de las tablas de su base de datos.Un más alto y complejo UNIRSE afectan la velocidad de indexación.Sin embargo, una enorme RAM config puede abordar 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é integrarme solr y Django, sin embargo puedes lograr hacerlo con Alpaca.encontré algunos interesantes artículo en el mismo y aquí está el github para ello.

  • 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.

Solr's El uso de RAM 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 explica, solr es sólo una solución casi en tiempo real.

  • escalabilidad

solr es altamente escalable.Echa un vistazo 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 y automáticamente se encarga del equilibrio de carga usando 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 Componente de corrección ortográfica que está lleno de solr.Hay muchas otras características, la Bola de nievePorterFilterFactory ayuda a recuperar registros, digamos si escribió, libros en lugar de libro, se le presentarán resultados relacionados con libro.


Esta respuesta se centra ampliamente en apache solr & 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

Descargar apache solr de 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.Decir .. Downloads o lo que sea..Entonces se verá como Downloads/solr-4.8.1/

A tu indicación...Navegar 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

Embarcadero está disponible dentro de la carpeta de ejemplos del solr-4.8.1 directorio, así que navegue dentro de él 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 & After Start.jar para que el servidor de muelle 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.xml archivo.

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

Descarga el JConnector

Este archivo JAR actúa como un puente entre mysql y JDBC, descargue la versión independiente de la plataforma aquí

Después de descargarlo, extraiga la carpeta y copie elmysql-connector-java-5.1.31-bin.jar y pegarlo en el biblioteca directorio.

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

Creando la tabla MySQL para vincularla a Apache Solr

Poner solr Para usarlo, necesita tener algunas tablas y datos para buscar.Para eso usaremos mysql para crear una tabla y enviar algunos nombres aleatorios y luego podríamos usar solr para conectarse 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 agrega el DIH (Manejador 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 mysql base de datos.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 lo mismo, la indexación se saltará.)

4.Modificar el archivo esquema.xml

Añade esto a tu 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.Necesitas hacer la indexación de datos de mysql a solr para hacer uso de consultas Solr.

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

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

This is the main Apache Solr Administration Panel

Como indica el marcador, vaya a Inicio sesión 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-datos-config.xml, digamos que si hubiera algún error en esa consulta, se habría mostrado aquí.

This is the logging section of your Apache Solr engine

Bien, sin errores.Estamos listos para partir.Vamos a escoger colección1 de la lista como se muestra y seleccione Importación de datos

Paso 3:DIH (controlador de importación de datos)

Utilizando el DIH, se conectará a mysql de solr a través del archivo de configuración db-datos-config.xml desde el solr interfaz y recuperar los 10 registros de la base de datos que se indexa en solr.

Para hacer eso, elija importación total y comprueba las opciones Limpio y Comprometerse.Ahora haga clic Ejecutar como se muestra.

Alternativamente, puede utilizar un directo importación total consulta como esta también..

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

The Data Import Handler

Después de hacer clic Ejecutar, solr comienza a indexar los registros, si hubiera algún error, diría Error de indexación y tienes que volver al Inicio sesión sección para ver qué salió mal.

Suponiendo que no haya errores con esta configuración y si la indexación se completa correctamente, recibirá esta notificación.

Indexing Success

Etapa 4:Ejecución de consultas Solr

Parece que todo salió bien, ahora te vendría bien. solr Consultas para consultar los datos que fueron indexados.Haga clic en el Consulta a la izquierda y luego presione Ejecutar botón en la parte inferior.

Verá los registros indexados como se muestra.

El correspondiente solr La consulta para enumerar todos los registros es

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

The indexed data

Bueno, ahí van los 10 registros indexados.Digamos que sólo necesitamos nombres que comiencen con Ja , en este caso, debe apuntar al nombre de la columna solr_name, Por lo tanto, su consulta es la siguiente.

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

The JSON data starting with Ja*

asi es como se escribe solr Consultas.Para leer más al respecto, mira esta hermosa artículo.

Estoy mirando búsqueda de texto completo de PostgreSQL en este momento, y tiene todas las características adecuadas de un moderno motor de búsqueda, muy buen carácter prolongado y soporte multilingüe, buena integración con los campos de texto en la base de datos.

Pero no tiene fáciles de usar operadores de búsqueda como + o Y (usos y |!) Y no estoy encantados con cómo funciona en su sitio de documentación. Mientras que tiene la negrita de los términos de concordancia en los fragmentos de los resultados, el algoritmo por defecto para que coincida con la que los términos no es grande. Además, si se desea rtf índice, PDF, MS Office, usted tiene que encontrar e integrar un conversor de formatos de archivos.

otoh, es mucho mejor que la búsqueda de texto MySQL, que ni siquiera términos de índice de tres letras o menos. Es el valor predeterminado para la búsqueda MediaWiki, y realmente creo que no es bueno para los usuarios finales: http: //www.searchtools.com/analysis/mediawiki-search/

En todos los casos que he visto, Lucene / Solr y la Esfinge son realmente grandes . Son código sólida y han evolucionado con mejoras significativas en la facilidad de uso, por lo que las herramientas están ahí para hacer la búsqueda que satisface casi todo el mundo.

para Shaili -. SOLR incluye la biblioteca de código de búsqueda Lucene y tiene los componentes para ser un buen motor de búsqueda independiente

Solo mi granito de arena para esta vieja pregunta.Recomiendo encarecidamente echar un vistazo a Búsqueda elástica.

Elasticsearch es un servidor de búsqueda basado en Lucene.Proporciona un motor de búsqueda de texto completo distribuido y con capacidad para múltiples inquilinos con una interfaz web RESTful y documentos JSON sin esquemas.Elasticsearch está desarrollado en Java y se publica como código abierto según los términos de la licencia Apache.

Las ventajas sobre otros motores FTS (búsqueda de texto completo) son:

  • Interfaz RESTful
  • Mejor escalabilidad
  • Gran comunidad
  • Construido por desarrolladores de Lucene
  • Amplia documentación
  • Hay muchos Bibliotecas de código abierto disponibles (incluido Django)

Estamos utilizando este motor de búsqueda en nuestro proyecto y estamos muy contentos con él.

SearchTools-Avi dijo "búsqueda de texto MySQL, que ni siquiera términos de índice de tres letras o menos."

FYI, The MySQL texto completo min longitud de palabra es ajustable desde al menos MySQL 5.0. Google 'mysql min Longitud de texto completo' para obtener instrucciones simples.

Dicho esto, MySQL texto completo tiene limitaciones: por un lado, se pone lento para actualizar una vez que llegue un millón de discos más o menos, ...

Yo añadiría mnoGoSearch a la lista. solución extremadamente performant y flexible, que funciona como Google: indexador obtiene datos desde múltiples sitios, usted podría utilizar criterios básicos, o inventar sus propios ganchos para tener la máxima calidad de búsqueda. También podría recuperar los datos directamente de la base de datos.

La solución no es tan conocida hoy, pero FEETS necesidades máximas. Se podría compilar e instalarlo o en un servidor independiente, o incluso en el servidor principal, que no necesita tanto como Recursos Solr, como está escrito en C y funciona perfectamente incluso en servidores pequeños.

En el principio debe compilar usted mismo, por lo que requiere un poco de conocimiento. Hice una pequeña href="https://github.com/fedir/mnogosearch-typo3/blob/master/installation-debian.sh" guión para Debian, lo que podría ayudar . Cualquier ajuste son bienvenidos.

Como está usando el framework Django, podría utilizar o cliente PHP en el medio, o encontrar una solución en Python, vi algunos artículos .

Y, por supuesto mnoGoSearch es de código abierto, GNU GPL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top