如何在PostgreSQL中进行全文搜索,以搜索输入search_text中的任何单词顺序,以及它们之间是否有单词

问题描述

我正在尝试使用Django全文搜索,但是遇到了问题: 我遵循了这个documentation,并且效果很好。但是我的问题是我不想让postgress考虑我搜索的单词的顺序或排列。 我的意思是我希望搜索“好男孩”和“好男孩”的结果相同。 而且当我搜索“好男孩”时,我想在结果中看到“好坏男孩”。 但是这些都没有发生,我无法通过键入“ 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)

解决方法

您可以在PostgreSQL中很容易地实现这一目标。 我建议您仔细阅读Basic Text Matching上的文档。

您需要使用swal({ text: 'What would you like to name this report?',html: true,content: { element: 'input',},buttons: 'Next' }) .then((value) => { if (!value) throw null; let name = value; swal({ text: 'Give this report a description',content: { element: 'textarea',buttons: 'Next' }).then((value) => { if (!value) throw null; let description = value; swal({ text: 'Add a comment?',content: { element: 'textarea',buttons: 'Publish' }) .then((value) => { let comment = value; console.log(name) // Returns the correct value console.log(description) // Returns true console.log(comment) // Returns true }) .catch(error => console.log(error)) }) .catch(error => console.log(error)) }) ,(跟随者)tsquery运算符。 如果您使用整数而不是<->,则可以表示所需的接近度:

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

因此,您应该找到一种使Python执行该PostgreSQL函数的方法: -

也许仅使用字符串to_tsquery('good <1> boy | boy <1> good' );调用SearchQuery即可,但是您应该参考教程文档以找到如何将'good <1> boy | boy <1> good'与方法<->一起使用。 / p>

评论后编辑。

查看SearchQuery source code,您可以看到Django类的构造函数传递了默认参数SearchQuery

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

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

您是否尝试过使用<Ineger>和值为search_type='raw'的搜索?

如果不支持FOLLOWED BY运算符("'good <1> boy | boy <1> good'"),则可以使用<->来调用SearchQuery

这将同时找到search_type='phrase'good boy,但是确切的行为取决于为PostgreSQL设置的Dictionary使用的停用词的定义。