0

Sentence と WordIndex の 2 つのテーブルがあります。

文:
id、
テキスト、
wordId

WordIndex:
id、
単語、
文ID

シナリオ:

例:
文表
1、「犬を飛び越えた」、[1,2,3,4,5]
2、「猫をつまずいた」、[6,7,8,9,10]

WordIndex 表
1、「私」、1
2、「ジャンプした」、1
3、「オーバー」、1
4、「ザ」、1
5、「犬」、1
6、「私」、2
7、「つまずいた」、 2
8、「上」、2
9、「ザ」、2
10、「猫」、2

「i」、「jumped」、「over」、「the」、「dog」、「cat」のいずれかの単語のみで構成されるすべての文を検索したいと考えています。
これらの単語のインデックスを検索すると、センテンス #2 が返されますが、これは含まれるべきではありません。
私の考えは、ターゲットの単語と一致しない WordIndex の行を見つけることです。その結果は、私が望まないすべての SentenceId で構成され、私が行うものはありません。次に、その結​​果にない文の ID を取得します。

問題は、私は MySQL に非常に慣れていないことで、2 つの質問があります。
1) それは望ましい結果を得る最も効率的な方法のように思えますか? 適切にスケーリングするには、これが必要です (数百万のインデックスと数千のターゲット/許可された単語)。
2) そのソリューションを SQL ステートメントにどのように変換しますか?

4

1 に答える 1

0

私は自分自身の質問に答えるつもりです。次のクエリ (Doctrine Query Language を使用) は、指定された単語の配列から単語のみを含む文を取得します。

$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.")
");

これが効率的かどうかはわかりませんが、うまくいくようです。

于 2012-05-01T03:19:07.170 に答える