update - использовать нечеткое совпадение в django queryset filter




python queryset delete (2)

Есть ли способ использовать нечеткое сопоставление в фильтре запросов django?

Я ищу что-то по строкам Object.objects.filter (fuzzymatch (namevariable) __ gt = .9)

или есть способ использовать лямбда-функции или что-то подобное в django-запросах, и если да, то сколько это повлияет на время производительности (учитывая, что у меня есть стабильный набор из ~ 6000 объектов в моей базе данных, к которым я хочу сопоставить)

(понял, я должен, вероятно, поставить свои комментарии в вопросе)

Мне нужно что-то более сильное, чем содержит, что-то вроде линий difflib. Я в основном пытаюсь обойти объект Object.objects.all (), а затем понимание списка с нечетким соответствием.

(хотя я не уверен, что это будет намного медленнее, чем попытка фильтровать на основе функции, поэтому, если у вас есть мысли по этому поводу, я рад слушать)

Кроме того, хотя это не совсем то, что я хочу, я был бы открыт для каких-то токеновских противоположностей - таких как Object.objects.filter (['Virginia', 'Tech'] __ in = Object.name), где что-то как «Технический институт Вирджинии». Хотя и нечувствительный к регистру, предпочтительно.


Когда вы используете ORM, нужно понять, что все, что вы делаете, преобразуется в команды SQL, и это зависит от производительности базовых запросов в базовой базе данных. Дело в точке:

SELECT COUNT (*) ...

Это быстро? В зависимости от того, хранит ли ваша база данных какие-либо записи, чтобы предоставить вам эту информацию - MySQL / MyISAM делает , MySQL / InnoDB этого не делает . На английском языке - это один поиск в MYISAM и n в InnoDB.

Следующее - чтобы эффективно выполнять поиск по точному совпадению в SQL, вы должны сказать это, когда вы создаете таблицу, - вы не можете просто ожидать, что она это поймет. Для этой цели SQL имеет оператор INDEX - в django используйте db_index=True в параметрах поля вашей модели. Имейте в виду, что это добавляет к производительности записи (для создания индекса), и, очевидно, требуется дополнительное хранилище (для структуры данных), поэтому вы не можете « INDEX все вещи». Кроме того, я не думаю, что это поможет для нечеткого соответствия, но это все равно стоит заметить.

Следующее соображение - как мы выполняем нечеткое сопоставление в SQL? По-видимому, LIKE и CONTAINS позволяют выполнять определенное количество поиска и подстановочных результатов в SQL. Это ссылки T-SQL - перевести для вашего сервера базы данных :) Это можно сделать с помощью Model.objects.get(fieldname__contains=value) который будет производить LIKE SQL или аналогичный. Существует множество опций для различных поисков.

Это может быть или не быть достаточно мощным для вас - я не уверен.

Теперь, для большого вопроса: производительность. Скорее всего, если вы выполняете поиск, который SQL-сервер должен будет ударить по всем строкам в базе данных, не говорите об этом, но это будет моя ставка - даже при индексировании. С 6000 строк это может занять не так много времени; то опять же, если вы делаете это по принципу «за подключение к вашему приложению», это, вероятно, приведет к замедлению.

Следующее, что нужно знать об ORM: если вы это сделаете:

Model.objects.get(fieldname__contains=value)
Model.objects.get(fieldname__contains=value)

Вы выдадите два запроса на сервер базы данных. Другими словами, ORM не всегда .all() результаты - поэтому вы можете просто хотеть делать .all() и искать в памяти. Читайте о кешировании и запросах .

Далее на этой последней странице вы также увидите объекты Q - полезные для более сложных запросов.

Итак, в заключение:

  • SQL содержит некоторые базовые параметры с нечетким сопоставлением.
  • Независимо от того, достаточны они или нет, зависит от ваших потребностей.
  • Как они работают, зависит от вашего SQL-сервера - определите его .
  • Независимо от того, можете ли вы кэшировать эти результаты в памяти, зависит от того, насколько вероятен масштабирование - опять-таки, возможно, стоит измерить фиксацию памяти в результате - если вы можете делиться между экземплярами, и если кеш будет часто недействительным (если это будет, не сделай это).

В конечном счете, я начну с того, что вы начнете работать с нечетким соответствием, затем измерьте, затем настройте, а затем измерьте, пока не выясните, как повысить производительность. 99% этого я узнал, делая именно это :)








django-queryset