src/ldt/ldt/indexation/__init__.py
author cavaliet
Fri, 03 Jan 2014 11:55:31 +0100
changeset 1278 9431920e7c98
parent 1275 38c396f3ced8
child 1300 7a638196577d
permissions -rw-r--r--
v1.52 : search engine for contents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
     1
import re
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
     2
import sys
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
     3
77
7923feb2e362 improve indexation
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.conf import settings
1117
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
     5
from haystack import connections
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
     6
from haystack.constants import DEFAULT_ALIAS
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
     7
from haystack.query import SearchQuerySet
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
     8
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
     9
from ldt.indexation.highlighter import LdtHighlighter as Highlighter
725
4f4005df9a97 improve indexation query language
ymh <ymh.work@gmail.com>
parents: 719
diff changeset
    10
from ldt.indexation.query_parser import QueryParser
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    11
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    12
from .backends import elasticsearch_backend as ldt_elasticsearch_backend
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    13
1117
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    14
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    15
def get_results_with_context(model, field, query, content_list=None, highlight=True):
568
b67fc0fd2389 small correction on indexation + version bum
ymh <ymh.work@gmail.com>
parents: 452
diff changeset
    16
    
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    17
    results = get_results_list(model, field, query, highlight)
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    18
    contexts = []
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    19
    content_iri_ids = None
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    20
    if content_list is not None :
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    21
        content_iri_ids = [ctt.iri_id for ctt in content_list]
594
bc018d2744f2 release indexer
ymh <ymh.work@gmail.com>
parents: 568
diff changeset
    22
            
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    23
    for res in results:
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    24
        doc = res.get_stored_fields()
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    25
        if content_iri_ids is None or (content_iri_ids is not None and doc.get("iri_id") in content_iri_ids) :
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    26
            doc["score"] = res.score
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    27
            doc["indexation_id"] = res.pk
1278
9431920e7c98 v1.52 : search engine for contents
cavaliet
parents: 1275
diff changeset
    28
            doc["context"] = doc.get("abstract", "")
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    29
            doc["highlighted"] = res.highlighted
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    30
            contexts.append(doc)
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    31
    return contexts
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    32
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    33
176
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
    34
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    35
def get_results_list(model, field, query, highlight=True):
1191
b6e0b1811723 Migrate to django 1.5 :
ymh <ymh.work@gmail.com>
parents: 1117
diff changeset
    36
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    37
    if field == 'all':
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    38
        field = 'text'
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    39
    
725
4f4005df9a97 improve indexation query language
ymh <ymh.work@gmail.com>
parents: 719
diff changeset
    40
    qp = QueryParser(field)
4f4005df9a97 improve indexation query language
ymh <ymh.work@gmail.com>
parents: 719
diff changeset
    41
    
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
    42
    qs = SearchQuerySet().models(model).filter(qp.parse(query))
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    43
    if highlight:
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    44
        qs = qs.highlight()
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    45
    return qs
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    46
    
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    47
        
176
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
    48
716
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
    49
def get_result_text(field, query):
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
    50
1191
b6e0b1811723 Migrate to django 1.5 :
ymh <ymh.work@gmail.com>
parents: 1117
diff changeset
    51
    #put import here to avoid a circular dependency
b6e0b1811723 Migrate to django 1.5 :
ymh <ymh.work@gmail.com>
parents: 1117
diff changeset
    52
    from ldt.text.models import Annotation
b6e0b1811723 Migrate to django 1.5 :
ymh <ymh.work@gmail.com>
parents: 1117
diff changeset
    53
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    54
    if field == 'all':
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    55
        field = 'text'
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    56
    elif field == 'text':
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    57
        field = 'text_field'
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    58
        
725
4f4005df9a97 improve indexation query language
ymh <ymh.work@gmail.com>
parents: 719
diff changeset
    59
    qp = QueryParser(field)        
4f4005df9a97 improve indexation query language
ymh <ymh.work@gmail.com>
parents: 719
diff changeset
    60
    qs = SearchQuerySet.models(Annotation).filter(qp.parse(query))
716
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
    61
    
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    62
    return [{'external_id':res.get_stored_fields()['external_id'], 'title': res.get_stored_fields()['title'], 'score': res.score} for res in qs] 
716
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
    63
    
452
8e9494006e7b segment abstracts + content images can be retrieved directly from search results page
verrierj
parents: 349
diff changeset
    64
