for - sql server consulta xml
¿Cómo funciona un servidor de búsqueda de texto completo como Sphinx? (4)
El índice invertido es la respuesta a su pregunta: http://en.wikipedia.org/wiki/Inverted_index
Ahora, cuando ejecuta una consulta SQL a través de la esfinge, obtiene los datos de la base de datos y construye el índice invertido que en Sphinx es como una tabla hash donde la clave es un entero de 32 bits que se calcula utilizando crc32 (palabra) y el valor es el lista de ID de documento que tiene esa palabra.
Esto lo hace súper rápido.
Ahora puede argumentar que incluso una base de datos puede crear una estructura similar para hacer las búsquedas súper rápidas. Sin embargo, la mayor diferencia es que un índice Sphinx / Lucene / Solr es como una base de datos de una sola tabla sin ningún soporte para consultas relacionales (JOINs) [Del blog de rendimiento de MySQL]. Recuerde que un índice generalmente solo está ahí para admitir la búsqueda y no para ser la fuente principal de los datos. Por lo tanto, su base de datos puede estar en "tercera forma normal", pero el índice se des-normalizará completamente y contendrá principalmente la información necesaria para la búsqueda.
Otra posible razón es que generalmente las bases de datos sufren de fragmentación interna, necesitan realizar demasiadas tareas de E / S semi-aleatorias en solicitudes enormes.
Lo que esto significa es, por ejemplo, considerando la arquitectura de índice de una base de datos, la consulta conduce a los índices que a su vez conducen a los datos. Si los datos a recuperar se difunden ampliamente, el resultado tomará mucho tiempo y eso parece ser lo que sucede en las bases de datos.
EDITAR: También vea el código fuente en los archivos cpp como searchd.cpp etc. para la implementación interna real, creo que solo está viendo las envolturas de PHP.
¿Puede alguien explicar con palabras simples cómo funciona un servidor de texto completo como Sphinx ? En SQL simple, uno usaría consultas SQL como esta para buscar ciertas palabras clave en los textos:
select * from items where name like ''%keyword%'';
Pero en los archivos de configuración generados por varios complementos de Sphinx no puedo ver ninguna consulta como esta. En su lugar, contienen sentencias de SQL como las siguientes, que parecen dividir la búsqueda en distintos grupos de ID:
SELECT (items.id * 5 + 1) AS id, ...
WHERE items.id >= $start AND items.id <= $end
GROUP BY items.id
..
SELECT * FROM items WHERE items.id = (($id - 1) / 5)
¿Es posible explicar en palabras simples cómo funcionan estas consultas y cómo se generan?
La búsqueda de texto completo usualmente usa una implementación de índice invertido. En palabras simples, frena el contenido de un campo indexado en tokens (palabras) y guarda una referencia a esa fila, indexada por cada token. Por ejemplo, un campo con The yellow dog
para la fila # 1 y The brown fox
para la fila # 2, poblará un índice como:
brown -> row#2
dog -> row#1
fox -> row#2
The -> row#1
The -> row#2
yellow -> row#1
Las consultas que está viendo son la consulta que utiliza la esfinge para extraer una copia de los datos de la base de datos y colocarla en su propio índice.
Sphinx necesita una copia de los datos para construir su índice (otras respuestas han mencionado cómo funciona ese índice). Luego solicita los resultados (que coinciden con una consulta específica) del daemon searchd: consulta el índice y le devuelve los documentos correspondientes.
El ejemplo particular que ha elegido parece bastante complicado, ya que solo extrae una parte de los datos, probablemente para fragmentación, para dividir el índice en partes por razones de rendimiento. Y está utilizando consultas de rango, por lo que puede acceder a grandes conjuntos de datos por etapas.
Se podría construir un índice con una consulta mucho más simple, como
sql_query = select id,name,description from items
que crearía un índice de esfinge, con dos campos: name
y description
que se podrían buscar / consultar.
Al buscar, obtendrías la id
única. http://sphinxsearch.com/info/faq/#row-storage
Una respuesta breve a la pregunta es que las bases de datos como MySQL están diseñadas específicamente para almacenar e indexar registros y soportar cláusulas de SQL (SELECT, PROJECT, JOIN, etc.). Aunque se pueden utilizar para realizar consultas de búsqueda de palabras clave, no pueden ofrecer el mejor rendimiento y características. Los motores de búsqueda como Sphinx están diseñados específicamente para consultas de búsqueda de palabras clave, por lo que pueden brindar un mejor soporte.