Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于多行查找与规则匹配的行的高效查询_Sql_Postgresql_Nlp_Relational Division - Fatal编程技术网

Sql 基于多行查找与规则匹配的行的高效查询

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。如果我理解正确,那么这不是一个有效的操作。但我认为聚合可能是最

我有一个包含捷克语单词(>1M行)的PostgreSQL表格,其中有一列名为“word”[text],我希望根据单词的结尾查找所有具有相同偏角的单词(请参阅)

例如,我想找到所有以“E”(例如kuřE)结尾的单词,但也存在以“ete”(例如kuřete)结尾的单词形式,还有“etem”(例如kuřetem)和“eti”(例如kuřeti)。每个单词大约有14个单词形式


什么是查找与规则匹配的所有单词的有效方法(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发行版中。相关的: