Python Django:使用自定义搜索算法查询数据库
Context:我有一个房屋数据库,用户可以按位置名称查询(例如,“纽约州纽约市”或“旧金山第一街100号”)。除了每个对象的列表之外,我还使用GoogleMapsAPI在每个查询结果的地图上检索精确点。 我分别使用Django和Postgres作为我的框架和数据库 问题:我想知道如何按位置过滤Python Django:使用自定义搜索算法查询数据库,python,django,Python,Django,Context:我有一个房屋数据库,用户可以按位置名称查询(例如,“纽约州纽约市”或“旧金山第一街100号”)。除了每个对象的列表之外,我还使用GoogleMapsAPI在每个查询结果的地图上检索精确点。 我分别使用Django和Postgres作为我的框架和数据库 问题:我想知道如何按位置过滤房屋对象,但并非所有的位置查询都包含相同的信息(即,有些可能有房屋编号,有些可能有城市或州,有些可能没有) 如下面的代码所示,每个房屋对象都通过OneToOneField链接到包含必要字段的位置对象 每个
房屋
对象,但并非所有的位置查询都包含相同的信息(即,有些可能有房屋编号,有些可能有城市或州,有些可能没有)
如下面的代码所示,每个房屋
对象都通过OneToOneField链接到包含必要字段的位置
对象
每个Location
对象都由几个字段组成,而查询将是一个字符串,可能与Django的filter()
方法中使用的单个字段不匹配,这一事实也使问题变得复杂。诸如“旧金山第一街100号”之类的查询与任何单个位置
字段都不匹配,因为此查询由多个字段组成。如何编写排序算法来查找与所述给定查询匹配的任何对象
代码:
models.py:
class House(models.Model):
...
mapped_location = models.OneToOneField(Location, related_name='location_house')
...
class Location(models.Model):
...
name = models.CharField(...)
street_name = models.CharField(...)
city = models.CharField(...)
views.py:
def show_results(request):
House.objects.filter( ??? )
return render(request, 'results.html', context)
让我知道,如果我需要张贴更多的代码,谢谢 您通过请求传递查询字符串GET和逗号分隔字段,并分别检查每个字段到您的模型字段,您的
显示结果将如下所示:
from django.db.models import Q
def show_results(request):
q = request.GET.get('query')
results = []
for query in unquote(q).split(','):
query = query.strip()
results += list(House.objects.filter(Q(mapped_location__name=query) | Q(mapped_location__street_name=query) | Q(mapped_location__city=query)))
context['results'] = results
return render(request, 'results.html', context)
您在模板中使用变量results
获取结果。您通过请求传递查询字符串,使用逗号分隔的字段获取结果,并将每个字段分别检查到模型字段,您的显示结果将如下所示:
from django.db.models import Q
def show_results(request):
q = request.GET.get('query')
results = []
for query in unquote(q).split(','):
query = query.strip()
results += list(House.objects.filter(Q(mapped_location__name=query) | Q(mapped_location__street_name=query) | Q(mapped_location__city=query)))
context['results'] = results
return render(request, 'results.html', context)
您可以使用变量results
在模板中获得结果。第一步是标记搜索词,然后您可以基于各个部分构建查询。
标记化可能相当复杂,因此为了获得最佳结果,您可能希望从现有库开始,例如。谷歌搜索“python地址标记化”以获得其他选项
接下来,您可以使用以下命令在查询中使用这些部分:
(但是用标记器的结果替换上面的字符串常量)第一步是标记搜索词,然后可以基于各个部分构建查询。
标记化可能相当复杂,因此为了获得最佳结果,您可能希望从现有库开始,例如。谷歌搜索“python地址标记化”以获得其他选项
接下来,您可以使用以下命令在查询中使用这些部分:
(但是用标记器的结果替换上面的字符串常量)如果您要给用户提供免费、未经验证的自然语言输入机会,您需要查看一组不同的工具,即面向自然语言处理的工具
第一步是标记识别,破译输入字符串的哪些部分是街道号码、街道名称、城市、州等。这类似于词性分析,但语法不同
如果要考虑输入错误和不准确,下一步是“模糊匹配”,即使用levenshtein编辑距离或ngram分析等方法,在每个标记类型的“规范”值内找到“最佳”匹配
从那里,您可以查询数据库
重新关注您的实际问题,即如何减少未知的令牌组合,您可以选择通过某种接口或形式验证数据,或者采用上述的词性和nlp路径。如果您给用户提供免费、未验证的自然语言输入机会,您需要查看一组不同的工具,即面向自然语言处理的工具
第一步是标记识别,破译输入字符串的哪些部分是街道号码、街道名称、城市、州等。这类似于词性分析,但语法不同
如果要考虑输入错误和不准确,下一步是“模糊匹配”,即使用levenshtein编辑距离或ngram分析等方法,在每个标记类型的“规范”值内找到“最佳”匹配
从那里,您可以查询数据库
重新关注您的实际问题,即如何缓解未知的令牌组合,您可以选择通过某种接口或形式验证数据,或者采用上述词性和nlp路径