2017-08-30 52 views
0

我試圖用django-haystack(2.6.0)和solr(4.10.4)來實現兩個字段的搜索。我想通過ship名稱或船名搜索我的模型country(返回來自給定國家的船舶列表),但在這裏,如果我使用document=True定義了一個字段,則會出現問題,但我得不到結果。 我休息了documentation和這個answer,它看起來相當簡單。Django-Haystack文本字段返回空白行「 n n」

我創建了以下search_indexes.py

class ShipListIndex(indexes.SearchIndex, indexes.Indexable): 
text = indexes.CharField(document=True, use_template=True) 

def get_model(self): 
    return ShipList 

def index_queryset(self, using=None): 
    return self.get_model().objects.all() 

和我創造了我的應用程序內一個新的模板,它指定在搜索中使用的所有字段:

search/indexes/myapp/shiplist_text.txt 

{{ objects.ship }} 
{{ objects.country }} 

所以這裏是我的型號:

class ShipList(models.Model): 
    ship = models.CharField(max_length=200) 
    country = models.CharField(max_length=200) 
    region = models.CharField(max_length=250, blank=True) 
    city = models.CharField(max_length=250, blank=True) 
    ship_class = models.CharField(max_length=200, blank=True) 
    ship_type = models.CharField(max_length=200, blank=True) 
    remarks = models.CharField(max_length=200, blank=True) 
    url = models.URLField(max_length=200) 
    slug = models.SlugField() 

和視圖:

def ship_search(request): 
    results = None 
    cd = None 
    form = SearchForm() 
    if 'query' in request.GET: 
     form = SearchForm(request.GET) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      results = SearchQuerySet().models(ShipList).filter(content=cd['query']).load_all() 

    return render(request, 
       'core/draft/search.html', 
       {'form': form, 
       'results': results, 
       'cd': cd}) 

簡單的模板

{% block search %} 
{% if "query" in request.GET %} 
{% for result in results %} 
    {% with ship=result.object %} 
     <p>{{ ship.ship }}</p> 
     <p><a href="{{ ship.get_absolute_url }}">{{ ship.ship }}</a></p> 
    {% endwith %} 
{% empty %} 
    <p>There are no results for your query.</p> 
{% endfor %} 

{% else %} 
<h1>Search for posts</h1> 
<form action="." method="get"> 
    {{ form.as_p }} 
    <input type="submit" value="Search"> 
</form> 
{% endif %} 
{% endblock %} 

所以後來我檢查Solr的接口http://127.0.0.1:8983/solr/#/myapp/query的JSON響應:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 2 
    }, 
    "response": { 
    "numFound": 11, 
    "start": 0, 
    "docs": [ 
     { 
     "django_ct": "core.shiplist", 
     "id": "core.shiplist.1", 
     "django_id": "1", 
     "text": "\n\n" 
     }, 
     { 
     "django_ct": "core.shiplist", 
     "id": "core.shiplist.2", 
     "django_id": "2", 
     "text": "\n\n" 
     }, 
     { 
     "django_ct": "core.shiplist", 
     "id": "core.shiplist.3", 
     "django_id": "3", 
     "text": "\n\n" 
    ] 
    } 
} 

所以這是存儲每個船在搜索索引中的數據 和我發現文本字段包含"\n\n

我猜這裏的問題也許它應該是這樣的:

"text": "USS Arizona\nUnited States" 

到目前爲止,我試圖創造search_indexs.py不use_template

class ShipListIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, model_attr='ship') 

    def get_model(self): 
     return ShipList 

,它的工作很好,我可以用船名搜索並且查詢輸出是正確的。

 { 
     "id": "core.shiplist.5", 
     "django_ct": "core.shiplist", 
     "django_id": "5", 
     "text": "USS Arizona" 
     }, 

,最後我solrconfig.xml中

<?xml version="1.0" encoding="utf-8" ?> 
<config> 
<luceneMatchVersion>LUCENE_36</luceneMatchVersion> 
<requestHandler name="/select" class="solr.StandardRequestHandler" 
default="true" /> 
<requestHandler name="/update" class="solr.UpdateRequestHandler" /> 
<requestHandler name="/admin" class="solr.admin.AdminHandlers" /> 
<requestHandler name="/admin/ping" class="solr.PingRequestHandler"> 
<lst name="invariants"> 
<str name="qt">search</str> 
<str name="q">*:*</str> 
</lst> 
</requestHandler> 
</config> 

很顯然,我失去了一些東西或者我不明白它是如何工作的?

+1

你確定要'{object * s * .property}'而不是'{object.property}'嗎?你連接的答案使用單數形式.. – MatsLindh

+0

乾杯隊友!現在它工作正常。 – casol

回答

0

在你的模板搜索領域應該如何形成的:

search/indexes/myapp/shiplist_text.txt 

{{ objects.ship }} 
{{ objects.country }} 

..你(末尾有多個)引用objects。正確的名稱是object,沒有額外的s

{{ object.ship }} 
{{ object.country }} 

額外\ n您所看到的是在文件末尾的換行符。保存它沒有,你也可以避免在你的價值結束時多加一個\ n。不過,它對於可搜索性並不重要。