Используя функцию Левенштейна для каждого элемента в цветекторе?

Я пытаюсь создать нечеткий поиск с использованием Postgres и использую django-watson в качестве базовой поисковой системы для работы.

У меня есть поле с именем search_tsv, которое представляет собой tsvector, содержащий все значения полей модели, по которой я хочу искать.

Я хотел использовать функцию Левенштейна, которая делает именно то, что я хочу в текстовом поле. Тем не менее, я не знаю, как запустить его на каждом элементе tsvector.

Есть ли способ сделать это?

1 ответ

Я хотел бы рассмотреть возможность использования расширения pg_trgm вместо levenshtein(), Это на несколько порядков быстрее, если вы создадите резервную копию с помощью индекса GiST, который может использовать новую функцию KNN в PostgreSQL 9.1.

Установите расширение один раз для каждой базы данных:

CREATE EXTENSION pg_trgm;

И использовать <-> или же % оператор или similarity() функция Несколько хороших ответов уже опубликовано на SO, Search for pg_tgrm [PostgreSQL]...


Дикий выстрел в то, что вы можете хотеть:

WITH x AS (
    SELECT unnest(string_to_array(trim(strip(
      'fat:2,4 cat:3 rat:5A'::tsvector)::text, ''''), ''' ''')) AS val
    )                                    -- provide ts_vector, extract strings
    , y AS( SELECT 'brat'::text AS term) -- provide term to match
SELECT val, term
      ,(val <-> term) AS trg_dist        -- distance operator
      ,levenshtein(val, term) AS lev_dist
FROM   x, y;

Возвращает:

 val | term | trg_dist | lev_dist
-----+------+----------+----------
 cat | brat |    0.875 |        2
 fat | brat |    0.875 |        2
 rat | brat | 0.714286 |        1
Другие вопросы по тегам