From 68ea1dc5c18123df0c9b0508c30e388e47021191 Mon Sep 17 00:00:00 2001 From: mathieu Date: Mon, 11 Apr 2016 16:00:00 +0200 Subject: [PATCH] Autocompletion partiel + validation traduction Former-commit-id: f5f757c6ca3c1b4699e479280b140390fb417921 --- app/sandbox/settings.py | 3 ++- env/index.env | 2 +- telemeta/forms/haystack_form.py | 2 +- telemeta/search_indexes.py | 2 ++ telemeta/templates/telemeta/home.html | 2 +- telemeta/util/backend.py | 15 +++++++++++++++ telemeta/views/search.py | 6 +++--- 7 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 telemeta/util/backend.py diff --git a/app/sandbox/settings.py b/app/sandbox/settings.py index c31f79c7..822b655d 100644 --- a/app/sandbox/settings.py +++ b/app/sandbox/settings.py @@ -302,7 +302,8 @@ from worker import app HAYSTACK_CONNECTIONS = { 'default': { - 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', + #'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', + 'ENGINE': 'telemeta.util.backend.CustomElasticEngine', 'URL': 'http://search:9200/', 'INDEX_NAME': 'haystack', 'INLUDE_SPELLING': True, diff --git a/env/index.env b/env/index.env index 0452bec4..ff58cf33 100644 --- a/env/index.env +++ b/env/index.env @@ -1 +1 @@ -REINDEX=False +REINDEX=True diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index ef96ef0a..449d4a62 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -175,7 +175,7 @@ class HayAdvanceForm(SearchForm): return self.no_query_found() if self.cleaned_data.get('q'): - sqs = sqs.filter(title__contains=self.cleaned_data['q']) + sqs = sqs.filter(title__exact=self.cleaned_data['q']) if self.cleaned_data.get('code'): sqs = sqs.filter(code__contains=self.cleaned_data['code']) diff --git a/telemeta/search_indexes.py b/telemeta/search_indexes.py index 44031478..1480a9ce 100644 --- a/telemeta/search_indexes.py +++ b/telemeta/search_indexes.py @@ -34,6 +34,7 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') + title_auto = indexes.NgramField(model_attr='title') code = indexes.CharField(model_attr='code', default='') location_principal = indexes.CharField(null='None', boost=1.05) location_relation = indexes.CharField() @@ -105,6 +106,7 @@ class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') + title_auto = indexes.NgramField(model_attr='title') code = indexes.CharField(model_attr='code', default='') location_principal = indexes.CharField(default='', boost=1.05) location_relation = indexes.CharField() diff --git a/telemeta/templates/telemeta/home.html b/telemeta/templates/telemeta/home.html index 38564a39..1a4b7ebc 100644 --- a/telemeta/templates/telemeta/home.html +++ b/telemeta/templates/telemeta/home.html @@ -10,7 +10,7 @@
- +
diff --git a/telemeta/util/backend.py b/telemeta/util/backend.py new file mode 100644 index 00000000..1bb26c8b --- /dev/null +++ b/telemeta/util/backend.py @@ -0,0 +1,15 @@ +from haystack.backends.elasticsearch_backend import * + +class CustomElasticBackend(ElasticsearchSearchBackend): + + def setup(self): + FIELD_MAPPINGS.get('ngram')['search_analyzer']='startspacelower' + eb = super(CustomElasticBackend, self) + eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['startspacelower']={"type":"pattern", "pattern":"^\\s+", "filter": ["lowercase"]} + ngram = eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer').get('ngram_analyzer') + ngram['tokenizer']='keyword' + ngram.get('filter').insert(0, 'trim') + eb.setup() + +class CustomElasticEngine(ElasticsearchSearchEngine): + backend = CustomElasticBackend diff --git a/telemeta/views/search.py b/telemeta/views/search.py index 3ec7a79e..01271cb9 100644 --- a/telemeta/views/search.py +++ b/telemeta/views/search.py @@ -165,13 +165,13 @@ def autocomplete(request): sqs = SearchQuerySet().load_all() print(type) if request.GET.get('attr', '') == "q": - sqs = sqs.filter(title__contains=request.GET.get('q', ''))[:5] + sqs = sqs.filter(title_auto__exact=request.GET.get('q', ''))[:10] suggestions = [result.title for result in sqs] elif request.GET.get('attr', '') == "location": - sqs = sqs.filter(location_principal__contains=request.GET.get('q', ''))[:5] + sqs = sqs.filter(location_principal__contains=request.GET.get('q', ''))[:10] suggestions = [result.location_principal for result in sqs] elif request.GET.get('attr', '') == "code": - sqs = sqs.filter(code__contains=request.GET.get('q', ''))[:5] + sqs = sqs.filter(code__contains=request.GET.get('q', ''))[:10] suggestions = [result.code for result in sqs] else: suggestions = [] -- 2.39.5