私はユーザーがただ1つのフィールドを持つMySQLで検索しようとしています。テーブルには、次のようになります。ユーザの入力だけでblah blubber
、検索はすべての単語天気を確認する必要がある場合 MySQL:MySQL関連の検索を使用した特別な検索アルゴリズム
ID BIGINT
TITLE TEXT
DESCRIPTION TEXT
FILENAME TEXT
TAGS TEXT
ACTIVE TINYINT
今すぐフィールド
TITLE
、
DESCRIOTION
、
FILENAME
または
TAGS
に表示されます。結果自体は関連性によって並べ替えられます。したがって、レコードに文字列が表示される頻度はどれくらいですか。私はこの例のデータ持っ:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | blah | blah | bdsai | bdha | 1
2 | blubber | blah | blah | adsb | 1
3 | blah | dsabsadsab | dnsa | dsa | 1
この例では、ID 2は、トップ(2×何とか、1X脂肪)である必要があり、次いで1(2×何とか)、次いで3(1X何とか)。このプロセスは動的でなければならないので、ユーザーはさらに多くの単語を入力することができ、関連性は1つまたは複数の単語と同じように機能します。
MySQLでしか実現できないのですか、それともPHPを使用する必要がありますか?どのようにこれは正確に動作するのでしょうか?
ありがとうございました!よろしく、フロリアン
編集:私は、文字列を検索する場合、今
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | s | s | s | s | 1
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
3 | 0 | s | s | s | 1
4 | a | a | a | a | 1
:私はトム・マックの答えを試みた後にここでの結果は次のとおりです。
私はこのように見える4つのレコードを持っていますs
、私は3つのレコードを取得し、sの関連性で並べ替えます。このことは、レコードはこのような発注する必要があります:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1 <== 8x s
1 | s | s | s | s | 1 <== 4x s
3 | 0 | s | s | s | 1 <== 3x s
は今、私は(テーブルの名前はPAGES
である)このような私のクエリを試してみました:
select t . *
from (
select
match(title) against('*s*' in boolean mode)
+ match(description) against('*s*' in boolean mode)
+ match(filename) against('*s*' in boolean mode)
+ match(tags) against('*s*' in boolean mode)
as matchrank,
bb . *
from pages bb) t
where t.matchrank > 0
order by t.matchrank desc
このクエリは、これを返します。
matchRank | ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
これはワイルドカードのためですか?私は、文字列*s*
も値がs
であることがわかるはずです...
ワイルドカード解決策は、 'ft_min_word_len'設定の有効な回避策ではないことが判明しました。この設定を1に変更し、mysqlを再起動することをお勧めします。あなたは 'LIKE'を使って回避策を書くことができませんでしたが、複数の文字列と4文字以下でうまく動作しません。 –