Django Regex Field Lookup - Сортировка по количеству совпадений для каждого элемента в QuerySet - PullRequest
0 голосов
/ 17 декабря 2018

Я экспериментирую с базовым выражением регулярного выражения как способом выполнения операции фильтра Django.

Я хотел бы удалить любые незначительные слова из предоставленной строки запроса, поищите любые объекты с заголовками, содержащими любое изостальные слова, а затем сортировка, начиная с тех, которые содержат наибольшее количество слов.

Используя быстрый и упрощенный пример:

ignored_words = {'for', 'a', 'of', 'the', 'and', 'to', 'in'}

keywords = []
for word in query.split():
    if word not in ignored_words:
        keywords.append(word)

if len(keywords) > 0:
    regex_str = r'(' + '|'.join(keywords) + ')'
    results = MyModel.objects.filter(title__iregex=regex_str)
    # Now sort them...

Если моя строка запроса была 'Delicious Apples and Bananas', и у меня было три объектасо следующими названиями:

  • 'Apples'
  • 'Bananas'
  • 'Apples and Bananas'

Есть ли эффективный способ Iможно упорядочить результаты по количеству появлений ключевых слов?Точнее говоря, я не уверен, должен ли я выполнять какую-то операцию Count() при выполнении запросов или циклический просмотр результатов после этого, а затем выполнять какую-то дополнительную обработку регулярных выражений.

1 Ответ

0 голосов
/ 17 декабря 2018

В конце я выполнил операцию регулярного выражения над QuerySet после фильтра.

def get_keyword_matches(query, regex):
    compiler = re.compile(regex)
    result = compiler.findall(query)
    return len(result)

results = sorted(results, key=lambda my_object: get_keyword_matches(my_object.title.lower(), regex_str), reverse=True)

Однако, если есть более эффективный способ сделать это, я бы хотел услышать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...