それ、メッセージ花火でわざわざ伝えること?

sennaの全文検索について質問です。
Tritonn(senna+MySQL)を導入しました。
http://qwik.jp/senna/FrontPageJ.html

A、B、C、D、E、Fを日本語の単語とします。

次のキーワードをすべて含む:A、B
次のキーワードのいずれかを含む:C、D
次のキーワードを含まない:E、F

という条件で抽出を行いたいです。
この検索の結果、AかつBかつ(CもしくはD)を含むデータのうち、EとFを含まないものを抽出します。
このようなクエリはどのように書けばいいのでしょうか。

AND、OR、NOT単体でしたら書くことができますが、これらの複合文は文例がなかったのでわかりませんでした。

よろしくお願いします。

A 回答 (2件)

全文検索を使う場合のクエリと言う事ですよね?


基本的な論理演算は#1さんが書かれているとおりだと思います。

全文検索にSQLの論理演算ORは禁物なので、ANDだけで揃えてみました。
(最近はそうでもないのかな?)

select
col1, col2, ....
from tbl
where match(coltext) against ('+A +B -E -F' in boolean mode)
and match(coltext) against ('C D' in boolean mode);

残念ながら、MATCH一発で書くクールな方法は思いつきませんでした。

sennaが2回呼ばれる事、と全文検索内とは言えORになるので、速くはないかも、ですね。
(LIKEのテーブルフルスキャンよりは速いと思いますが)

それと、手元にTritonn環境ないので申し訳ありませんが、未検証です。
なのであちこち微妙です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
まさに知りたかった回答です。
>sennaが2回呼ばれる事、と全文検索内とは言えORになるので、速くはないかも、ですね。
or検索の対象を単一カラムになるようにして、not検索の場合のみ、2回matchを走らせるようにしようと思います。
ありがとうございました。

お礼日時:2012/03/24 02:32

> このようなクエリはどのように書けばいいのでしょうか。


「MySQLのクエリ」で良いですか?

いくつか確認させてください。
> 次のキーワードのいずれかを含む:C、D
両方とも含む場合も対象にして良いですか?
両方とも含む場合も対象として進めます。

> 次のキーワードを含まない:E、F
両方とも含まない場合なのか、どちらか一方でも含むなら対象外なのか?
どちらか一方でも含むなら対象外として進めます。

テーブル名「対象テーブル」と列名「Col1」は環境に応じて書き換えてください。

select * from 対象テーブル
where (Col1 like '%A%' and Col1 like '%B%')
and (Col1 like '%C%' or Col1 like '%D%')
and not(Col1 like '%E%' or Col1 like '%F%')
でどうでしょう?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
この論理演算をsennaのクエリ書式で書いていただきたかったのです。

お礼日時:2012/03/24 02:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す