Я хотел бы повторить что-то вроде command-t или Sublime "Go to file" / CMD + P
search in postgres.Где поиск соответствует последовательным, но не обязательно соседним символам.Вот так
Какой вид нечеткого поиска это называется?Если это невозможно в postgres, возможно ли это вasticsearch или в другой БД?
? Желаемый вывод
Например, учитывая, что ваш запрос был "doc", я ожидал бы следующий порядок:
doc
d***o***c
d***oo**c
dpc
dppc
d***p***c
d
asdf
a
Обновление
Использование ilike
with documents(title) as (
values
('d***o***c'),
('d***p***c'),
('d'),
('a'),
('dppc'),
('d***oo**c'),
('asdf'),
('dpc'),
('doc')
) select *
from documents
where title ilike '%d%o%c%';
?Актуальный вывод
Не порядок для сходства.С индексом триграммы на title
и 700 тыс. Строк около 30 мс.
title
-----------
d***o***c
d***oo**c
doc
Использование сходства
select title, similarity(title, 'doc') as sml
from documents
where similarity(title, 'doc') > 0
order by sml desc
limit 50;
ctФактический вывод
Не ставит приоритеты непоследовательным буквам.С индексом триграмм на title
и 700 тыс. Строк около 30 мс
title | sml
-----------+----------
doc | 1
d | 0.2
dpc | 0.142857
dppc | 0.125
d***o***c | 0.111111
d***p***c | 0.111111
d***oo**c | 0.1
Использование Левенштейна
Распределяет приоритеты последовательных букв.С индексом btree на title
и 700 тыс. Строк около 89 мс
select levenshtein(title, 'doc', 30, 1, 60), title
from documents
where levenshtein(title, 'doc', 30, 1, 60) <= 500
order by levenshtein(title, 'doc', 30, 1, 60)
limit 50;
? Фактический результат
levenshtein | title
-------------+-----------
0 | doc
6 | d***o***c
6 | d***oo**c
31 | dpc
32 | dppc
37 | d***p***c
60 | d
63 | asdf
91 | a
(9 rows)
Мои \timing
результаты не особенно надежны, так как они колебались до 3секунд на моем местном 16 ГБ 2,5 ГГц четырехъядерном процессоре, но они могут помочь для относительных оценок.
В целом levenshtein
был единственным, который дал желаемые результаты, но имел тенденцию быть намного медленнее, иногда в 5 раз медленнее, чем другие методы.Я не смог увидеть индексы, которые могли бы помочь с методом levenshtein
.