![](/img/trans.png)
[英]Modern practical option for Django search with Postgres? Need multiple criteria, but icontains is too inefficient
[英]django icontains to search postgres database
我目前有一个Django应用程序和postgres数据库。 我想要一个允许用户输入值的搜索栏,它将搜索模型的某些字段以搜索匹配的值。 我希望即使对于“”值也可以使用。 我目前有:
MyModel.objects.filter(myfield__icontains=search_query).order_by(...)
我将如何做到这一点,以便它可以同时搜索模型的多个字段。 这样做最有效的方法是什么? 这样“包含”可以吗?
任何帮助将不胜感激!
您可以使用Q
搜索多个字段,例如:
您要搜索的字段:
field0
field1
field2
Django搜索代码:
from django.db.models import Q
search_result = MyModel.objects.filter(
Q(field0_icontains=search_query) |
Q(field1_icontains=search_query) |
Q(field2_icontains=search_query)
).order_by(...)
不建议通过常规的过滤器查询和icontains
来执行此操作,因为它很快会变得效率低下-您当然不希望在多个大型文本字段上执行此操作。
但是,PostgreSQL附带了一个全文搜索引擎 ,正是出于这个目的而设计的。 Django 为此提供支持 。
您可以定义SearchVector
以便一次对多个字段执行全文搜索,例如:
from django.contrib.postgres.search import SearchVector
MyModel.objects.annotate(
search=SearchVector('field_1') + SearchVector('field_2'),
).filter(search='search_query')
我链接到的文档提供了许多有关如何对搜索结果进行排名等其他信息。
另一种选择是使用像Elasticsearch这样的搜索引擎-是否必要取决于您有多少个对象以及需要对结果进行什么样的筛选和排名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.