gpt4 book ai didi

反向相关模型中的Django postgres全文搜索

转载 作者:行者123 更新时间:2023-11-29 12:03:37 26 4
gpt4 key购买 nike

我正在使用 https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/search/在我的 Django 项目中。如何将反向相关模型添加到搜索向量中?

class Container(models.Model):
text = models.TextField()

class Item(models.Model):
container = models.ForeignKey(Container)
text = models.TextField()

我想在 ItemContainer 模型 text 字段中搜索并返回 QuerySet容器模型如果相关Item包含搜索模式

最佳答案

是这样的:

  1. 确保您使用的是 django -gte 1.10
  2. 确保你的 INSTALLED_APPS
  3. 上有 'django.contrib.postgres',
  4. 按照您的问题创建您的两个模型。
  5. 只需使用一些数据进行迁移、迁移和填充模型:

用数据填充模型:

from fts.models import Item, Container    
c=Container.objects.create( text = "hello" )
Item.objects.create( text ="Some word", container = c )
  1. 此时您已准备好进行查询:

查询和检查结果:

from django.contrib.postgres.search import SearchVector
>>> ( Container
... .objects
... .annotate(search=SearchVector('text', 'item__text'),)
... .filter(search='Some word')
... .distinct()
... )

预期结果:

<QuerySet [<Container: Container object>]>
  1. 为了确保您的查询使用完整的搜索 postgres 功能正常工作,您可以打印底层的 sql:

请求底层 SQL:

>>> print ( Container
.objects
.annotate(search=SearchVector('text', 'item__text'),)
.filter(search='Some word')
).query

结果是:

SELECT 
"fts_container".
"id", "fts_container".
"text",
to_tsvector(COALESCE("fts_container"."text", )
|| ' ' ||
COALESCE("fts_item"."text", )) AS "search"
FROM
"fts_container"
LEFT OUTER JOIN
"fts_item"
ON("fts_container"."id" = "fts_item"."container_id")
WHERE to_tsvector(
COALESCE("fts_container"."text", )
|| ' ' ||
COALESCE("fts_item"."text", )
)@@(plainto_tsquery(Some word)) = true

实际操作:

django and postgres fts

性能:

我不知道当您混合来自多个表的字段时,postgres 是否能够利用索引的完整搜索功能。但是很容易检查它。创建全文索引和 ANALYZE 后您可以询问有关 sql 计划的表:

fts=> EXPLAIN SELECT 
fts-> "fts_container".
fts-> "id", "fts_container".
fts-> "text",
fts-> to_tsvector(COALESCE("fts_container"."text", '' )
fts(> || ' ' ||
fts(> COALESCE("fts_item"."text", '' )) AS "search"
fts-> FROM
fts-> "fts_container"
fts-> LEFT OUTER JOIN
fts-> "fts_item"
fts-> ON("fts_container"."id" = "fts_item"."container_id")
fts-> WHERE to_tsvector(
fts(> COALESCE("fts_container"."text", '' )
fts(> || ' ' ||
fts(> COALESCE("fts_item"."text",'' )
fts(> )@@(plainto_tsquery('Some word')) = true
fts-> ;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Hash Right Join (cost=1.04..2.15 rows=1 width=68)
Hash Cond: (fts_item.container_id = fts_container.id)
Filter: (to_tsvector(((COALESCE(fts_container.text, ''::text) || ' '::text) || COALESCE(fts_item.text, ''::text))) @@ plainto_tsquery('Some word'::text))
-> Seq Scan on fts_item (cost=0.00..1.04 rows=4 width=36)
-> Hash (cost=1.02..1.02 rows=2 width=36)
-> Seq Scan on fts_container (cost=0.00..1.02 rows=2 width=36)
(6 rows)

关于反向相关模型中的Django postgres全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com