Как реализован эффективный поиск последовательных слов?

Поисковые системы и базы данных позволяют использовать последовательный поиск по строкам (например, «это тест» ), который соответствует . Это тест, который будет соответствовать , но не будет соответствовать , это .

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

Я уверен, что есть вероятно, более стандартизированный и более эффективный способ.

1
задан Senseful 7 October 2010 в 20:43
поделиться