2013-06-10 6 views
5

mysqlのfull text boolean modeで複数のテストを行っていますが、私のテストでは複数の単語にマイナス記号を使用することはできません。フルテキストブールモードで複数の単語にマイナス記号を使用

私は次のクエリを実行した場合例えば2行..

id,name 
1,2011-12 Fleer Retro auto jordan non 
2,1999 jordan non auto 

を持っている:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -non' IN BOOLEAN MODE); 

を期待通りに両方の行が表示されません。しかし、私はこのクエリを実行する場合:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -"non auto"' IN BOOLEAN MODE); 

両方の行が表示されません(同じ結果)。行1は戻ってはならないのですか?

編集:ft_min_word_len2に設定され、それはそれとは何の関係もありませんので、私は、私のストップワードファイルを無効にしています。

フィドル:http://sqlfiddle.com/#!2/d1987/4

はしかし、フィドルは、デフォルトのストップワードファイルを使用していますので、「非」という言葉でそれをテストが機能しないようです。

+0

テーブルにさらにいくつかの行を追加してみてください。 – Strawberry

+0

@Strawberry申し訳ありませんが、テーブルには2つ以上の行があります。実際には合計で164行あります。 – Brett

+0

あなたが提供する基準には、およそ何パーセントが一致していますか? – Strawberry

答えて

0

行1が戻ってこない理由は、否定アクション(除外のような)が積極的なアクション(includeのような)を追い越すことです。 たとえば、セキュリティでは、DENIED許可がALLOWまたはGRANT許可アクションよりも優先されます。 MySQLの12.9.2. Boolean Full-Text Searchesから

注: - 演算子がそうでなければ他の検索条件にマッチしている行を除外するためにのみ機能します。したがって、前にある項だけを含むブールモード検索では、空の結果が返されます。それは、「除外条項のいずれかを含むものを除くすべての行を。」返さない

そこでどのようなクエリ:

... AGAINST('+Any_string -"any_string"' IN BOOLEAN MODE) 

は何も得られないだろう。

UPDATE

-"non auto"ブロックnonがストップワードで、検索文字列から除外されているため、検索結果に表示さから「自動」。この単語がBOOLEAN MODEで検索から除外されるもう1つの理由は、それが短すぎるということです。

この句には、索引に含まれる単語が含まれていないと結果は空です。たとえば、すべての単語がストップワードまたはインデックス付き単語の最小長より短い場合、結果は空です。

UPDATE 2

私は上記の私のexplainationに固執するでしょう。それはyuoが期待するものではありませんが。-"term1 term2"のマイナス記号の二重引用符は、()と解釈されます - 疑問符ではなく括弧で囲みます。

このクエリは何も返しませんが、2011-12 Fleer Retro auto jordan non1999 jordan non autoのような行が表示されます。ストップワードとは何の関係もありません。

SELECT auction_id,`name` FROM auctions 
WHERE MATCH(`name`) AGAINST('+jordan +auto -"jordan auto"' IN BOOLEAN MODE); 

はまた関連するバグ#の36384があります:Full-Text required (+) operator bug。それは私の仮説を支持し、フルテキスト検索式の解析が期待どおりに機能しない可能性があります。

+0

しかし私は 'auto'をブロックしませんでした。この用語を二重引用符で囲んだので、 'non auto'の完全な用語だけをブロックすべきです。 – Brett

+0

@Brett 'non'は短すぎますか、ストップワードかその両方です。 – Stoleg

+0

私の 'ft_min_word_len'は' 2'に設定されています。停止単語ファイルを無効にして、結果に影響を与えてはいけません。 – Brett

0

私はそれを言うことを憎むが、あなたはLIKEを使用する必要があります。

フレーズ検索マッチが正確に含まれていることのみが必要です。私は、フルテキストモードを使用して

SELECT auction_id,`name` FROM auctions WHERE MATCH(`name`) AGAINST('+jordan' IN BOOLEAN 
MODE) AND `name` NOT LIKE('%non auto%') ; 

問題にあなたがそれを望むように動作するクエリを含めました下には、MySQLのdocsによるということですフレーズと同じ単語を同じ順序で使用します。たとえば、 "test phrase"はMySQL 5.0.3の "test、phrase"にマッチしますが、以前はテストしませんでした。あなたがトラブルに実行している理由

です。お役に立てれば。 EDIT:なぜこのように正確に動作しているのですか(お互いに関係なく、autoとnonを含むものを除いて)私は手がかりはありませんが、このデフォルトをオーバーライドする方法はたくさんあるようです動作。

+0

うん......本当に私にとって重要ではない、私は 'LIKE'を使うことに行くと、動的に行う痛みです。 – Brett

+0

それはそれほど苦痛ではないでしょう。ユーザーからの文字列を取得したり、コード内の他の場所にある文字列を取得したり、同様の条件で%%で囲むだけで設定されます。しかし、私はどのように検索の入力を得ているのかわからないので、うまくいかないかもしれません。 –

関連する問題