问题标签 [tsvector]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
139 浏览

postgresql - Postgres fulltextsearch 在一列中有多个单词

我想在 postgres 数据库上创建全文选择查询。例如,我想查找标题为“哈利波特”的所有书籍。如果我只是通过全文搜索来查找 Harry,它会运行得很快。例如

但是,如果我尝试组合一个像哈利波特这样的标题,我的查询就没有时间了(比如一分钟)

我的错误是什么?我还需要这个全文搜索一个或多个单词的组合。

如果存在比在一个查询中组合两个单词更好的解决方案,例如

编辑:发现了一些东西:我的哈利波特的数量约为 110.000 个数据(实际上就像书中的 1 个 mio 数据)。如果我查找例如 Ice Fire,数据库中只有 300 个结果,而且我的查询运行速度非常快。也许它是关于从数据库返回的结果集的问题?我实际上使用限制 100。

0 投票
1 回答
2143 浏览

postgresql - 是否有任何理由在 postgres 表中而不是在索引中包含“tsvector”列?

我有一个包含大约 1 亿行的表格和一个要搜索的文本字段。我想出了两种方法来做到这一点,我想知道每种方法的性能影响。

方法 1: 这是我在网上看到的每篇博文都推荐的方法(例如12。)。这个想法是用一ts_vector列扩充表并索引新列。
一个简单的例子是:

然后使用触发器来确保texttext_tsv列保持最新。
然而,这对我来说似乎很浪费,因为现在TSVECTOR信息必须同时存储在表和索引中,并且数据库变得更加复杂。所以我想出了第二种方法。

方法2: 我的想法是去掉多余的列,直接把索引改成包含to_tsvector函数,像这样:

问题:使用方法 2 比方法 1 有什么缺点吗?

对于我的特定数据库,我使用了第二种方法,并且对于单个单词的简单查询,我似乎获得了合理的加速(搜索大约需要 1 秒)。但是,当我在函数中有多个&|运算符的复杂查询to_tsquery(并且表中只有约 10 个匹配结果)时,搜索需要永远运行(好几个小时)。如果我切换到方法 1,由于某种原因,我可能会看到更快的查询时间吗?

如果我的查询性能缓慢不是由于我选择了方法 2,我还能做些什么来加快使用 构建的复杂查询to_tsquery吗?

我正在使用 postgresql 10.10。

0 投票
1 回答
474 浏览

postgresql - 如何使用 TSVECTOR 和 TSQUERY 搜索单个或多个列

_search我使用了一些样板代码(如下),它为我指定的所有列(在 中)创建了一个规范化的 tsvector列searchObjects,我希望在这些列上进行全文搜索。

在大多数情况下,这很好。我将它与 Sequelize 结合使用,因此我的查询如下所示:

搜索索引设置:

问题是因为代码连接了每个数组中的两列searchObjects,所以存储的是每个数组中所有列的组合索引。

例如在articles桌子上:'headline', 'cleaned_body', 'summary'都是那个单一生成_search向量的一部分。

正因为如此,我不能真正搜索 ONLYheadline或 ONLYcleaned_body等。我希望能够单独搜索每一列,也可以一起搜索。

用例在我的搜索输入中,我只想在标题上搜索。但是在我的搜索结果页面上,我想搜索searchObjects.

有人可以提示我需要更改的内容吗?我应该为每一列创建一个新的 tsvector 吗?

0 投票
1 回答
24 浏览

postgresql - 如何解释和访问 tsvector?

提供了一种数据类型tsvector用于存储预处理的文档,以及用于表示已处理查询的类型 tsquery

但有时 TSVECTOR 是一个单词数组,有时是一袋单词位置,有时是一个带有位置和权重的复杂向量……我可以访问其数据结构的各个部分吗?例子:

想象一下 TSVECTOR 具有相同的 JSONb 结构访问运算符:我们可以通过WHERE tsv->'foo'->0=1.

在现实生活中:我没有看到(在搜索指南中)执行此操作的tsquery或直接运算符。而且我没有看到(在通用指南中完整的 TSVECTOR 文档,其中包含对其真实和完整内部结构的技术描述。

0 投票
2 回答
725 浏览

postgresql - 如何在带有数字的字符串上使用 tsvector?

我想在包含所有数字的字符串的列上使用 postgres tsquery,如下所示:

如果我尝试用这个做一个 tsquery:

我得到的是:

我希望能够仅通过此值的数字部分进行搜索,如下所示:

似乎它无法匹配这个,因为它将我的连字符解释为“负号”并且认为不239476234匹配-239476234。我如何告诉 postgres 将我的所有字符都视为文本,而不是试图对数字和连字符变得聪明?

0 投票
1 回答
122 浏览

postgresql - PostgreSQL - 比较 ts_vector 字段

我有两个表,其中有来自两个不同来源的数据。每个表的一个字段包含电影的标题,但由于某种我无法控制的原因,标题并不总是完全相同。

所以我使用ts_vector来消除所有细微的差异(停用词、复数等)。

在此处查看示例:http ://sqlfiddle.com/#!17/5ccbc/3

我的问题是如何在ts_vector不考虑数字值的情况下比较两者,而只考虑文本内容。如果我直接比较这两个字段,我只会得到值之间的完全匹配,包括每个单词的位置。我发现的唯一解决方案是使用该strip()函数,从 tsvector 中删除位置和权重,只留下文本内容。

我想知道是否有最快的比较方法ts_vectors

0 投票
2 回答
311 浏览

postgresql - 在 to_tsquery() 中使用运算符的效果

我正在尝试使用 postgresql 的文本搜索,我使用表的现有两列创建了一个 ts_vector 列,并使用 GIN 索引对该列进行索引。现在,当我查询时,我注意到一个奇怪的行为,当我使用“&”或“|”等运算符时,查询的分数会降低 在 to_tsquery 函数中。

对于 100 万条记录:-

  1. 解释 select title, body from xyz ff where search_vector @@ to_tsquery('english', 'apps'); --> 分数在 300 左右
  2. 解释 select title, body from xyz ff where search_vector @@ to_tsquery('english', 'apps & apps'); --> 分数在 30 左右

这种行为我无法理解,查询的区别在于使用运算符,如果我将其更改为“应用程序和租户”,那么分数也在 30 左右,但对于单字搜索,分数很高。有人可以解释这种行为及其背后的原因。

提前致谢。

0 投票
1 回答
117 浏览

postgresql - 禁用位图扫描时​​ Postgres 返回不同的结果

当 Postgres 使用位图堆扫描来评估包含 的 tsquery 时!,它给我的结果与执行 seqscan 时不同。

任何人都可以对此有所了解吗?简单地启用/禁用位图扫描会改变查询结果,这对我来说就像一个错误。有什么解决方法吗?我在下面为我的玩具查询找到了一个(使用NOT),但是对于我拥有的一些复杂的 tsquery 参数,我不确定我是否能做到这一点。

0 投票
1 回答
457 浏览

sql - 模糊匹配 Postgres 中较大字符串中的子字符串

是否可以在 Postgres 中模糊匹配较大字符串中的子字符串?

例子:

对于colour(ou) 的搜索,返回字符串中包含colorcolors或的所有记录colour

我想知道是否可以将两者结合起来fuzzystrmatchtsvector以便可以将模糊匹配应用于每个矢量化术语?

或者如果有另一种方法?

0 投票
1 回答
182 浏览

postgresql - 是否可以从 Postgresql 中的文本搜索字典中排除一个特定的停用词?

我创建了这个自定义词典

但是,删除了以下停用词:

这个词否定下一个词,并且在意义方面至关重要。我们如何从停用词列表中删除这个词?