Django全文搜索:TrigramDistance不工作

时间:2018-02-08 09:40:34

标签: django postgresql full-text-search

我正在使用Django 2.0和postgresql 9.6。

我在postgresql

中安装了pg_trgm扩展名

我试图理解三角星是如何工作的:我正在尝试以下方法。我想要更接近" sridam"使用triagram进行匹配

from django.contrib.postgres.search import TrigramDistance
from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
vector = SearchVector('title',config='english_unaccent', weight='A') + SearchVector('description',config='english_unaccent', weight='B')
query = SearchQuery('sridam',config='english_unaccent')
Article.objects.annotate(distance=TrigramDistance(vector, query)).filter(distance__lte=0.7).order_by('distance')


ProgrammingError: operator does not exist: tsvector <-> tsquery
LINE 1: ...SCE("articles_article"."description", '')), 'B')) <-> plaint...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

2 个答案:

答案 0 :(得分:0)

您无法计算SearchVectorSearchQuery之间的Trigram距离,因为&#34;三元组是一组三个连续的字符。&#34; < / em>的

根据Django documentation TrigramDistance &#34;中的规定,接受字段名称或表达式以及字符串或表达式。返回两个参数之间的Trigram距离。&#34;

答案 1 :(得分:0)

在使用postgres扩展之前,您必须将扩展迁移应用于模型。

解决方案1 ​​

制作空的迁移文件:

$array1 = getSomeBigArray();
$array2 = getAnotherBigArray();
combineArrays($array1, $array2);
$results[] = $array1;

function combineArrays(&$array1, $array2){

   foreach($array2 as $value){
      if($value > 0){
         $array1[] = $value;
      }
   }
   // void function
}

然后转到新的迁移文件并添加以下内容

python3 manage.py makemigrations --empty yourapp

最后运行from django.db import migrations from django.contrib.postgres.operations import TrigramExtension class Migration(migrations.Migration): operations = [ TrigramExtension() ] 以将迁移应用于数据库,您就可以使用扩展了。

解决方案2

您可以转到python3 manage.py migrate控制台并直接应用迁移:

psql