问题描述
我正在尝试使用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使用的停用词的定义。