【问题标题】:Dynamic search like stackoverflow for django动态搜索,如 django 的 stackoverflow
【发布时间】:2017-09-10 03:11:07
【问题描述】:

有谁知道哪个插件(使用 Django)是最好的来处理像 StackOverflow 这样的动态搜索?某事like this:

<input type="text" value="how to [django] or [python] duplicate:yes is:answer" style="width: 50%">

我只考虑复杂的查询。

query = request.GET.get('q')

text_query = # what regex here?
tags_query = # 
is_duplicate = re.search(r'(?P<duplicate>\w+)', query)

Question.objects.filter(...)
Answer.objects.filter(...)

【问题讨论】:

  • 不需要插件。使用正则表达式可以相对容易地处理它。您是在问如何处理上述查询作为示例?
  • @Jonathan 啊是的......你能提供一个例子吗?一些如何找到text_query = 'how to' 和其他..

标签: python django search django-queryset


【解决方案1】:
query = "how to [django] or [python] or [mu] duplicate:yes is:answer"

tags = re.search(r'\[(\w+)\](( or \[(\w+)\])+)?', query)
colons = re.findall(r'\w+:\w+', query)

search = query.replace(tags.group(), '')
for colon in colons:
    search = search.replace(colon, '')

print(search) # how to

然后您可以分别处理标签和冒号以进行查询。

如果您想在问题数据库中搜索搜索查询中的所有术语,您可以执行以下操作。它将找到包含所有搜索词的所有文本。

search = search.split()

db_query = Q(text__icontains=search[0])
for term in search[1:]:
    db_query = db_query | Q(text__icontains=term)

Question.objects.filter(db_query)

【讨论】:

  • 2 或 3 个查询怎么样?例如:query = "left side [django] or [python] or [mu] duplicate:yes is:answer right side",所以在这里我们得到了'left side''right side'.. 如果我按照你的回答我得到了'left side right side' (带有空格)。如何一一识别'left side right side'
  • @sanca 右边有什么语义吗?如果您在 stackoverflow 中进行查询,则无关紧要。它将搜索包含 left side right side 的条目
  • @SancaKembang 我更新了更多关于查询在数据库方面的外观的答案。
  • 嗯,我明白了.. 我认为如果使用像title__icontains='left side right side' 这样的全文并不完美,应该是title__icontains='left side'title__icontains='right side'.. 像这样picture 这样@的结果987654322@
  • search.split() 的输出是['how', 'to', 'right', 'side']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2019-01-26
相关资源
最近更新 更多