From: hernani Date: Thu, 20 May 2010 23:52:33 +0000 (+0000) Subject: Better search, mixing FTS and exact match and better related questions functionality. X-Git-Tag: live~821 X-Git-Url: https://git.openstreetmap.org./osqa.git/commitdiff_plain/eb5d07faf2fe743f482ba8b3168e083e4df29434 Better search, mixing FTS and exact match and better related questions functionality. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@310 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- diff --git a/forum/models/base.py b/forum/models/base.py index 276c8f6..827dfb2 100644 --- a/forum/models/base.py +++ b/forum/models/base.py @@ -54,8 +54,6 @@ class CachedQuerySet(models.query.QuerySet): if obj is None: obj = super(CachedQuerySet, self).get(*args, **kwargs) obj.__class__.objects.cache_obj(obj) - else: - d = obj.__dict__ return obj diff --git a/forum/skins/default/media/js/osqa.ask.js b/forum/skins/default/media/js/osqa.ask.js new file mode 100644 index 0000000..e5e8c20 --- /dev/null +++ b/forum/skins/default/media/js/osqa.ask.js @@ -0,0 +1,66 @@ +var currentSideBar = 'div#title_side_bar'; +function changeSideBar(enabled_bar) { + $(currentSideBar).hide(); + currentSideBar = enabled_bar; + $(currentSideBar).fadeIn('slow'); + +} +$(function () { + $('div#editor_side_bar').hide(); + $('div#tags_side_bar').hide(); + + $('input#id_title').focus(function(){changeSideBar('div#title_side_bar')}); + $('textarea#editor').focus(function(){changeSideBar('div#editor_side_bar')}); + $('input#id_tags').focus(function(){changeSideBar('div#tags_side_bar')}); +}); + +$(function() { + var $input = $('#id_title'); + var $box = $('#ask-related-questions'); + var template = $('#question-summary-template').html(); + + var results_cache = {}; + + function reload_suggestions_box(e) { + var q = $input.val().trim(); + + if (q.length == 0) { + $('#ask-related-questions').html(''); + return false; + } + + if (results_cache[q] && results_cache[q] != '') { + $('#ask-related-questions').html(results_cache[q]); + return false; + } + + $.post(related_questions_url, {title: q}, function(data) { + if (data) { + var c = $input.val().trim(); + + if (c != q) { + return; + } + + var html = ''; + for (var i = 0; i < data.length; i++) { + var item = template.replace(new RegExp('%URL%', 'g'), data[i].url) + .replace(new RegExp('%SCORE%', 'g'), data[i].score) + .replace(new RegExp('%TITLE%', 'g'), data[i].title) + .replace(new RegExp('%SUMMARY%', 'g'), data[i].summary); + + html += item; + + } + + results_cache[q] = html; + + $('#ask-related-questions').html(html); + } + }, 'json'); + + return false; + } + + $input.keyup(reload_suggestions_box); +}); \ No newline at end of file diff --git a/forum/skins/default/templates/ask.html b/forum/skins/default/templates/ask.html index ac393cd..8745331 100644 --- a/forum/skins/default/templates/ask.html +++ b/forum/skins/default/templates/ask.html @@ -16,7 +16,7 @@ + {% endblock %} {% block content %} diff --git a/forum/skins/default/templates/question_edit_tips.html b/forum/skins/default/templates/question_edit_tips.html index 3e72a1e..4ec5442 100644 --- a/forum/skins/default/templates/question_edit_tips.html +++ b/forum/skins/default/templates/question_edit_tips.html @@ -1,24 +1,5 @@ {% load i18n %} -{% block forejs %} - -{% endblock %}

{% trans "Title Tips" %}

diff --git a/forum_modules/pgfulltext/handlers.py b/forum_modules/pgfulltext/handlers.py index e1d98f2..6e2165b 100644 --- a/forum_modules/pgfulltext/handlers.py +++ b/forum_modules/pgfulltext/handlers.py @@ -1,15 +1,22 @@ +from django.db.models import Q from forum.models.question import Question, QuestionManager from forum.modules.decorators import decorate @decorate(QuestionManager.search, needs_origin=False) def question_search(self, keywords): return self.extra( - tables=['forum_rootnode_doc'], + tables = ['forum_rootnode_doc'], select={ - 'ranking': 'ts_rank_cd(\'{0.1, 0.2, 0.8, 1.0}\'::float4[], "forum_rootnode_doc"."document", plainto_tsquery(\'english\', %s), 32)', + 'ranking': """ + rank_exact_matches(ts_rank_cd('{0.1, 0.2, 0.8, 1.0}'::float4[], "forum_rootnode_doc"."document", plainto_tsquery('english', %s), 32)) + """, }, - where=['"forum_rootnode_doc"."node_id" = "forum_node"."id"', '"forum_rootnode_doc"."document" @@ plainto_tsquery(\'english\', %s)'], + where=[""" + "forum_rootnode_doc"."node_id" = "forum_node"."id" AND ("forum_rootnode_doc"."document" @@ plainto_tsquery('english', %s) OR + "forum_node"."title" ILIKE '""" + keywords + """%%') + """], params=[keywords], select_params=[keywords], order_by=['-ranking'] - ) \ No newline at end of file + ) + diff --git a/forum_modules/pgfulltext/pg_fts_install.sql b/forum_modules/pgfulltext/pg_fts_install.sql index ddc48a1..4161fd8 100644 --- a/forum_modules/pgfulltext/pg_fts_install.sql +++ b/forum_modules/pgfulltext/pg_fts_install.sql @@ -105,4 +105,15 @@ select case when public.doc_table_exists()=0 then public.build_doc_table()end; drop function build_doc_table(); drop function doc_table_exists(); +CREATE OR REPLACE FUNCTION rank_exact_matches(rank float) RETURNS float AS $$ +begin + IF rank = 0 THEN + return 1; + ELSE + return rank; + END IF; + +end +$$ LANGUAGE plpgsql; + UPDATE forum_noderevision SET id = id WHERE TRUE; diff --git a/forum_modules/pgfulltext/startup.py b/forum_modules/pgfulltext/startup.py index c7cd5ea..22f61a8 100644 --- a/forum_modules/pgfulltext/startup.py +++ b/forum_modules/pgfulltext/startup.py @@ -3,7 +3,7 @@ from forum.models import KeyValue from django.db import connection, transaction import settings -VERSION = 7 +VERSION = 8 if int(settings.PG_FTSTRIGGERS_VERSION) < VERSION: f = open(os.path.join(os.path.dirname(__file__), 'pg_fts_install.sql'), 'r')