1

引用符で囲まれたハイフン付きの検索文字列に問題があるか、理解に問題があります。

私のテーブルには、「会社」という列のテーブルがあります。
その列のエントリの1つは次のとおりです。AZElectro

次の例は非常に単純化されていますが(実際のクエリははるかに複雑ですが)、効果は同じです。

次の検索を実行すると、上記の会社の行が表示されません。

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('+\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

次の検索を行う場合は、上記の会社の行を取得します(「AZ」の前に-を+に変更しただけです。

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('-\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

演算子を完全に削除すると、行も取得します。

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

誰かが私にこの行動を説明できますか?+で検索すると、結果も得られるはずです...

編集

myisam_ftdumpでテーブルインデックスをチェックしました。
14f2e8 0.7908264 ab
3a164 0.8613265 dv のようなエントリがあるため、2文字の単語は適切に索引付けされます

エントリもあります:
de340 0.6801047 az
これはAZのエントリであると思います-したがって、検索でこのエントリが見つかるはずですよね?

4

1 に答える 1

0

のデフォルト値ft_min_word_lenは 4 です。詳細については、このリンクを参照してください。つまり、システムは 4 文字未満の単語をインデックスに登録していません。

何でこれが大切ですか?良い:

  • A-Z長さが 4 文字未満です
  • ...したがって、インデックスにはありません
  • ...しかし、最初のクエリ+"A-Z"は、一致が成功するためにはインデックスに含まれている必要があると述べています
  • 他の 2 つ (インデックスにない場合は一致、これまたはあれがインデックスにある場合は一致) は、インデックスにないため機能します。

ハイフンは赤いニシンです。その理由は、「AZ」の長さが 3 文字であり、FT インデックスがそれを無視するためです。

于 2012-11-09T11:50:31.140 に答える