1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from django.db import connection, transaction
import os, settings
import re
from django.db import connection, transaction, models
from django.db.models import Q
from forum.models.question import Question, QuestionManager
from forum.models.node import Node
from forum.modules import decorate
VERSION = 4
f_name = None
if not bool(settings.MYSQL_FTS_INSTALLED):
f_name = os.path.join(os.path.dirname(__file__), 'fts_install.sql')
elif int(settings.MYSQL_FTS_VERSION < VERSION):
f_name = os.path.join(os.path.dirname(__file__), 'fts_update.sql')
if f_name:
f = open(f_name, 'r')
try:
cursor = connection.cursor()
cursor.execute(f.read())
transaction.commit_unless_managed()
settings.MYSQL_FTS_INSTALLED.set_value(True)
settings.MYSQL_FTS_VERSION.set_value(VERSION)
except Exception, e:
#import sys, traceback
#traceback.print_exc(file=sys.stdout)
pass
finally:
cursor.close()
f.close()
word_re = re.compile(r'\w+', re.UNICODE)
@decorate(QuestionManager.search, needs_origin=False)
def question_search(self, keywords):
keywords = keywords.upper()
qs = self.filter(
models.Q(ftsindex__body__isnull=False)
).extra(
select={
'ranking': """
match(forum_mysqlftsindex.tagnames) against (%s) * 2 +
match(forum_mysqlftsindex.title) against (%s) * 4 +
match(forum_mysqlftsindex.body) against (%s) * 1
""",
},
select_params=[keywords, keywords, keywords]
).filter(Q(ftsindex__title__search=keywords) | Q(ftsindex__tagnames__search=keywords) | Q(ftsindex__body__search=keywords))
return '-ranking', qs