124 lines
3.3 KiB
Python
124 lines
3.3 KiB
Python
try:
|
||
import settings_local
|
||
|
||
pg_fts_config = 'pg_catalog.russian' # 'public.mipp_fulltext'
|
||
except:
|
||
pg_fts_config = 'pg_catalog.russian'
|
||
|
||
from django.db import models
|
||
from django.contrib.postgres.search import Value, Func
|
||
import copy
|
||
|
||
|
||
# получаем из списка только слова содержащие цифры
|
||
def get_list_words_contains_nums(txt):
|
||
from .inter import numbers
|
||
|
||
if type(txt) == str:
|
||
words = txt.split(' ')
|
||
else:
|
||
words = txt
|
||
|
||
words_w_nums = []
|
||
|
||
# получаем слова с цифрами
|
||
res_words = []
|
||
|
||
for word in words:
|
||
i = 0
|
||
|
||
while i < len(word):
|
||
if word[i] in numbers:
|
||
res_words.append(word)
|
||
break
|
||
i += 1
|
||
|
||
return res_words
|
||
|
||
|
||
# получаем список слов с разделенными цифрами и текстом
|
||
def get_list_split_words_w_nums(txt):
|
||
from .inter import numbers
|
||
|
||
if type(txt) == str:
|
||
words = txt.split(' ')
|
||
else:
|
||
words = txt
|
||
|
||
# words_w_nums = []
|
||
|
||
# получаем слова с цифрами
|
||
words_w_devided_nums = []
|
||
for word in copy.copy(words):
|
||
|
||
i = 0
|
||
is_number = False
|
||
cut_piece_compete = False
|
||
|
||
while i < len(word):
|
||
if i == 0:
|
||
if word[i] in numbers:
|
||
is_number = True
|
||
else:
|
||
is_number = False
|
||
else:
|
||
if word[i] in numbers:
|
||
if not is_number:
|
||
cut_piece_compete = True
|
||
else:
|
||
if is_number:
|
||
cut_piece_compete = True
|
||
|
||
if cut_piece_compete:
|
||
cut_piece_compete = False
|
||
words_w_devided_nums.append(word[0:i])
|
||
|
||
# if is_number:
|
||
# words_w_nums.append(word[0:i])
|
||
|
||
word = word[i:]
|
||
i = 0
|
||
else:
|
||
i += 1
|
||
|
||
if i > 0:
|
||
words_w_devided_nums.append(word[0:i])
|
||
# if is_number:
|
||
# words_w_nums.append(word[0:i])
|
||
|
||
return words_w_devided_nums
|
||
|
||
|
||
class Headline(Func):
|
||
function = 'ts_headline'
|
||
|
||
def __init__(self, field, query, config=None, options=None, **extra):
|
||
expressions = [field, query]
|
||
if config:
|
||
expressions.insert(0, Value(config))
|
||
if options:
|
||
expressions.append(Value(options))
|
||
extra.setdefault('output_field', models.TextField())
|
||
super(Headline, self).__init__(*expressions, **extra)
|
||
|
||
|
||
def get_search_lexems_list(search_phrase):
|
||
from django.db import connection
|
||
search_lexems_list = None
|
||
|
||
cursor = connection.cursor()
|
||
cursor.execute("SET NAMES 'UTF8';")
|
||
# cursor.execute(u"SET CHARACTER SET 'utf8';")
|
||
# cursor.execute(u"SET character_set_connection='utf8';")
|
||
cursor.execute("SELECT plainto_tsquery('{1}', '{0}');".format(search_phrase, pg_fts_config))
|
||
search_lexems = cursor.fetchone()
|
||
s = search_lexems[0] # .decode('utf8')
|
||
|
||
if search_lexems:
|
||
search_lexems = s.replace('\\', '')
|
||
search_lexems = search_lexems.replace("'", '')
|
||
search_lexems = search_lexems.replace(" ", '')
|
||
search_lexems_list = search_lexems.split('&')
|
||
|
||
return search_lexems_list
|