Как работает полнотекстовый поисковый сервер, такой как Sphinx?

Может ли кто-нибудь объяснить простыми словами, как работает полный текстовый сервер, например Sphinx? В простом SQL SQL-запросы можно использовать для поиска определенных ключевых слов в текстах:

select * from items where name like '%keyword%';

Но в файлах конфигурации, сгенерированных различными плагинами Sphinx, я вообще не вижу таких запросов. Они содержат вместо SQL-операторов следующие, которые, похоже, делят поиск на отдельные группы идентификаторов:

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)

Можно ли в простых словах объяснить, как эти запросы работают и как они генерируются?

Ответ 1

Инвертированный указатель - это ответ на ваш вопрос: http://en.wikipedia.org/wiki/Inverted_index

Теперь, когда вы запускаете SQL-запрос через sphinx, он извлекает данные из базы данных и строит инвертированный индекс, который в Sphinx похож на хэш-таблицу, где ключ представляет собой 32-битное целое число, которое вычисляется с использованием crc32 (word) и value - это список documentID, имеющий это слово.

Это делает его очень быстрым.

Теперь вы можете утверждать, что даже база данных может создавать аналогичную структуру для ускорения поиска. Однако самое большое различие заключается в том, что индекс Sphinx/Lucene/Solr похож на базу данных с одной таблицей без поддержки реляционных запросов (JOINs) [из MySQL Performance Blog]. Помните, что индекс обычно существует только для поддержки поиска и не является основным источником данных. Таким образом, ваша база данных может находиться в "третьей нормальной форме", но индекс будет полностью де-нормализован и содержать в основном только данные, необходимые для поиска.

Другая возможная причина - в большинстве случаев базы данных страдают от внутренней фрагментации, им приходится выполнять слишком много полузадачных задач ввода-вывода при огромных запросах.

Что это означает, например, учитывая архитектуру индекса баз данных, запрос приводит к индексам, которые, в свою очередь, приводят к данным. Если данные для восстановления широко распространены, результат займет много времени, и, похоже, это происходит в базах данных.

EDIT: Также см. исходный код в файлах cpp, таких как searchd.cpp и т.д. для реальной внутренней реализации, я думаю, что вы просто видите обертки PHP.

Ответ 2

Те запросы, на которые вы смотрите, - это запрос, используемый sphinx, для извлечения копии данных из базы данных, для ввода собственного индекса.

Sphinx нуждается в копировании данных для создания индекса (в других ответах упоминается, как работает этот индекс). Затем вы запрашиваете результаты (соответствующие конкретному запросу) из демона searchd - он обращается к индексу и возвращает вам соответствующие документы.

Конкретный пример, который вы выбрали, выглядит довольно сложно, потому что он только извлекает часть данных, вероятно, для sharding - разбивать индекс на части по соображениям производительности. И использует запросы диапазона - так что можно получить доступ к большим наборам данных по частям.

Индекс может быть построен с гораздо более простым запросом, например

sql_query = select id,name,description from items

который создал бы индекс sphinx, с двумя полями - name и description, которые могли быть найдены/запрошены.

При поиске вы получите уникальный id. http://sphinxsearch.com/info/faq/#row-storage

Ответ 3

Полнотекстовый поиск обычно использует одну реализацию инвертированного индекса. Простыми словами, он тормозит содержимое индексированного поля в токенах (словах) и сохраняет ссылку на эту строку, индексированную каждым токеном. Например, поле с The yellow dog для строк # 1 и The brown fox для строки # 2 будет заполнять индекс, например:

brown  -> row#2
dog    -> row#1
fox    -> row#2
The    -> row#1
The    -> row#2
yellow -> row#1

Ответ 4

Короткий ответ на вопрос: базы данных, такие как MySQL, специально разработаны для хранения и индексирования записей и поддержки предложений SQL (SELECT, PROJECT, JOIN и т.д.). Несмотря на то, что они могут использоваться для запросов поиска по ключевым словам, они не могут обеспечить лучшую производительность и функции. Поисковые системы, такие как Sphinx, разработаны специально для запросов поиска по ключевым словам, поэтому могут обеспечить гораздо лучшую поддержку.