我有这三个表:
- 创建表词(id 整数、词文本、频率整数);
- 创建表格句子(id整数,句子文本);
- 创建表索引(wordId 整数、sentenceId 整数、位置整数);
索引是倒排索引,表示哪个单词出现在哪个句子中。此外,我有一个来自表格单词和句子的 id 索引。
此查询确定给定单词出现在哪些句子中并返回第一个匹配项:
select S.sentence from sentences S, words W, index I
where W.word = '#erhoehungen' and W.id = I.wordId and S.id = I.sentenceId
limit 1;
但是当我想检索两个单词一起出现的句子时,例如:
select S.sentence from sentences S, words W, index I
where W.word = '#dreikampf' and I.wordId = W.id and S.id = I.sentenceId and
S.id in (
select S.id from sentences S, words W, index I
where W.word = 'bruederle' and W.id = I.wordId and S.id = I.sentenceId
)
limit 1;
这个查询要慢得多。有什么技巧可以加快速度吗?以下是我到目前为止所做的事情:
- 将 shared_buffer 增加到 32MB
- 将 work_mem 增加到 15MB
- 在所有表上运行分析
- 如前所述,在单词 id 和句子 id 上创建索引
问候。
€编辑:
这是解释分析查询语句的输出:http: //pastebin.com/t2M5w4na
这三个 create 语句实际上是我原来的 create 语句。我应该在表格句子和单词中添加主键并将它们作为索引中的外键引用吗?但是我应该为索引表使用什么主键?SentId 和 wordId 一起不是唯一的,即使我添加 pos 表示单词在句子中的位置,它也不是唯一的。
更新为:
- 创建表词(id整数、词文本、频率整数、主键(id));
- 创建表格句子(id整数,句子文本,主键(id));
- 创建表索引(wordId整数,sentenceId整数,位置整数,外键(wordId)引用单词(id),外键(sentenceId)引用句子(sentenceId));