Поисковые системы и базы данных позволяют вам использовать последовательный поиск строк (например, "this is a test"
), который соответствует this is a test that will match
, но не соответствует test this is a
.
Я знаю, что некоторые базы данных были построены-в функции, которые позволяют вам использовать те же функции без написания одной строки кода (например, полнотекстовый поиск 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)
Я уверен, что, возможно, есть более стандартизированный способ, который более эффективен.