Django Regex字段查找-按QuerySet中每个项目的匹配数排序

时间:2018-12-17 09:12:02

标签: python regex django

我正在尝试使用基本的regex表达式作为执行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'

有没有一种有效的方法可以按关键字出现的次数对结果进行排序?更具体地说,我不确定是否应该在查询时进行某种Count()操作,还是在之后遍历结果并进行其他正则表达式处理。

1 个答案:

答案 0 :(得分:0)

最后,我在过滤器之后对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)

但是,如果有一种更有效的方法,我很想听听。