Как объяснил Ювал, в целом Lucene ориентируется на точное совпадение (путем нормализации условий с помощью анализаторов как по индексу, так и по времени запроса).
В коде магистрали Lucene (еще не выпущенной версии) фактически используется дерево суффиксов для неточных совпадений, таких как Regex, Wildcard и Fuzzy.
Способ, которым это работает, заключается в том, что словарь терминов Lucene сам по себе является формой дерева суффиксов. Вы можете увидеть это в форматах файлов, которые вы упомянули в нескольких местах:
Таким образом, если текст предыдущего термина был «кость», а термин «мальчик», то длина префикса равна двум, а суффикс - «у».
Термин информационный индекс дает нам «произвольный доступ» путем индексации этого дерева через определенные интервалы (по умолчанию каждый 128-й термин).
На нижнем уровне это дерево суффиксов, но на более высоком уровне мы используем эти свойства (в основном те, которые указаны в IndexReader.terms, чтобы трактовать словарь терминов как детерминированный конечный автомат (DFA)):
Возвращает перечисление всех терминов, начинающихся с данного термина. Если данный термин не существует, перечисление позиционируется на первый термин больше, чем предоставленный термин. Перечисление заказано Term.compareTo (). Каждый термин больше всех предшествующих ему в перечислении.
Неточные запросы, такие как Regex, Wildcard и Fuzzy, сами по себе также определяются как DFA, а «сопоставление» - это просто пересечение DFA.