Каталог полнотекстового поиска SQLite - PullRequest
1 голос
/ 23 декабря 2010

Интересно, возможно ли следующее с помощью fts (3/4) для SQLite. Я создал таблицу с некоторыми данными, используя fts3.

Если я, например, ищу e *, я получаю все, что начинается с ^ e Но могу ли я также искать в индексе / каталоге конкретные слова, начинающиеся с e?

Так что я получаю только результаты этих слов обратно; Эллиот, Эло, Эээх.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Механизм FTS предоставляет эту информацию через виртуальную функцию offsets.

SELECT offsets(docs) FROM docs WHERE docs MATCH 'e*';

Как сказано в документации:

Для запроса SELECT, использующего полнотекстовый индекс, функция offsets () возвращает текстовое значение, содержащее серию разделенных пробелами целых чисел. Для каждого термина в каждой фразе, совпадающей с текущей строкой, в возвращаемом списке есть четыре целых числа. Каждый набор из четырех целых чисел интерпретируется следующим образом:

  1. Номер столбца, в котором встречается экземпляр термина (0 для самого левого столбца таблицы FTS, 1 для следующего левого и т. Д.).
  2. Номер термина соответствующего термина в полнотекстовом выражении запроса. Термины в выражении запроса нумеруются начиная с 0 в том порядке, в котором они встречаются.
  3. Смещение в байтах совпадающего члена в столбце.
  4. Размер совпадающего члена в байтах.

Как извлечь эту информацию зависит от вас и как вы интегрируете свой код с SQLite.

2 голосов
/ 23 декабря 2010

http://www.sqlite.org/fts3.html#section_3

       SELECT * FROM docs WHERE docs MATCH 'lin*';

Возвращает документы, содержащие слово, начинающееся с "lin".Вы хотите только слова, которые соответствуют, а не контекст?Может быть, функция «фрагменты» поможет вам.И вы можете найти эту интересную ветку:

http://www.mail-archive.com/sqlite-users@sqlite.org/msg49345.html

0 голосов
/ 06 ноября 2013

документация для функции сниппета довольно расплывчата по своему 6-му параметру, поскольку алгоритм использует подход с наивысшей оценкой для поиска фрагмента.

Тем не менее, в моем заявлении я получаю чистый отрывок оригинальных терминов, которые ищу с запросом:

select snippet(docs,'','','', -1, 1) from docs where docs match 'e*';

Это может помочь в вашем случае; это решение в базе данных помогло мне, потому что я не хотел извлекать термины из кода, расположенного за пределами базы данных. Работает, если вы ищете отдельные слова (без пробела, ИЛИ, .. в запросе MATCH)

...