【问题标题】:How to make full text search in PostgreSQL to search any order of words in the input search_text and also if there are words between them如何在 PostgreSQL 中进行全文搜索以搜索输入 search_text 中的任何单词顺序以及它们之间是否存在单词
【发布时间】:2020-12-20 21:11:17
【问题描述】:

我正在尝试使用 Django 全文搜索,但遇到了问题: 我已经关注了这个documentation,效果很好。但我的问题是我不希望 postgress 考虑我搜索的单词的顺序或排列。 我的意思是我希望搜索“good boy”和“boy good”的结果相同。 而且当我搜索“好男孩”时,我想在结果中看到“好坏男孩”。 但是这些都没有发生,我无法通过输入“boy good”甚至“good boy”来查询“good bad boy”(因为“bad”缺失)。 我尝试按空格分隔search_text,然后用 & 像这样的搜索查询来删除单词的顺序,但它没有用。

我更改了这段代码:

search_query = SearchQuery(
    search_text
)
search_rank = SearchRank(search_vectors, search_query)

到这里:

s = SearchQuery(search_text.split(' ')[0])
for x in search_text.split(' ')[1:]:
    s = s & SearchQuery(x)
search_query = s
search_rank = SearchRank(search_vectors, search_query)

【问题讨论】:

    标签: django postgresql full-text-search


    【解决方案1】:

    您可以在 PostgreSQL 中轻松实现这一点。 我建议仔细阅读Basic Text Matching 上的文档。

    您需要使用<->, (FOLLOWED BY) tsquery 运算符。 如果您使用整数而不是 -,您可以表示所需的接近度:

    ,其中N是一个整数,表示匹配词素位置之间的差异。

    所以你应该找到一种方法让 Python 执行这个 PostgreSQL 函数: to_tsquery('good <1> boy | boy <1> good' );.

    也许只是用字符串'good <1> boy | boy <1> good' 调用SearchQuery 就可以了,但是你应该参考教程文档来了解如何使用<->SearchQuery 方法。

    评论后编辑。

    查看Djangosource code可以看到SearchQuery类的构造函数传递了一个默认参数search_type='plain'

    您可以传递不同的参数来实现不同类型的搜索。 在 Django 项目documentation 中,您可以为命名参数search_type 的每个接受的字符串值找到一个示例:'plain'、'phrase'、'raw'、'websearch'。

    如果您通过search_type=raw,您可以提供带有术语和运算符的格式化搜索查询,但我不确定 Django 是否支持 <Ineger> 运算符,正如我之前所说的,您应该尝试一下。

    您是否尝试过使用search_type='raw' 进行搜索,值为"'good <1> boy | boy <1> good'"

    如果不支持 FOLLOWED BY 运算符 (<->),您可以通过调用 SearchQuerysearch_type='phrase' 来接近您想要的结果。

    这将同时找到 good boyboy good,但具体行为取决于为 PostgreSQL 设置的 Dictionary 所使用的停用词的定义。

    【讨论】:

    • 我知道进度有这个。我的问题是如何使用 Django 的 ORM
    • @K47 我编辑了我的答案,我不知道你已经知道了什么,指出 Django 在后台使用的是一种帮助你解决问题的方法。我阅读了一些 Django 文档以找到有关如何实现全文搜索的一些详细信息,并添加了一些建议,我没有针对您的问题发布解决方案,但我认为这是解决问题的有效方法,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多