PostgreSQL TSVector的django字段实现。

django-tsvector-field的Python项目详细描述


PackageBuildTest Coverage

django tsvector字段

django tsvector字段是django的替换项 django.contrib.postgres.search.SearchVectorField字段,用于管理 使搜索字段在中自动更新的数据库触发器 背景。

安装

python 3+django 1.11+psycopg2是唯一的要求。

使用您喜爱的python工具安装django tsvector field,例如pip install django-tsvector-field

您有两个选项可以将其集成到项目中:

  1. 只需将tsvector_field添加到INSTALLED_APPS并开始使用它。这种方法 使用django的pre_migrate信号将数据库操作注入 你的迁徙。这对于许多用例来说都是很好的。

    但是,如果您有未分级的应用程序,则会遇到此方法的问题。 或者您已经为单元测试禁用了迁移。问题是相关的 Django没有为那些 没有显式迁移。

  2. 创建自己的数据库引擎模块是一种不那么简单但更可靠的方法 引用tsvector_field.DatabaseSchemaEditor。这将确保 为所有迁移方法可靠地创建和删除数据库触发器。

    __init__.py和^{tt9}在django项目中创建一个'db'目录$ 包含以下内容:

    fromdjango.db.backends.postgresqlimportbaseimporttsvector_fieldclassDatabaseWrapper(base.DatabaseWrapper):SchemaEditorClass=tsvector_field.DatabaseSchemaEditor

    然后更新DATABASES设置中的'ENGINE'配置。例如, 如果您的项目名为my_project,并且它具有所述的db模块 在上面,然后将DATABASE设置更改为具有以下'ENGINE'配置:

    DATABASES={'default':{'ENGINE':'my_project.db',}}

使用量

tsvector_field.SearchVectorField的工作方式与任何其他django字段类似:将其添加到模型中, 运行makemigrations,运行migrate,并且tsvector_field将注意创建 Postgres触发器和存储过程。

为了说明这是如何工作的,我们将使用 tsvector_field.SearchVectorField字段和两个文本字段用作 全文搜索的输入。

fromdjango.dbimportmodelsimporttsvector_fieldclassTextDocument(models.Model):title=models.CharField(max_length=128)body=models.TextField()search=tsvector_field.SearchVectorField([tsvector_field.WeightedColumn('title','A'),tsvector_field.WeightedColumn('body','D'),],'english')

迁移后,您可以创建一些TextDocument记录并查看 Postgres在后台保持同步。具体来说,因为 search字段在数据库级别更新,您需要调用refresh_from_db() 查看.save().create()之后的新值。

>>>doc=TextDocument.objects.create(...title="My hovercraft is full of spam.",...body="It's what eels love!"...)>>>doc.search>>>doc.refresh_from_db()>>>doc.search"'eel':10 'full':4A 'hovercraft':2A 'love':11 'spam':6A"

注意spam是用6A录制的,这在以后会很重要。让我们 继续上一个会话并创建另一个文档。

>>>doc=TextDocument.objects.create(...title="What do eels eat?",...body="Spam, spam, spam, they love spam!"...)>>>doc.refresh_from_db()>>>doc.search"'eat':4A 'eel':3A 'love':9 'spam':5,6,7,10"

现在我们有两个文档:第一个文档只有一个带权重的spam和 第二个文档的4spam权重较低。如果我们搜索spam并应用 搜索排名,然后第一个文档上的A权重将导致该文档 在结果中显示得更高。

>>>fromdjango.contrib.postgres.searchimportSearchQuery,SearchRank>>>fromdjango.db.models.expressionsimportF>>>matches=TextDocument.objects\
....annotate(rank=SearchRank(F('search'),SearchQuery('spam')))\
....order_by('-rank')\
....values_list('rank','title','body')>>>formatchinmatches:...print(match)...(0.607927,'My hovercraft is full of spam.',"It's what eels love!")(0.0865452,'What do eels eat?','Spam, spam, spam, they love spam!')

如果你只想得到一个没有排名的可能匹配的列表 您可以直接在“搜索”列上进行筛选,如下所示:

>>>TextDocument.objects.filter(search='spam')<QuerySet[<TextDocument:TextDocumentobject>,<TextDocument:TextDocumentobject>]>

关于tsvector_field.SearchVectorField字段的最后一个注意事项是它需要 language_column参数,而不是language参数,或者除了language参数之外。什么时候? 两个参数都提供了,然后数据库触发器将首先在 language_column如果为空,则使用language中的语言。

迁移

当将{TT16}$$字段添加到现有模型中时,p^ {ID8}$ 要更新所有现有记录的搜索向量。django tsvector字段包含 获取模型名和搜索向量的tsvector_field.IndexSearchVector操作 列作为参数。如果我们以前创建的TextDocument没有search列 然后,要添加搜索功能,我们将使用以下迁移:

fromdjango.dbimportmigrations,modelsimporttsvector_fieldclassMigration(migrations.Migration):dependencies=[]operations=[migrations.AddField(model_name='textdocument',name='search',field=tsvector_field.SearchVectorField(columns=[tsvector_field.WeightedColumn('title','A'),tsvector_field.WeightedColumn('body','D')],language='english'),),tsvector_field.IndexSearchVector('textdocument','search'),]

有关查询的详细信息,请参阅有关全文搜索的django文档:

https://docs.djangoproject.com/en/dev/ref/contrib/postgres/search/

有关配置搜索工作方式的详细信息,请参阅PostgreSQL文档:

https://www.postgresql.org/docs/devel/static/textsearch.html

0.9.4

  • 初始支持django 2.0 alpha

0.9.3

  • 在tsvector列上自动创建gin索引

0.9.2

  • 添加了IndexSearchVector迁移操作
  • 文档修复
  • 增加了对预迁移基于信号的集成和扩展databaseschemaeditor的支持

0.9.1

  • 修正了alterfield迁移的错误。

0.9.0

  • 初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java搜索按钮不适用于我   java制作一个应用程序来打开您自己的文件扩展名   XMemcached中的java异步集   java无法在Android上使用HTML5 canvas touch   java是否可以用PHP为Restlet创建客户端?   java在主题中添加图标。AppCompat。光   java Safari错误,无法打开浏览器   java gson解析json值中commaseparatedvalue字符串中的项   java如何使用Quarkus在卡夫卡的同一主题中设置多个使用者   java组织。json。JSONException:在{main}()的第6个字符处的main后面应该是“:”   windowbuilder如何将Java文件导出到GATE developer   java这与安卓 studio ide问题有关,在更新我们的ide之后   java Android将活动加载到类中<?>对象   java如何在springdatajpa中使用DISTINCT、GROUP BY和ORDER BY?   使用jlink的java可复制构建