From ba7266544a6d9bdabef3483aaa5c5669ff1e88c6 Mon Sep 17 00:00:00 2001 From: mathieu Date: Thu, 28 Apr 2016 14:58:11 +0200 Subject: [PATCH] Amelioration recherche avancee Amelioration mapping ES Modif filtres haystack_form Fix tri numerises Fix liste autocompletion collecteurs ( plus repetition + separation ;ESPACE ) --- .gitignore | 1 + env/debug.env | 2 +- telemeta/forms/haystack_form.py | 4 +-- telemeta/search_indexes.py | 13 +++++---- telemeta/templates/search/advanceSearch.html | 28 +++++++++++++++++++- telemeta/util/backend.py | 11 +++++--- telemeta/views/search.py | 19 +++++++++---- 7 files changed, 61 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 09c020dd..ec980f2d 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ pip-log.txt .mr.developer.cfg .idea/* +data/backup diff --git a/env/debug.env b/env/debug.env index 7a9fbbcc..a19e3477 100644 --- a/env/debug.env +++ b/env/debug.env @@ -18,4 +18,4 @@ BROKER_URL=redis://broker:6379/0 # If this is True, all tasks will be executed locally by blocking until the task returns. CELERY_ALWAYS_EAGER=False -REINDEX=True +REINDEX=False diff --git a/telemeta/forms/haystack_form.py b/telemeta/forms/haystack_form.py index ceace2d8..cd47006f 100644 --- a/telemeta/forms/haystack_form.py +++ b/telemeta/forms/haystack_form.py @@ -167,7 +167,7 @@ class HayAdvanceForm(SearchForm): term = queryTerms.pop(0) if term == "ET" or term == "OU": if valeur != "": - sqTab.append(('instruments__contains', valeur.strip())) + sqTab.append(('instruments__startswith', valeur.strip())) valeur = "" if term != operateur: sqTab = [SQ(filtre) for filtre in sqTab] @@ -182,7 +182,7 @@ class HayAdvanceForm(SearchForm): else: valeur += term + " " if valeur != "": - sqTab.append(('instruments__contains', valeur.strip())) + sqTab.append(('instruments__startswith', valeur.strip())) sqTab = [SQ(filtre) for filtre in sqTab] return SQ(reduce(operator.and_, sqTab) if operateur == "ET" else reduce(operator.or_, sqTab)) diff --git a/telemeta/search_indexes.py b/telemeta/search_indexes.py index ff8d4df5..fc7475ae 100644 --- a/telemeta/search_indexes.py +++ b/telemeta/search_indexes.py @@ -20,6 +20,9 @@ from haystack import indexes from telemeta.models import * +class KeywordField(indexes.CharField): + field_type = 'keyword' + class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) @@ -33,7 +36,7 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') - code = indexes.CharField(model_attr='code', default='') + code = KeywordField(model_attr='code', default='') location_principal = indexes.CharField(null='None', boost=1.05) location_relation = indexes.CharField() ethnic_group = indexes.CharField(model_attr='ethnic_group', default='') @@ -88,7 +91,7 @@ class MediaItemIndex(indexes.SearchIndex, indexes.Indexable): collectors = [] collectors.append(obj.collection.collector) collectors.append(obj.collector) - return u"".join(' ' + collector for collector in collectors) + return u"".join('; ' + collector for collector in collectors) class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): @@ -104,7 +107,7 @@ class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') - code = indexes.CharField(model_attr='code', default='') + code = KeywordField(model_attr='code', default='') location_principal = indexes.CharField(default='', boost=1.05) location_relation = indexes.CharField() ethnic_group = indexes.CharField(default='') @@ -186,7 +189,7 @@ class MediaCorpusIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') - code = indexes.CharField(model_attr='code', default='') + code = KeywordField(model_attr='code', default='') #location_principal = indexes.CharField(default='', boost=1.05) #location_relation = indexes.CharField() #ethnic_group = indexes.CharField(default='') @@ -216,7 +219,7 @@ class MediaFondsIndex(indexes.SearchIndex, indexes.Indexable): #advance search title = indexes.CharField(model_attr='title') - code = indexes.CharField(model_attr='code', default='') + code = KeywordField(model_attr='code', default='') #location_principal = indexes.CharField(default='', boost=1.05) #location_relation = indexes.CharField() #ethnic_group = indexes.CharField(default='') diff --git a/telemeta/templates/search/advanceSearch.html b/telemeta/templates/search/advanceSearch.html index 3c2d03a2..52a2519d 100644 --- a/telemeta/templates/search/advanceSearch.html +++ b/telemeta/templates/search/advanceSearch.html @@ -307,6 +307,7 @@ $(function() { selecteur.each(function () { var self = this; $(this).autocomplete({ + minLength: 3, source: function (requete, reponse) { $.ajax({ url: '/search/autocomplete/', @@ -327,9 +328,34 @@ $(function() { activerAutocompletion($('#id_code, #id_instruments, #id_collectors')); + + $.tablesorter.addParser({ + id: 'numerised', + is:function (s) { + return false; + }, + format: function(s, table, cell){ + var _class = $(cell).find('center span').attr('class'); + _class = _class == undefined ? 1 : 0 + alert(_class); + return _class; + }, + type: 'number' + }); + $.tablesorter.defaults.sortList = [[1,0]]; - $("#searchtable").tablesorter({headers: {0:{sorter:false}, 2:{sorter:false}}} ); + $("#searchtable").tablesorter({ + debug: true, + + headers: { + + 0:{sorter:false}, + 2: {sorter: 'numerised'} + } + + }); + $('#dialog').dialog({ autoOpen: false, diff --git a/telemeta/util/backend.py b/telemeta/util/backend.py index 374bd19c..17e542b7 100644 --- a/telemeta/util/backend.py +++ b/telemeta/util/backend.py @@ -5,10 +5,15 @@ from haystack.backends.elasticsearch_backend import * class CustomElasticBackend(ElasticsearchSearchBackend): def setup(self): - DEFAULT_FIELD_MAPPING['analyzer']='snowball_asciifolding_analyzer' + DEFAULT_FIELD_MAPPING['analyzer']='whitespace_asciifolding_analyzer' + FIELD_MAPPINGS['keyword'] = {'type': 'string', 'analyzer':'lowercase_analyzer'} eb = super(CustomElasticBackend, self) - eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['snowball_asciifolding_analyzer']=\ - {"type": "custom", "tokenizer": "letter", "filter": ["lowercase", "stop", "asciifolding"]} + eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('tokenizer')['esc_scape_tokenizer']=\ + {"type": "pattern", "pattern": "\\s|\\|"} + eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['whitespace_asciifolding_analyzer']=\ + {"type": "custom", "tokenizer": "esc_scape_tokenizer", "filter": ["lowercase", "word_delimiter", "asciifolding"]} + eb.DEFAULT_SETTINGS.get('settings').get('analysis').get('analyzer')['lowercase_analyzer'] = \ + {"type": "custom", "tokenizer": "keyword", "filter": ["lowercase"]} eb.setup() diff --git a/telemeta/views/search.py b/telemeta/views/search.py index 10801655..37d21efd 100644 --- a/telemeta/views/search.py +++ b/telemeta/views/search.py @@ -165,7 +165,7 @@ class HaystackAdvanceSearch(SavedSearchView): def autocomplete(request): sqs = SearchQuerySet().load_all() if request.GET.get('attr', '') == "instruments": - sqs = sqs.filter(instruments__contains=request.GET.get('q', ''))[:10] + sqs = sqs.filter(instruments__startswith=request.GET.get('q', '')) instrus = [result.instruments for result in sqs] suggestions = [] for chaine in instrus: @@ -173,16 +173,25 @@ def autocomplete(request): if word != "" and escapeAccentAndLower(request.GET.get('q', '')) in escapeAccentAndLower(word): suggestions.append(word) elif request.GET.get('attr', '') == "code": - sqs = sqs.filter(code__contains=request.GET.get('q', ''))[:10] + sqs = sqs.filter(code__contains=request.GET.get('q', '')) suggestions = [result.code for result in sqs] elif request.GET.get('attr', '') == "collectors": - sqs = sqs.filter(collectors__startswith=request.GET.get('q', ''))[:10] - suggestions = [result.collectors for result in sqs] + sqs = sqs.filter(collectors__startswith=request.GET.get('q', '')) + collecteurs = [result.collectors for result in sqs] + suggestions = [] + for chaine in collecteurs: + for word in chaine.split('; '): + if word != "" and escapeAccentAndLower(request.GET.get('q', '')) in escapeAccentAndLower(word): + suggestions.append(word) else: suggestions = [] - suggestions = list(set(suggestions)) + if request.GET.get('attr', '') != 'code': + suggestions = list(set([word.strip().lower().title() for word in suggestions])) + else: + suggestions = list(set(suggestions)) + suggestions.sort() the_data = json.dumps({ 'results': suggestions -- 2.39.5