我可以找到与某些查询“接近”的文本吗?

时间:2019-11-20 20:04:03

标签: postgresql

我的数据库中有一个名为text的表。它将类似于this is an example of lite coin。我想为此查询litecoin和附近的事物(例如lite coin)。有什么方法可以通用地执行此操作,因为我将有多个查询。也许是最大Levenshtein距离的东西?

2 个答案:

答案 0 :(得分:3)

PostgreSQL的core extension实现了Levenshtein距离。对于长度不相等的字符串(如您的示例),距离必然会很大。因此,除非在其中搜索的所有短语都具有相同的长度,否则您将必须实现某种标准化方法。

我认为Levenshtein不可索引。您可以改用可索引的trigram distance

答案 1 :(得分:0)

Trigram建议上的

+1。 Postgres中的Trigram是 excellent ,并且可以肯定地是可索引的。根据您选择的索引选项(GIN或GiST),您可以访问不同的运算符。如果我没记错的话,GiST会为您提供单词的距离公差,并让您按顺序搜索它们。您可以指定两个搜索词之间的期望词数,以及更多。 (如果我没记错的话。)GIN和GiST都值得尝试。

Levenshtein比较两个特定的字符串,因此它不适合索引。您会索引什么?比较字符串事先未知。您可以按列中的每个字符串对每个字符串进行索引,并且除了O(aaaargh!)复杂性之外,索引中仍然可能不像搜索字符串那样复杂。

提示:如果必须使用Levenshtein,并且在有用处非常好,您可以 廉价地从比较中消除很多行。如果您有10个字符的搜索字符串,并且只希望字符串的距离为2,则可以从考虑中删除更长或更短的字符串,而不必担心丢失任何匹配项。

您可能会发现您希望将Levenshtein(或Jaccard等)应用于三元组发现的可能匹配项。但是,老实说,Levenshtein本质上偏向于以相同顺序排列的弦。轻币/轻币/莱特币可以这样做,但是当单词可以以任何顺序排列时(如名字和姓氏,大量地址数据以及许多类似短语的搜索)都无济于事。

要考虑的另一件事,取决于您的查询范围,是使用tsvector的全文本搜索。这些也是可索引的,并且还支持各种运算符。