0

私は都市と州のデータベースを持っています (約 43,000)。次のように全文検索を行います。

select city, state, match(city, state_short, state) against (:q in boolean mode) as score
from zipcodes where
match(city, state_short, state) against (:q in boolean mode)
group by city, state order by score desc limit 6

意味のある文字列に置き換える:qと機能しますが、 を検索するとしhouston texasましょう。結果を最初にしたいのですが、代わりに3番目です。

  • North Houston, Texas
  • South Houston, Texas
  • Houston, Texas

どうすればHouston, Texas他の2人よりも体重を増やすことができますか? これは明らかに、このような他の都市でも同じはずです。

編集

これはうまくいきます、それについて何か考えはありますか?

SELECT * FROM (
    SELECT city, state, MATCH(city, state_short, state) AGAINST (:q IN BOOLEAN MODE) as score
    FROM zipcodes
    WHERE MATCH(city, state_short, state) AGAINST (:q IN BOOLEAN MODE)
    GROUP BY city, state
    ORDER BY score DESC LIMIT 6
) AS tbl
ORDER BY score DESC, LENGTH(city)
4

1 に答える 1

1

新しいクエリは機能する可能性がありますが、完全に状況に依存します。を行う代わりにORDER BY LENGTH(city)、次のようなORDER BY ABS(LENGTH(:q) - (LENGTH(city) + LENGTH(state)))方がよいでしょう。これは完璧ではありませんが、入力と同じ長さでスコアが高いものはおそらく探しているものなので、より良いはずです。最終的なクエリは次のようになります。

SELECT city, state, MATCH(city, state_short, state) AGAINST (:q IN BOOLEAN MODE) AS score
FROM zipcodes
WHERE MATCH(city, state_short, state) AGAINST (:q IN BOOLEAN MODE)
GROUP BY city, state
ORDER BY score DESC, ABS(LENGTH(:q) - (LENGTH(city) + LENGTH(state))) DESC LIMIT 6

新しいORDER BY句をメイン クエリに移動して、サブクエリを削除しました。これにより、同じ (またはより正確な) 結果が得られるはずです。

レーベンシュタイン距離はおそらくこれのより正確な尺度ですが、MySQL にはネイティブ実装がありません。 この投稿には、レーベンシュタイン距離関数の MySQL 実装に関する詳細情報が含まれています。

于 2013-03-21T14:16:21.113 に答える