使用Django和Postgres,我有一个投资持有模型,如下所示:
class Holding(BaseModel):
name = models.CharField(max_length=255, db_index=True)
symbol = models.CharField(max_length=16, db_index=True)
fund_codes = ArrayField(models.CharField(max_length=16), blank=True, default=list)
...
其中包含大约70,000美元/加拿大股权,共同基金的列表。我想建立一个自动完成搜索功能,优先考虑1) symbol
或fund_codes
的精确匹配排名,然后是2)在symbol
上的接近匹配,然后3)持有name
的全文搜索。
如果我有一个向symbol
和fund_codes
添加更多权重的搜索向量
from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank
from django.db.models import F, Func, Value
vector = SearchVector('name', weight='D') + \
SearchVector('symbol', weight='A') + \
SearchVector(Func(F('fund_codes'), Value(' '), function='array_to_string'), weight='A')
然后,搜索“MA”
Investment.objects \
.annotate(document=vector, rank=SearchRank(vector, query)) \
.filter(document__icontains='MA') \
.order_by('-rank') \
.values_list('name', 'fund_codes', 'symbol', 'rank',)
没有给出我想要的结果。我需要MA (万事达卡)作为首选列表,然后MAS (Masco公司),等等…然后是在name
字段中包含'MA‘的列表。
我还研究了如何通过以下方式覆盖SearchQuery
:
class MySearchQuery(SearchQuery):
def as_sql(self, compiler, connection):
params = [self.value]
if self.config:
config_sql, config_params = compiler.compile(self.config)
template = 'to_tsquery({}::regconfig, %s)'.format(config_sql)
params = config_params + [self.value]
else:
template = 'to_tsquery(%s)'
if self.invert:
template = '!!({})'.format(template)
return template, params
但仍然得不到我想要的结果。对于如何在此用例中实现搜索功能,有什么建议吗?也许可以将精确的搜索查询和全文搜索查询连接起来?
https://stackoverflow.com/questions/55479316
复制相似问题