2012-12-03 91 views
1

我想爲我的Django站點創建搜索功能。我遵循這個blog的教程。當我搜索關鍵字時,它不會輸出任何結果。我一直在努力做這項工作,但沒有成功。我怎樣才能使這項工作更好?Django站點中的搜索功能

型號:

class Finb(models.Model): 
    user=models.ForeignKey(User) 
    title=models.CharField(max_length=250, unique=True) 
    address=models.CharField(max_length=200) 
    city=models.CharField(max_length=200) 
    state=models.CharField(max_length=200) 
    guide=models.TextField(max_length=1000) 
    price=models.CharField(max_length=100) 
    main_view=models.ImageField(upload_to="photos",null=True, blank=True, help_text='Optional.') 
    side_view=models.ImageField(upload_to="photos",null=True, blank=True, help_text='Optional.') 
    pub_date=models.DateTimeField() 

    def __unicode__(self): 
     return u'%s %s %s %s %s %s %s %s %s %s' % (self.title,self.address,self.city,self.state,self.guide,self.price,self.main_view,self.side_view,self.user,self.pub_date) 
    @models.permalink 
    def get_absolute_url(self): 
     return ('meekapp.views.cripdetail',(),{'finb_id': self.id}) 

Form.py

import re 

from django.db.models import Q 

def normalize_query(query_string, 
        findterms=re.compile(r'"([^"]+)"|(\S+)').findall, 
        normspace=re.compile(r'\s{2,}').sub): 
''' Splits the query string in invidual keywords, getting rid of unecessary spaces 
    and grouping quoted words together. 
    Example: 

    >>> normalize_query(' some random words "with quotes " and spaces') 
    ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] 

''' 
return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] 

def get_query(query_string, search_fields): 
''' Returns a query, that is a combination of Q objects. That combination 
    aims to search keywords within a model by testing the given search fields. 

''' 
    query = None # Query to search for every search term   
    terms = normalize_query(query_string) 
    for term in terms: 
     or_query = None # Query to search for a given term in each field 
     for field_name in search_fields: 
      q = Q(**{"%s__icontains" % field_name: term}) 
      if or_query is None: 
       or_query = q 
      else: 
       or_query = or_query | q 
     if query is None: 
      query = or_query 
     else: 
      query = query & or_query 
    return query  

查看

def search(request): 
    query_string = '' 
    found_entries = None 
    if ('q' in request.GET) and request.GET['q'].strip(): 
     query_string = request.GET['q'] 

     entry_query = get_query(query_string, ['title',]) 

    found_entries = Finb.objects.filter(entry_query).order_by('-pub_date') 
    for result in found_entries: 
     print result.title 
     return render_to_response('search_results.html', 
         { 'query_string': query_string, 'found_entries': found_entries, 'result':result }, 
         context_instance=RequestContext(request)) 

模板:

{% block content %} 
    <div id="searchbody" class="wrapper"> 
    <div class="search-fed">  
     <form method="get" action="."> 
    <label for="search"> </label> <input type="text" class="sfield" name="q" max_length="100" /> 
    <input type="submit" class="searchput" value="Find" />   
     </form> 
    </div> 
    <span class="step-links"> 
     {% if query %} 
     <h3>Your Search Results</h3> 
    {% for result in found_entries %} 

    <p> 
     <p> <strong> <a href="{% url cripdetail result.object.id %}" >{{ result.title }}</a> </strong> </p> 

    </p> 
    {% empty %} 
     <p>No results found.</p> 
    {% endfor %} 

    {% endif %} 
{% endblock %} 

如果這看起來不整齊,有沒有更好的方法來解決這個問題?

回答

2

爲什麼不使用現有的python/django包進行搜索?

草堆可以照顧這個給你,讓你只需用搜索and搜索後端的選擇的配置(Solr的,elasticsearch,..)

+0

我用用乾草堆嗖嗖。它在我的開發服務器上工作正常,但是當我搜索關鍵字時,它會在我的生產服務器上發生錯誤。我不知道爲什麼。 – picomon

+0

@picomon那麼它應該是某種錯誤的配置,我認爲修復一些配置比滾動自己的全文搜索實現更快:) –