Sql 基于多行查找与规则匹配的行的高效查询
我有一个包含捷克语单词(>1M行)的PostgreSQL表格,其中有一列名为“word”[text],我希望根据单词的结尾查找所有具有相同偏角的单词(请参阅) 例如,我想找到所有以“E”(例如kuřE)结尾的单词,但也存在以“ete”(例如kuřete)结尾的单词形式,还有“etem”(例如kuřetem)和“eti”(例如kuřeti)。每个单词大约有14个单词形式Sql 基于多行查找与规则匹配的行的高效查询,sql,postgresql,nlp,relational-division,Sql,Postgresql,Nlp,Relational Division,我有一个包含捷克语单词(>1M行)的PostgreSQL表格,其中有一列名为“word”[text],我希望根据单词的结尾查找所有具有相同偏角的单词(请参阅) 例如,我想找到所有以“E”(例如kuřE)结尾的单词,但也存在以“ete”(例如kuřete)结尾的单词形式,还有“etem”(例如kuřetem)和“eti”(例如kuřeti)。每个单词大约有14个单词形式 什么是查找与规则匹配的所有单词的有效方法(SQL查询)?Hmmm。如果我理解正确,那么这不是一个有效的操作。但我认为聚合可能是最
什么是查找与规则匹配的所有单词的有效方法(SQL查询)?Hmmm。如果我理解正确,那么这不是一个有效的操作。但我认为聚合可能是最快的方法,除非您深入研究神秘的索引策略(即使这样也可能不起作用):
嗯。如果我理解正确,那么这不是一个有效的操作。但我认为聚合可能是最快的方法,除非您深入研究神秘的索引策略(即使这样也可能不起作用):
这是关系划分的一个例子 假设一个由
唯一的单词组成的表格,如:
CREATE TABLE words (word text PRIMARY KEY);
这应该是最快的解决方案之一:
SELECT w0.stem
FROM (
SELECT left(word, -4) AS stem -- -4 = length('etem')
FROM words
WHERE word LIKE '%etem' -- pick the most selective ending to get started
) w0
JOIN words w1 ON w1.word = stem || 'eti'
JOIN words w2 ON w2.word = stem || 'ete'
JOIN words w3 ON w3.word = stem || 'e';
查找以所有给定结尾出现的所有词干。更多的单词以相同的词干和不同的结尾开头并不意味着不合格
如果你必须检查许多结尾(14?),那么把它们全部拼出来可能会很乏味。较短的代码,通常较慢:
SELECT w0.stem
FROM (
SELECT left(word, -4) AS stem
FROM words
WHERE word LIKE '%etem' -- pick the most selective ending to get started
) w0
CROSS JOIN unnest ('{eti,ete,e}'::text[]) x(dec) -- all other in an array
JOIN words w1 ON w1.word = w0.stem || x.dec
GROUP BY w0.stem
HAVING count(*) = 3; -- = cardinality('{eti,ete,e}'::text[])
小提琴
相关的:
运算符和索引可能会引起兴趣。但是您首先需要一个捷克词干分析器,它不包括在标准Postgres发行版中。相关的:
这是关系划分的一种情况
假设一个由唯一的单词组成的表格,如:
CREATE TABLE words (word text PRIMARY KEY);
这应该是最快的解决方案之一:
SELECT w0.stem
FROM (
SELECT left(word, -4) AS stem -- -4 = length('etem')
FROM words
WHERE word LIKE '%etem' -- pick the most selective ending to get started
) w0
JOIN words w1 ON w1.word = stem || 'eti'
JOIN words w2 ON w2.word = stem || 'ete'
JOIN words w3 ON w3.word = stem || 'e';
查找以所有给定结尾出现的所有词干。更多的单词以相同的词干和不同的结尾开头并不意味着不合格
如果你必须检查许多结尾(14?),那么把它们全部拼出来可能会很乏味。较短的代码,通常较慢:
SELECT w0.stem
FROM (
SELECT left(word, -4) AS stem
FROM words
WHERE word LIKE '%etem' -- pick the most selective ending to get started
) w0
CROSS JOIN unnest ('{eti,ete,e}'::text[]) x(dec) -- all other in an array
JOIN words w1 ON w1.word = w0.stem || x.dec
GROUP BY w0.stem
HAVING count(*) = 3; -- = cardinality('{eti,ete,e}'::text[])
小提琴
相关的:
运算符和索引可能会引起兴趣。但是您首先需要一个捷克词干分析器,它不包括在标准Postgres发行版中。相关的: