2017-04-21 6 views
0

検索干し草の山:改善する方法の速度は、私は単純なデータ構造のための私のDjangoの環境で検索エンジンを作成したい

| id   | comapany name | 
|:-----------|-----------------:| 
| 12345678 | company A's name | 
| 12345687 | peoples pizza a/s| 
| 87654321 | sub's for pugs | 

について80万企業があるでしょうし、私だけで検索します名。 名前が見つかると、私のdjangoにIDが返されます。

私はhaystack、whooshなどでさまざまなセットアップを試みましたが、テストデータセットを500から800,000に上げると、検索結果が遅くなります。 検索に何時間かかかりますほとんど1時間です。

私はPaas Herokuを使用しているので、私は統合有料サービス(searchedのelasticsearchの実装)を試みると思った。これは助けになりましたが、私は約80,000社に到達すると、それは再び本当に遅くなり始めます。

インストール済みのアプリ

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 

    # Added. 
    'haystack', 

    # Then your usual apps... 
] 

もっとsettings.py

import os 
from urlparse import urlparse 

es = urlparse(os.environ.get('SEARCHBOX_URL') or 'http://127.0.0.1:9200/') 

port = es.port or 80 

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
     'URL': es.scheme + '://' + es.hostname + ':' + str(port), 
     'INDEX_NAME': 'documents', 
    }, 


if es.username: 
    HAYSTACK_CONNECTIONS['default']['KWARGS'] = {"http_auth": es.username + ':' + es.password} 

search_indexes.py

from haystack import indexes 

from hello.models import Article 


class ArticleIndex(indexes.SearchIndex, indexes.Indexable): 
    ''' 
    defines the model for the serach Engine. 
    ''' 
    text = indexes.CharField(document=True, use_template=True) 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 
    # pub_date line was commented out previously 
    content_auto = indexes.EdgeNgramField(model_attr='title') 

    def get_model(self): 
     return Article 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

article_text.txt

{{ object.title }} 
{{ object.user.get_full_name }} 
{{ object.body }} 

urls.py

url(r'^search/$', views.search_titles, name='search'), 

views.py

def search_titles(request): 
    txt = request.POST.get('search_text', '') 
    if txt and len(txt) >= 4: 
     articles = SearchQuerySet().autocomplete(content_auto=txt) 
    # if the post request is empty, return nothing 
    # this prevents internal server error with jquery 
    else: 
     articles = [] 
    return render_to_response('scripts/ajax_search.html', 
           {'articles': articles}) 

search.htmlの

(iは、検索エンジンを呼び出す)
{% if articles.count > 0 %} 
    <!-- simply prints the links to the cvr numbers--> 
    <!-- for article in articles --> 
    {% for article in "x"|rjust:"15" %} 
     <li><a href="{{ article.object.get_absolute_url }}">{{ article.object.title }}</a></li> 
    {% endfor %} 

{% else %} 

    <li>Try again, or try CVR + &#x23ce;</li> 

{% endif %} 

index.htmlを

{% csrf_token %} 
<input type="text" id="search" name="search" /> 

<!-- This <ul> all company names end up--> 
<ul id ="search-results"></ul> 

答えて

0

私は自分のves.py searcを変更しましたhメソッドへ:

txt = request.POST.get('search_text', '') 
articles = [] 
suggestedSearchTerm = "" 
if txt and len(txt) >= 4: 
    sqs = SearchQuerySet() 
    sqs.query.set_limits(low=0, high=8) 
    sqs = sqs.filter(content=txt) 
    articles = sqs.query.get_results() 
    suggestedSearchTerm = SearchQuerySet().spelling_suggestion(txt) 
    if suggestedSearchTerm == txt: 
     suggestedSearchTerm = '' 
    else: 
     suggestedSearchTerm = suggestedSearchTerm.lower() 
関連する問題