Неточный полнотекстовый поиск в PostgreSQL и Django - PullRequest
5 голосов
/ 19 апреля 2011

Я новичок в PostgreSQL, и я не уверен, что делать с неточным полнотекстовым поиском. Не то чтобы это имело большое значение, но я использую Django. Другими словами, я ищу что-то вроде следующего:

q = 'hello world'
queryset = Entry.objects.extra(
    where=['body_tsv @@ plainto_tsquery(%s)'], 
    params=[q])
for entry in queryset:
    print entry.title

где I список записей должен содержать либо «hello world», либо что-то подобное. Затем списки должны быть упорядочены в соответствии с тем, насколько далеко их значение находится от указанной строки. Например, я хотел бы, чтобы запрос включал записи, содержащие «Hello World», «hEllo world», «helloworld», «hell world» и т. Д., С некоторым ранжированием, указывающим, насколько далеко каждый элемент находится от идеального, неизменная строка запроса.

Как бы вы поступили так?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Лучше всего использовать Django raw наборы запросов , я использую его с MySQL для выполнения полнотекстового сопоставления. Если все данные находятся в базе данных, а Postgres предоставляет возможность сопоставления, то имеет смысл использовать их. Плюс Postgres предлагает некоторые действительно полезные вещи с точки зрения постановки и т.д. с полнотекстовыми запросами.

По сути, он позволяет вам написать фактический запрос, который вы хотите, но возвращает модели (если вы явно запрашиваете таблицу моделей).

Это дает вам преимущество в том, что вы можете протестировать точный запрос , который вы будете использовать первым в Postgres, документация довольно хорошо охватывает полнотекстовые запросы.

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


«Неточное» соответствие, однако, на самом деле не является частью возможностей полнотекстового поиска. Вместо этого вам нужен модуль postgres fuzzystrmatch contrib. Его использование описано здесь с индексами.

1 голос
/ 19 апреля 2011

Лучше всего использовать поисковую систему для этой цели. Django-haystack поддерживает интеграцию трех разных поисковых систем.

...