在 PostgreSQL 中搜索句子的确切部分
Search for an exact part of sentence in PostgreSQL
我有一个 PostgreSQL 数据库 table,其中的行包含一些句子/文本段落。
假设有3条记录(无意义,只是举个例子):
1) A dancing fox ran across the road.
2) I like dancing foxtrot.
3) These animals are foxes.
我想搜索 "dancing fox",我希望它应该只搜索 return "record 1"。
但是,当我使用通配符 %dancing fox%
LIKE 语法时,我将检索记录 1 和 2。
我预计 ts_vector 可能是一个解决方案,但该项目使用了更多语言环境(问题 1),我不希望它匹配第三条记录 - 我不想要真正的全文(问题 2) ).
请问您建议使用什么?或者您有任何经验或资源链接如何处理问题 1 和 2?
我知道我的问题很混乱,所以感谢您的耐心等待。也许我只需要被推向正确的方向。
您可以添加分隔符:
where concat(' ', col, ' ') like '% dancing fox %'
您可以使用正则表达式来做到这一点。
单词边界 \y
派上用场:除了 space 之外,可能还有其他字符来分隔单词。
where mycol ~ '\ydancing fox\y'
As explained in the documentation: \y
只匹配单词的开头或结尾.
您可以通过 'simple' 配置使用全文搜索来避免特定语言的词干和停用词,并使用短语匹配运算符来保持词序和间距。
select * from foo
where to_tsvector('simple',x) @@ phraseto_tsquery('simple','dancing fox');
你说你不想匹配第三个例子,但不清楚为什么它首先会这样做,即使你使用的是 'english' 和 plainto_tsquery
而不是'simple' 和 phraseto_tsquery
。
您仍然受制于默认的 FTS 文本解析器将其视为单词,但是 none 您的示例涉及这一点(如果 fox-trot 被连字符会怎样?)
这将由 tsvector 类型上的常用 FTS 索引支持。
或者按照 GMB 的建议,您可以使用 ~
和 '\y'。 pg_trgm 索引将支持此类查询。我觉得这个解决方案比较直观,但是如果涉及的文本很长,效率可能会降低。
我有一个 PostgreSQL 数据库 table,其中的行包含一些句子/文本段落。
假设有3条记录(无意义,只是举个例子):
1) A dancing fox ran across the road.
2) I like dancing foxtrot.
3) These animals are foxes.
我想搜索 "dancing fox",我希望它应该只搜索 return "record 1"。
但是,当我使用通配符 %dancing fox%
LIKE 语法时,我将检索记录 1 和 2。
我预计 ts_vector 可能是一个解决方案,但该项目使用了更多语言环境(问题 1),我不希望它匹配第三条记录 - 我不想要真正的全文(问题 2) ).
请问您建议使用什么?或者您有任何经验或资源链接如何处理问题 1 和 2?
我知道我的问题很混乱,所以感谢您的耐心等待。也许我只需要被推向正确的方向。
您可以添加分隔符:
where concat(' ', col, ' ') like '% dancing fox %'
您可以使用正则表达式来做到这一点。
单词边界 \y
派上用场:除了 space 之外,可能还有其他字符来分隔单词。
where mycol ~ '\ydancing fox\y'
As explained in the documentation: \y
只匹配单词的开头或结尾.
您可以通过 'simple' 配置使用全文搜索来避免特定语言的词干和停用词,并使用短语匹配运算符来保持词序和间距。
select * from foo
where to_tsvector('simple',x) @@ phraseto_tsquery('simple','dancing fox');
你说你不想匹配第三个例子,但不清楚为什么它首先会这样做,即使你使用的是 'english' 和 plainto_tsquery
而不是'simple' 和 phraseto_tsquery
。
您仍然受制于默认的 FTS 文本解析器将其视为单词,但是 none 您的示例涉及这一点(如果 fox-trot 被连字符会怎样?)
这将由 tsvector 类型上的常用 FTS 索引支持。
或者按照 GMB 的建议,您可以使用 ~
和 '\y'。 pg_trgm 索引将支持此类查询。我觉得这个解决方案比较直观,但是如果涉及的文本很长,效率可能会降低。