【问题标题】:Django Full-Text Search with multiple words带有多个单词的 Django 全文搜索
【发布时间】:2018-11-26 08:28:57
【问题描述】:

这并不是一个复杂的问题(据我所知)。

我知道在 MongoDB 中你可以输入一个字符串,它会自动标记化并使用该字符串作为查询执行全文搜索。

但是,在 Django 中,我还没有找到类似的功能,而且我看到的所有示例都做了类似的事情:

from django.contrib.postgres.search import SearchQuery
query = SearchQuery('foo')

人们只使用一个词的原因是因为SearchQuery 只能使用一个词

我想知道的是如何使用多个单词进行全文搜索。就这么简单吗

from django.contrib.postgres.search import SearchQuery
query = SearchQuery('foo and also bar')

?还是需要比这更复杂?

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    要使用 Django 执行全文搜索,您必须将 GiN indexSearchVector 结合使用。
    这是我在某处使用的full working example。它也适用于查询中的 2 个以上单词并在 3 个字段中搜索它们。

    【讨论】:

    • 我在搜索时遇到的问题是,当我有一个“foo and bar”向量和一个“foo but baz”查询时,查询没有按预期工作。在我看来,在查询中搜索时应该找到包含向量的文档,但它没有出现。
    • 不,不应该,您的向量不包含单词“但是”。
    • 我明白了。有什么方法可以让我的查询行为,以便根据向量和查询中匹配的单词数对结果进行排名,即使查询中有无关的单词?
    • 我认为纯 Django 没有。至少我没有设法解决这个问题。可以看看搜索引擎,比如 Haystack + Whoosh(开始)或 Solr,或 ElasticSearch(更复杂)。
    • 是的。但是,如果有一天你找到了解决这个问题的方法 - 请告诉我,我的 1 个项目中遇到了同样的问题 :)
    【解决方案2】:

    SearchQuery 中可以使用多个单词。如果您不需要按术语的逻辑组合进行搜索,您甚至可以摆脱 SearchQuery:

    Entry.objects.annotate(
         search=SearchVector('body_text'),
    ).filter(search="Multiple words query")
    

    【讨论】:

    • 这是我最初的想法,但由于某种原因,我在查询中包含的术语没有被使用。例如,如果我有一个字段的值为“Blah building,college”的文档,并使用“Blah building”的查询,则不匹配。
    • @Quontas 尝试直接在 postgresql 中做同样的事情 postgresql.org/docs/9.5/static/textsearch.html
    猜你喜欢
    • 2018-03-02
    • 2023-03-19
    • 2013-05-29
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多