Django:文本搜索:Haystack vs postgres 全文搜索
Django: text search: Haystack vs postgres full text search
我正在使用 Django 2.0
我有标题和描述的帖子。我第一次尝试实现搜索功能。
我搜索了以下选项后发现:
Haystack 和 postgres 全文搜索 (https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/search/)
建议使用哪个。
我可以建议在 Django 中使用 PostgreSQL 全文搜索。
官方文档还是不错的
如果您想了解我的建议的更多信息和动机,您可以阅读我写的一篇关于这个主题的文章:使用 PostgreSQL 在 Django 中进行全文搜索
仅供参考,SearchVector/SearchQuery 方法实际上并不能捕获所有情况,例如部分单词(参见 https://www.fusionbox.com/blog/detail/partial-word-search-with-postgres-full-text-search-in-django/632/ 以供参考)。根据您的限制,您可以毫不费力地实现自己的。
例如,在视图集的 get_queryset 方法中:
...other params...
search_terms = self.request.GET.get('q')
if search_terms:
# remove possible other delimiters and other chars
# that could interfere
cleaned_terms = re.sub(r'[!\'()|&;,]', ' ', search_terms).strip()
if cleaned_terms:
# Check against all the params we want
# apply to previous terms' filtered results
q = reduce(
lambda p, n: p & n,
map(
lambda word:
Q(your_property__icontains=word) | Q(
second_property__icontains=word) | Q(
third_property__icontains=word)
cleaned_terms.split()
)
)
qs = YourModel.objects.filter(q)
return qs
我正在使用 Django 2.0
我有标题和描述的帖子。我第一次尝试实现搜索功能。
我搜索了以下选项后发现:
Haystack 和 postgres 全文搜索 (https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/search/)
建议使用哪个。
我可以建议在 Django 中使用 PostgreSQL 全文搜索。
官方文档还是不错的
如果您想了解我的建议的更多信息和动机,您可以阅读我写的一篇关于这个主题的文章:使用 PostgreSQL 在 Django 中进行全文搜索
仅供参考,SearchVector/SearchQuery 方法实际上并不能捕获所有情况,例如部分单词(参见 https://www.fusionbox.com/blog/detail/partial-word-search-with-postgres-full-text-search-in-django/632/ 以供参考)。根据您的限制,您可以毫不费力地实现自己的。 例如,在视图集的 get_queryset 方法中:
...other params...
search_terms = self.request.GET.get('q')
if search_terms:
# remove possible other delimiters and other chars
# that could interfere
cleaned_terms = re.sub(r'[!\'()|&;,]', ' ', search_terms).strip()
if cleaned_terms:
# Check against all the params we want
# apply to previous terms' filtered results
q = reduce(
lambda p, n: p & n,
map(
lambda word:
Q(your_property__icontains=word) | Q(
second_property__icontains=word) | Q(
third_property__icontains=word)
cleaned_terms.split()
)
)
qs = YourModel.objects.filter(q)
return qs