记录Django Haystack搜索关键词

3 投票
3 回答
1332 浏览
提问于 2025-04-17 16:48

我在我的url.py文件里有以下内容:

from haystack.forms import HighlightedModelSearchForm
from haystack.query import SearchQuerySet
from haystack.views import SearchView
from articles.models import Article

article_sqs = SearchQuerySet().models(Article)

urlpatterns = patterns('',
    ...
    url(r'^article/search/$', SearchView(
        template='articles/search/results.html',
        searchqueryset=article_sqs,
        results_per_page=10,
        form_class=HighlightedModelSearchForm
    ), name='haystack_search'),
...

这个运行得很好,但我需要记录搜索的关键词。

我该怎么做才能捕捉到这个关键词呢?

谢谢你的帮助!

3 个回答

2

Haystack 相关的 saved_searches 应用可以用来保存用户的搜索历史:

https://github.com/toastdriven/saved_searches

5

最简单的解决办法就是创建一个新的类,继承自 SearchView,然后在你的网址配置中使用这个新的类。

不过,Haystack 的 SearchView 写法和 Django 的基于类的视图(Class Based Views)不太一样(可能是因为它是在 Django 引入基于类的视图之前写的……),但这段代码其实很简单明了,具体可以参考这个链接 https://github.com/toastdriven/django-haystack/blob/master/haystack/views.py#L13

你可以试试下面这样的代码:

class LoggingSearchView(SearchView):

    def create_response(self):
        logger.info(self.query)  #or log self.query as you like
        return super(LoggingSearchView, self).create_response()
7

我想做一些类似的事情,所以我创建了一个叫search的应用。

search/models.py

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _

class SearchTerm(models.Model):
    query = models.CharField(
        verbose_name = _(u'Search Term'),
        max_length = 255,
        default = None
    )

class SearchQuery(models.Model):
    term = models.ForeignKey(
        SearchTerm
    )
    user = models.ForeignKey(
        User,
        blank = True, 
        null = True,
    )
    when = models.DateTimeField(
        verbose_name = _(u'Date Searched'),
    )

search/urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^search/', 'search.views.search', name="search"),
)

然后当然在我的项目的URL配置中,我添加了以下规则:

url(r'^', include('search.urls')),

search/views.py

from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render, redirect
from haystack.forms import ModelSearchForm, SearchForm
from haystack.views import SearchView
from search.models import SearchQuery, SearchTerm
import datetime

def search(request):
    if 'page' not in request.GET :
        try :
            st, created = SearchTerm.objects.get_or_create(query=request.GET['q'])
            sq = SearchQuery()
            sq.term = st
            sq.user = request.user
            sq.when = datetime.datetime.now()
            sq.save()
        except :
            pass

    view = SearchView()
    return view(request)

我设置了一个条件if 'page' not in request.GET,这样只有在搜索结果的第一页时,才会保存一个搜索查询。

每个搜索查询在数据库中都是独一无二的。

每个搜索查询都会记录与搜索词相关的额外信息,比如user(可以为空)和when(搜索这个词的时间)。

view = SearchView()return view(request)的作用是,在记录完搜索查询后,会调用默认的haystack视图来处理这个请求。

撰写回答