问题标签 [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.
postgresql - Postgres fulltextsearch 在一列中有多个单词
我想在 postgres 数据库上创建全文选择查询。例如,我想查找标题为“哈利波特”的所有书籍。如果我只是通过全文搜索来查找 Harry,它会运行得很快。例如
但是,如果我尝试组合一个像哈利波特这样的标题,我的查询就没有时间了(比如一分钟)
我的错误是什么?我还需要这个全文搜索一个或多个单词的组合。
如果存在比在一个查询中组合两个单词更好的解决方案,例如
编辑:发现了一些东西:我的哈利波特的数量约为 110.000 个数据(实际上就像书中的 1 个 mio 数据)。如果我查找例如 Ice Fire,数据库中只有 300 个结果,而且我的查询运行速度非常快。也许它是关于从数据库返回的结果集的问题?我实际上使用限制 100。
postgresql - 是否有任何理由在 postgres 表中而不是在索引中包含“tsvector”列?
我有一个包含大约 1 亿行的表格和一个要搜索的文本字段。我想出了两种方法来做到这一点,我想知道每种方法的性能影响。
方法 1: 这是我在网上看到的每篇博文都推荐的方法(例如1和2。)。这个想法是用一ts_vector
列扩充表并索引新列。
一个简单的例子是:
然后使用触发器来确保text
和text_tsv
列保持最新。
然而,这对我来说似乎很浪费,因为现在TSVECTOR
信息必须同时存储在表和索引中,并且数据库变得更加复杂。所以我想出了第二种方法。
方法2:
我的想法是去掉多余的列,直接把索引改成包含to_tsvector
函数,像这样:
问题:使用方法 2 比方法 1 有什么缺点吗?
对于我的特定数据库,我使用了第二种方法,并且对于单个单词的简单查询,我似乎获得了合理的加速(搜索大约需要 1 秒)。但是,当我在函数中有多个&
和|
运算符的复杂查询to_tsquery
(并且表中只有约 10 个匹配结果)时,搜索需要永远运行(好几个小时)。如果我切换到方法 1,由于某种原因,我可能会看到更快的查询时间吗?
如果我的查询性能缓慢不是由于我选择了方法 2,我还能做些什么来加快使用 构建的复杂查询to_tsquery
吗?
我正在使用 postgresql 10.10。
postgresql - 如何使用 TSVECTOR 和 TSQUERY 搜索单个或多个列
_search
我使用了一些样板代码(如下),它为我指定的所有列(在 中)创建了一个规范化的 tsvector列searchObjects
,我希望在这些列上进行全文搜索。
在大多数情况下,这很好。我将它与 Sequelize 结合使用,因此我的查询如下所示:
搜索索引设置:
问题是因为代码连接了每个数组中的两列searchObjects
,所以存储的是每个数组中所有列的组合索引。
例如在articles
桌子上:'headline', 'cleaned_body', 'summary'
都是那个单一生成_search
向量的一部分。
正因为如此,我不能真正搜索 ONLYheadline
或 ONLYcleaned_body
等。我希望能够单独搜索每一列,也可以一起搜索。
用例在我的搜索输入中,我只想在标题上搜索。但是在我的搜索结果页面上,我想搜索searchObjects
.
有人可以提示我需要更改的内容吗?我应该为每一列创建一个新的 tsvector 吗?
postgresql - 如何在带有数字的字符串上使用 tsvector?
我想在包含所有数字的字符串的列上使用 postgres tsquery,如下所示:
如果我尝试用这个做一个 tsquery:
我得到的是:
我希望能够仅通过此值的数字部分进行搜索,如下所示:
似乎它无法匹配这个,因为它将我的连字符解释为“负号”并且认为不239476234
匹配-239476234
。我如何告诉 postgres 将我的所有字符都视为文本,而不是试图对数字和连字符变得聪明?
postgresql - PostgreSQL - 比较 ts_vector 字段
我有两个表,其中有来自两个不同来源的数据。每个表的一个字段包含电影的标题,但由于某种我无法控制的原因,标题并不总是完全相同。
所以我使用ts_vector
来消除所有细微的差异(停用词、复数等)。
在此处查看示例:http ://sqlfiddle.com/#!17/5ccbc/3
我的问题是如何在ts_vector
不考虑数字值的情况下比较两者,而只考虑文本内容。如果我直接比较这两个字段,我只会得到值之间的完全匹配,包括每个单词的位置。我发现的唯一解决方案是使用该strip()
函数,从 tsvector 中删除位置和权重,只留下文本内容。
我想知道是否有最快的比较方法ts_vectors
。
postgresql - 在 to_tsquery() 中使用运算符的效果
我正在尝试使用 postgresql 的文本搜索,我使用表的现有两列创建了一个 ts_vector 列,并使用 GIN 索引对该列进行索引。现在,当我查询时,我注意到一个奇怪的行为,当我使用“&”或“|”等运算符时,查询的分数会降低 在 to_tsquery 函数中。
对于 100 万条记录:-
- 解释 select title, body from xyz ff where search_vector @@ to_tsquery('english', 'apps'); --> 分数在 300 左右
- 解释 select title, body from xyz ff where search_vector @@ to_tsquery('english', 'apps & apps'); --> 分数在 30 左右
这种行为我无法理解,查询的区别在于使用运算符,如果我将其更改为“应用程序和租户”,那么分数也在 30 左右,但对于单字搜索,分数很高。有人可以解释这种行为及其背后的原因。
提前致谢。
postgresql - 禁用位图扫描时 Postgres 返回不同的结果
当 Postgres 使用位图堆扫描来评估包含 的 tsquery 时!
,它给我的结果与执行 seqscan 时不同。
任何人都可以对此有所了解吗?简单地启用/禁用位图扫描会改变查询结果,这对我来说就像一个错误。有什么解决方法吗?我在下面为我的玩具查询找到了一个(使用NOT
),但是对于我拥有的一些复杂的 tsquery 参数,我不确定我是否能做到这一点。
sql - 模糊匹配 Postgres 中较大字符串中的子字符串
是否可以在 Postgres 中模糊匹配较大字符串中的子字符串?
例子:
对于colour
(ou) 的搜索,返回字符串中包含color
、colors
或的所有记录colour
。
我想知道是否可以将两者结合起来fuzzystrmatch
,tsvector
以便可以将模糊匹配应用于每个矢量化术语?
或者如果有另一种方法?
postgresql - 是否可以从 Postgresql 中的文本搜索字典中排除一个特定的停用词?
我创建了这个自定义词典
但是,删除了以下停用词:
这个词否定下一个词,并且在意义方面至关重要。我们如何从停用词列表中删除这个词?