Как реализовать нечеткий поиск с помощью SQLite FTS3?

я уже интегрированный поиск на основе официальной документации Android и Я использую следующую схему SQLite и запрос:

CREATE VIRTUAL TABLE Search USING FTS3 (
    _id,
    name,
    location
);

select * from Search where name MATCH ?
-- where ? is the user typed exact "query"
-- or if it doesn't have spaces or stars I append a star to search prefix: "query*"

мне интересно, как я могу продлить его? разрешить следующее:

скажем, у меня есть некоторые элементы с именем:

  • Мой Модный Предмет
  • Мой Секретный Элемент
  • пункт #1
  • Ваш Модный Предмет

когда пользователь вводит blah в поле поиска Результаты поиска будут показывать:

  • my
    • мой Галантерейных Элемент
    • мой Секретный Элемент
  • mfi
    • My FАнси яТЭМ
  • fan item, fanit, fit
    • мой вентиляторcy этоem
    • код вентиляторТИЦ этоem
  • it, item, im, itm
    • Мое Воображение яtem
    • Мой Секрет яtem
    • яtem #1
    • Ваши Фантазии яtem

результаты должны быть ранжированы на основе того, насколько хорош матч, например, если буквы дальше, они должны ранжироваться ниже, чем точное совпадение, например, для mfi: "мой причудливый предмет "должен быть последним, а" MFI thingy " - первым (если такой предмет был).

Примечание: мой min SDK-это уровень API 10, который означает, что он должен работать SQLite 3.6.22.

похожие функциональность можно найти в основном в IDEs:

2 ответов


FTS SQLite позволяет искать только целые слова или префиксы слов.

нет встроенной функциональности для нечетких поисков, как это. (И API базы данных Android не позволяет добавлять пользовательские реализации виртуальных таблиц.)


Я пошел с расслабляющим мои критерии для поиска всех слов начала:

private static String fixQuery(String query) {
    return query.trim().replaceAll("\s+", "*") + "*";
}

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