Fixed #593 -- Added 'search' DB-API lookup type, which does full-text index searches in MySQL

git-svn-id: http://code.djangoproject.com/svn/django/trunk@3073 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-06-03 23:28:24 +00:00
parent 142e59b462
commit 168429d597
10 changed files with 31 additions and 1 deletions

View File

@ -125,6 +125,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "RAND()" return "RAND()"
def get_fulltext_search_sql(field_name):
raise NotImplementedError
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "DROP CONSTRAINT" return "DROP CONSTRAINT"

View File

@ -33,5 +33,6 @@ get_date_extract_sql = complain
get_date_trunc_sql = complain get_date_trunc_sql = complain
get_limit_offset_sql = complain get_limit_offset_sql = complain
get_random_function_sql = complain get_random_function_sql = complain
get_fulltext_search_sql = complain
get_drop_foreignkey_sql = complain get_drop_foreignkey_sql = complain
OPERATOR_MAPPING = {} OPERATOR_MAPPING = {}

View File

@ -152,6 +152,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "RAND()" return "RAND()"
def get_fulltext_search_sql(field_name):
return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "DROP FOREIGN KEY" return "DROP FOREIGN KEY"

View File

@ -108,6 +108,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "DBMS_RANDOM.RANDOM" return "DBMS_RANDOM.RANDOM"
def get_fulltext_search_sql(field_name):
raise NotImplementedError
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "DROP FOREIGN KEY" return "DROP FOREIGN KEY"

View File

@ -102,6 +102,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "RANDOM()" return "RANDOM()"
def get_fulltext_search_sql(field_name):
raise NotImplementedError
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "DROP CONSTRAINT" return "DROP CONSTRAINT"

View File

@ -108,6 +108,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "RANDOM()" return "RANDOM()"
def get_fulltext_search_sql(field_name):
raise NotImplementedError
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "DROP CONSTRAINT" return "DROP CONSTRAINT"

View File

@ -124,6 +124,9 @@ def get_limit_offset_sql(limit, offset=None):
def get_random_function_sql(): def get_random_function_sql():
return "RANDOM()" return "RANDOM()"
def get_fulltext_search_sql(field_name):
raise NotImplementedError
def get_drop_foreignkey_sql(): def get_drop_foreignkey_sql():
return "" return ""

View File

@ -162,7 +162,7 @@ class Field(object):
def get_db_prep_lookup(self, lookup_type, value): def get_db_prep_lookup(self, lookup_type, value):
"Returns field's value prepared for database lookup." "Returns field's value prepared for database lookup."
if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day'): if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'ne', 'year', 'month', 'day', 'search'):
return [value] return [value]
elif lookup_type in ('range', 'in'): elif lookup_type in ('range', 'in'):
return value return value

View File

@ -615,6 +615,8 @@ def get_where_clause(lookup_type, table_prefix, field_name, value):
return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name) return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name)
elif lookup_type == 'isnull': elif lookup_type == 'isnull':
return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or '')) return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
elif lookup_type == 'search':
return backend.get_fulltext_search_sql(table_prefix + field_name)
raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type) raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
def get_cached_row(klass, row, index_start): def get_cached_row(klass, row, index_start):

View File

@ -1035,6 +1035,15 @@ SQL equivalent::
SELECT ... WHERE pub_date IS NULL; SELECT ... WHERE pub_date IS NULL;
search
~~~~~~
A boolean full-text search, taking advantage of full-text indexing. This is
like ``contains`` but is significantly faster due to full-text indexing.
Note this is only available in MySQL and requires direct manipulation of the
database to add the full-text index.
Default lookups are exact Default lookups are exact
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~