def highlight_documents(results_list, query, field):
183
89334901b7c2 Improve search page
verrierj
parents: 176
diff changeset
    65
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    66
    highlight = Highlighter(query, html_tag="span", css_class="highlight", max_length=sys.maxint)    
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    67
    
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    68
    for project in results_list:
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    69
        for segment in project['list']:
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    70
            if hasattr(segment, "highlighted") and segment.highlighted:
719
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
    71
                #TODO :                 
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    72
                highlighted_text = {
719
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
    73
                     "context" : segment.highlighted.get('abstract',[segment.abstract])[0],
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
    74
                     "tags" : segment.highlighted.get('tags',[segment.tags])[0],
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
    75
                     'title' : segment.highlighted.get('title',[segment.title])[0],
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    76
                }
176
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
    77
718
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    78
            else:
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    79
                highlighted_text = {
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    80
                     "context" : highlight.highlight(segment.abstract),
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    81
                     "tags" : highlight.highlight(segment.tags),
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    82
                     'title' : highlight.highlight(segment.title)
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    83
                }
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    84
                
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    85
            segment.context = highlighted_text['context']
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    86
            segment.title = highlighted_text['title']
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    87
            tags = highlighted_text['tags']
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    88
            segment.context_tags = tags[tags.find(';')+1:]
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    89
                
5e27a39d3742 replace lucene by haystack, remove references to lucene
ymh <ymh.work@gmail.com>
parents: 716
diff changeset
    90
    return results_list
716
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
    91
1117
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    92
def object_delete(model, **kwargs):
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    93
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    94
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    95
    kwargs_filter = kwargs.copy()
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    96
    kwargs_filter.pop('using', None)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    97
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    98
    # here we do a poor man transaction management.
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
    99
    # the is no clear transaction management in Haystack.
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   100
    # therefore, we give priority to the database and delete there first.
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   101
    # if there is an error there, the index will not be updated.
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   102
      
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   103
    objs = list(model.objects.filter(**kwargs_filter))    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   104
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   105
    model.objects.filter(**kwargs_filter).delete()
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   106
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   107
    using = None
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   108
    if 'using' in kwargs:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   109
        using = kwargs.get('using', None)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   110
    if not using:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   111
        using = DEFAULT_ALIAS        
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   112
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   113
    conn = connections[using]
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   114
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   115
    if isinstance(conn, ldt_elasticsearch_backend.ElasticsearchSearchEngine):
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   116
        conn.get_backend().remove(objs, commit=True)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   117
    else:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   118
        for o in objs:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   119
            conn.get_backend().remove(o, commit=True)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   120
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   121
def object_insert(model, object_list, func_key, using = None):
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   122
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   123
    if not object_list:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   124
        return
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   125
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   126
    model.objects.bulk_create(object_list)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   127
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   128
    obj_dict = dict(model.objects.filter(**{func_key+'__in':[getattr(o, func_key) for o in object_list]}).values_list(func_key,"id"))
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   129
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   130
    for o in object_list:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   131
        o.id = obj_dict[getattr(o,func_key)]
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   132
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   133
    if not using:
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   134
        using = DEFAULT_ALIAS        
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   135
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   136
    conn = connections[using]
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   137
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   138
    backend = conn.get_backend()
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   139
    unified_index = conn.get_unified_index()
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   140
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   141
    index = unified_index.get_index(model)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   142
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   143
    backend.update(index, object_list)
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   144
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   145
    
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   146
3bab1e42acfa - update haystack
ymh <ymh.work@gmail.com>
parents: 725
diff changeset
   147
719
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   148
class SimpleSearch(object):
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   149
1275
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
   150
    def query(self, model, field, query):
38c396f3ced8 Add indexation to content
ymh <ymh.work@gmail.com>
parents: 1191
diff changeset
   151
        hits = get_results_list(model, field, query)
719
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   152
    
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   153
        res = []
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   154
        for hit in hits:
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   155
            res.append(hit.get_stored_fields())
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   156
        return res
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   157
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   158
    def query_all(self, query):        
1c0ac4068bbe improve highlighting management
ymh <ymh.work@gmail.com>
parents: 718
diff changeset
   159
        return self.query("all", query)
716
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
   160
31dc2726ca51 centralise les appel à lucene
ymh <ymh.work@gmail.com>
parents: 715
diff changeset
   161
715
f21459554182 Remove lucene dependancies in model
ymh <ymh.work@gmail.com>
parents: 602
diff changeset
   162
    
f21459554182 Remove lucene dependancies in model
ymh <ymh.work@gmail.com>
parents: 602
diff changeset
   163
    
176
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
   164
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
   165
a88714473302 Added a page to display search results
verrierj
parents: 142
diff changeset
   166