我有两个表:Sentence和WordIndex。
句:
ID,
文字,
的wordID
词汇索引:
ID,
一句话,
sentenceId
实施例
句子表
1,“我跳过了狗”,[1,2,3,4,5]
2,“我绊倒了猫”,[6,7,8,9,10]
WordIndex表
1,“我”,1
2,“跳”,1
3,“结束”,1
4,“the”,1
5,“狗”,1
6,“我”,2
7,“绊倒”,2
8,“结束”,2
9,“the”,2
10,“猫”,2
我想找到所有完全由以下任何一个词组成的句子:“i”,“jumped”,“over”,“the”,“dog”,“cat”。
如果我只是在索引中搜索这些单词,将返回第2句,不应包括在内
我的想法是找到WordIndex中与目标词不匹配的行。这个结果包括我不想要的所有SentenceId,而不是我所做的。然后,获取不在该结果中的句子的ids。
问题是,我是MySQL的新手,有两个问题
1)这似乎是获得理想结果的最有效方法吗?我需要这个能够很好地扩展(数百万个索引和数千个目标/允许的单词)。
2)我如何将该解决方案转换为SQL语句?
答案 0 :(得分:0)
我要回答我自己的问题。以下查询(使用Doctrine查询语言)将检索仅包含给定单词数组中的单词的句子。
$search = "w.text != 'WORD' AND w.text != 'WORD'...";
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery("
SELECT s FROM BundleName:Sentence s
WHERE s.id NOT IN
(SELECT t.id FROM BundleName:Sentence t
JOIN t.words w WHERE ".$search.")
");
我不确定这是否有效,但似乎有效。