我遇到了一个问题,希望有人可以启发我。
我需要在具有多列的表上执行全文搜索,并使用Django 2和PostgreSQL 10.1按排名对结果进行排序。 到目前为止,这是我的代码:
from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
# other unrelated stuff here
vector = SearchVector("very_important_field", weight="A") + \
SearchVector("tags", weight="A") + \
SearchVector("also_important_field", weight="B") + \
SearchVector("not_so_important_field", weight="C") + \
SearchVector("not_important_field", weight="D")
query = SearchQuery(search_string, config="italian")
rank = SearchRank(vector, query, weights=[0.4, 0.6, 0.8, 1.0]). # D, C, B, A
full_text_search_qs = MyEntry.objects.annotate(rank=rank).filter(rank__gte=0.4).order_by("-rank")
奇怪的是,有些search_string不会返回任何结果,而如果我执行简单的查询,例如
SELECT * FROM my_entry
WHERE very_important_field LIKE '%search_string%'
OR tags LIKE '%search_string%'
OR ...
如果我将搜索限制在重要字段,我也会得到大量结果。 我已经尝试使用过滤器(rank_gte = 0.4)并删除它。结果还是一样。
到目前为止,我还没有使用GIN o GIST索引,因为我只是在试验。
关于我缺少什么的任何线索? 提前致谢
答案 0 :(得分:0)
我想我发现了问题。
SearchQuery()
上的关键字参数config='italian'
似乎没有用。为了解决这个问题,我在我的db上发布了:
ALTER DATABASE my_db SET default_text_search_config = 'pg_catalog.italian';
现在一切都很好。
我希望这也可以帮助别人。