Поисковые системы и базы данных позволяют использовать последовательный поиск по строкам (например, «это тест»
), который соответствует . Это тест, который будет соответствовать
, но не будет соответствовать , это
.
Я знаю, что некоторые базы данных имеют встроенные функции, которые позволяют использовать те же функции без написания единственной строчки кода (например, Полнотекстовый поиск MySQL). Я не ищу такого ответа.
Я хочу знать, какой алгоритм и структуры базы данных используются для обеспечения такого быстрого поиска строк.
Как будет выглядеть индексированная таблица в приведенном выше примере? Будет ли это что-то похожее на это?
// IndexedItemID | Position | Word
1 | 0 | this
1 | 1 | is
1 | 2 | a
1 | 3 | test
1 | 4 | that
1 | 5 | will
1 | 6 | match
2 | 0 | test
2 | 1 | this
2 | 2 | is
2 | 3 | a
Теперь, когда есть проиндексированные элементы, как эффективно создать оператор SQL, который соответствует этим элементам?
Вот один пример, который я могу придумать:
select IndexedItemID form
(select IndexedItemID, Position from indexedWords where Word = "this") as word1Position
where
exists(select * from indexedWords where IndexedItemID = word1Position.IndexedItemID AND Word = "is" AND Position = word1Position.Position + 1)
AND exists(select * from indexedWords where IndexedItemID = word1Position.IndexedItemID AND Word = "a" AND Position = word1Position.Position + 2)
AND exists(select * from indexedWords where IndexedItemID = word1Position.IndexedItemID AND Word = "test" AND Position = word1Position.Position + 3)
Я уверен, что есть вероятно, более стандартизированный и более эффективный способ.