Как использовать полнотекстовый поиск в базе данных sqlite3 в Django?

python django sqlite full-text-search

3263 просмотра

2 ответа

Я работаю над приложением django с базой данных sqlite3, которое имеет фиксированное содержимое базы данных. Под фиксированным я подразумеваю, что содержание БД не будет меняться со временем. Модель примерно такая:

class QScript(models.Model):
    ch_no = models.IntegerField()
    v_no = models.IntegerField()
    v = models.TextField()

В таблице около 6500 записей. Учитывая текст, в котором могут отсутствовать некоторые слова или некоторые слова с ошибками, мне нужно определить его ch_noи v_no. Например, если в базе данных есть vполе с текстом «Это пример стиха» , то такой текст, как «Это пример стиха», должен дать мне ch_noи v_noиз базы данных. Я думаю, это можно сделать с помощью полнотекстового поиска.

Мои запросы:

  1. может ли полнотекстовый поиск сделать это? Мое предположение из того, что я изучил, может, как сказано на странице sqlite3 : полнотекстовый поиск - это «то, что Google, Yahoo и Bing делают с документами, размещенными в World Wide Web» . Цитируется в SO, я прочитал эту статью , тоже, наряду со многими другими, но не нашел ничего , что близко соответствует моим требованиям.

  2. Как использовать FTS в моделях Django? Я прочитал это, но это не помогло. Это кажется слишком устаревшим. Прочитайте здесь, что: «... требуется прямое манипулирование базой данных для добавления полнотекстового индекса» . Поиск дает в основном информацию, связанную с MySQL, но мне нужно сделать это в sqlite3. Так как же сделать эту прямую манипуляцию в sqlite3?


Редактировать:

Является ли мой выбор придерживаться sqlite3 правильно? Или я должен использовать что-то другое (например, стог сена +asticsearch, как сказал Алексей Морозов )? Мой БД не будет расти больше, и я изучил, что для небольших БД sqlite почти всегда лучше (моя ситуация совпадает с четвертой в sqlite, когда использовать контрольный список ).

Автор: Sнаđошƒаӽ Источник Размещён: 16.10.2019 12:52

Ответы (2)


1 плюс

Решение

Я думаю, что хотя sqlite - удивительное программное обеспечение, его возможности полнотекстового поиска весьма ограничены. Вместо этого вы можете проиндексировать свою базу данных с помощью приложения Haystack Django с некоторым бэкэндом, например Elasticsearch . Такая настройка (и возможность доступа к базе данных sqlite) кажется мне наиболее надежным и гибким способом с точки зрения FTS.

Elasticsearch имеет нечеткий поиск, основанный на расстоянии Левенштейна (в двух словах, он будет обрабатывать ваши «примерные» запросы). Так что все, что вам нужно, это сделать правильный тип запроса:

from haystack.forms import SearchForm
from haystack.generic_views import SearchView
from haystack import indexes


class QScriptIndex(indexes.SearchIndex, indexes.Indexable):
    v = indexes.CharField(document=True)

    def get_model(self):
        return QScript


class QScriptSearchForm(SearchForm):
    text_fuzzy = forms.CharField(required=False)    

    def search(self):        
        sqs = super(QScriptSearchForm, self).search()

        if not self.is_valid():
            return self.no_query_found()

        text_fuzzy = self.cleaned_data.get('text_fuzzy')
        if text_fuzzy:
            sqs = sqs.filter(text__fuzzy=text_fuzzy)

        return sqs


class QScriptSearchView(SearchView):        
    form_class = QScriptSearchForm

Обновление: Пока PostgreSQL имеет функцию расстояния Левенштейна, вы также можете использовать ее как бэкэнд Haystack, а также как автономную поисковую систему. Если вы выберете второй способ, вам придется реализовать собственное выражение запроса , что относительно просто, если вы используете последнюю версию Django.

Автор: Alex Morozov Размещён: 26.01.2016 07:23

2 плюса

Механизм FTS в SQLite основан на токенах - ключевых словах, которым поисковая система пытается соответствовать.

Доступны различные токенизаторы, но они относительно просты. «Простой» токенайзер просто разбивает каждое слово и ставит его в нижнем регистре: например, в строке «Быстрая коричневая лиса перепрыгивает через ленивую собаку» слово «прыжки» будет соответствовать, но не «прыгать». Токенизатор «портера» немного более продвинутый, он удаляет спряжения слов, так что «прыжки» и «прыжки» совпадают, но опечатка, подобная «jmups», не подходит.

Короче говоря, расширение SQLite FTS является довольно простым и не должно конкурировать, скажем, с Google.

Что касается интеграции с Django, я не верю, что она есть. Скорее всего, вам потребуется использовать интерфейс Django для необработанных SQL-запросов , как для создания, так и для запроса таблицы FTS.

Автор: Colonel Thirty Two Размещён: 26.01.2016 11:03
Вопросы из категории :
32x32