简体   繁体   English

记录Django Haystack搜索关键字

[英]Logging Django Haystack search keyword

I have the following in my url.py: 我在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'),
...

It's working fine but I need to capture the search keyword to log it. 它工作正常,但我需要捕获搜索关键字来记录它。

How can I capture it? 我该如何捕捉它?

Your help would be appreciated. 非常感谢您的帮助。

I wanted to do something similar so I created an app named search 我想做类似的事情,所以我创建了一个名为search的应用程序

search/models.py 搜索/ 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 搜索/ urls.py

from django.conf.urls.defaults import *

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

then of course in my project urls I added the following rule: 当然,在我的项目网址中,我添加了以下规则:

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

search/views.py 搜索/ 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 so that only on the first page of search results, a SearchQuery is saved if 'page' not in request.GET那么只有在搜索结果的第一页上才会保存SearchQuery

each SearchQuery is unique in the DB. 每个SearchQuery在数据库中都是唯一的。

each SearchQuery for a SearchTerm is recorded with additional info such as user (nullable) and when the term was searched. 对于每个SEARCHTERM SEARCHQUERY记录有附加信息,如user (可为空的)和when该术语被搜寻。

view = SearchView() and return view(request) make it so that aftera a SearchQuery is recorded, the default haystack views get called for that request. view = SearchView()return view(request)使得在记录SearchQuery之后,会为该请求调用默认的haystack视图。

Probably the easiest solution is to subclass SearchView and use it instead in your urlpatterns. 可能最简单的解决方案是将SearchView子类化并在您的urlpatterns中使用它。

Haystack SearchView is unfortunately written in different manner than Django Class Based Views (probably because it was written before CBV were introduced to Django...), but it is very straightforward piece of code https://github.com/toastdriven/django-haystack/blob/master/haystack/views.py#L13 不幸的是,Haystack SearchView以不同于Django Class Based Views的方式编写(可能是因为它是在将CBV引入Django之前编写的......),但它是非常简单的代码片段https://github.com/toastdriven/django-草堆/斑点/主/草堆/ views.py#L13

Something like this should work: 这样的事情应该有效:

class LoggingSearchView(SearchView):

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

Haystack related saved_searches app allows storing a user's search history: Haystack相关的saved_searches应用程序允许存储用户的搜索历史:

https://github.com/toastdriven/saved_searches https://github.com/toastdriven/saved_searches

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM