Включить частичные совпадения в SQLite FTS3 Search - PullRequest
3 голосов
/ 01 июля 2011

Моя простая реализация SQLite FTS3 в настоящее время сопоставляет пользовательские запросы с сохраненными результатами и возвращает их, если эти результаты содержат все слова в пользовательском запросе (другими словами, таблица FTS была создана с использованием простого токенизатора).

Теперь я хочу сделать поиск более интеллектуальным в этом, я хочу, чтобы он ранжировал / упорядочивал результаты по количеству слов в запросе, которые соответствуют результатам.Например,

SELECT name FROM nametable WHERE name MATCH 'fast food restaurant'  

, который в настоящее время возвращает

SUBWAY FAST FOOD RESTAURANT
MCDONALDS FAST FOOD RESTAURANT

, должен вернуть

SUBWAY FAST FOOD RESTAURANT
MCDONALDS FAST FOOD RESTAURANT
CHIPOTLE FAST FOOD
PIZZA FAST FOOD
GOOD FOOD OUTLET

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

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

Ответы [ 2 ]

4 голосов
/ 15 февраля 2014

Проще всего сделать:

SELECT name FROM nametable WHERE name MATCH 'fast OR food OR restaurant'

Нет необходимости обрабатывать несколько запросов.

3 голосов
/ 01 июля 2011

Вот непроверенная идея.

SELECT name
FROM (
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'fast'
    UNION ALL
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'food'
    UNION ALL
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'restaurant'
  )
GROUP BY name
ORDER BY SUM(matched) DESC, name
...