Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:使用自定义搜索算法查询数据库_Python_Django - Fatal编程技术网

Python Django:使用自定义搜索算法查询数据库

Python Django:使用自定义搜索算法查询数据库,python,django,Python,Django,Context:我有一个房屋数据库,用户可以按位置名称查询(例如,“纽约州纽约市”或“旧金山第一街100号”)。除了每个对象的列表之外,我还使用GoogleMapsAPI在每个查询结果的地图上检索精确点。 我分别使用Django和Postgres作为我的框架和数据库 问题:我想知道如何按位置过滤房屋对象,但并非所有的位置查询都包含相同的信息(即,有些可能有房屋编号,有些可能有城市或州,有些可能没有) 如下面的代码所示,每个房屋对象都通过OneToOneField链接到包含必要字段的位置对象 每个

Context:我有一个房屋数据库,用户可以按位置名称查询(例如,“纽约州纽约市”或“旧金山第一街100号”)。除了每个对象的列表之外,我还使用GoogleMapsAPI在每个查询结果的地图上检索精确点。 我分别使用Django和Postgres作为我的框架和数据库

问题:我想知道如何按位置过滤
房屋
对象,但并非所有的位置查询都包含相同的信息(即,有些可能有房屋编号,有些可能有城市或州,有些可能没有)

如下面的代码所示,每个
房屋
对象都通过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路径