Gérer les chaînes littérales dans la génération d'extraits.
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 1 Dec 2010 22:04:53 +0000 (17:04 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 1 Dec 2010 22:04:53 +0000 (17:04 -0500)
Demande #607

auf_savoirs_en_partage/savoirs/lib/recherche.py
auf_savoirs_en_partage/savoirs/models.py

index eda784f..d096e05 100644 (file)
@@ -192,13 +192,28 @@ def build_search_regexp(query):
         parts.append(part)
     return re.compile('|'.join(parts), re.I) 
 
+EXACT_PHRASE_RE = re.compile(r'"([^"]*?)"')
 def excerpt_function(manager, words):
     """Construit une fonction qui extrait la partie pertinente d'un texte
        suite à une recherche textuelle."""
     qs = manager.get_sphinx_query_set()
     client = qs._get_sphinx_client()
     index = qs._index
+    phrases = EXACT_PHRASE_RE.findall(words)
+    keywords = EXACT_PHRASE_RE.sub('', words).strip()
+
     def excerpt(text):
-        return mark_safe(client.BuildExcerpts([text], index, words)[0])
+        # On essaie de gérer à peu près correctement les phrases exactes. La
+        # vraie solution serait d'utiliser Sphinx 1.10 beta1 et son option
+        # "query_mode", mais c'est plus de trouble. Peut-être plus tard?
+        excerpt = text
+        for phrase in phrases:
+            excerpt = client.BuildExcerpts([excerpt], index, phrase, 
+                                           opts=dict(exact_phrase=True, limit=500, single_passage=True))[0]
+        if keywords:
+            excerpt = client.BuildExcerpts([excerpt], index, keywords, 
+                                           opts=dict(limit=500, single_passage=True))[0]
+        return mark_safe(excerpt)
+
     return excerpt
 
index b62c7d2..2732f68 100644 (file)
@@ -53,6 +53,13 @@ class SEPSphinxQuerySet(SphinxQuerySet, RandomQuerySetMixin):
 
     def add_to_query(self, query):
         """Ajoute une partie à la requête texte."""
+
+        # Assurons-nous qu'il y a un nombre pair de guillemets
+        if query.count('"') % 2 != 0:
+            # Sinon, on enlève le dernier (faut choisir...)
+            i = query.rindex('"')
+            query = query[:i] + query[i+1:]
+
         new_query = smart_unicode(self._query) + ' ' + query if self._query else query
         return self.query(new_query)