Поиск строки для последовательных несмежных символов в Postgres - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы повторить что-то вроде command-t или Sublime "Go to file" / CMD + P search in postgres.Где поиск соответствует последовательным, но не обязательно соседним символам.Вот так

enter image description here

Какой вид нечеткого поиска это называется?Если это невозможно в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...