ホームページ  >  記事  >  バックエンド開発  >  PHP+MYSQL複数キーワード+あいまい検索+一致ソートの実装方法を教えてください。

PHP+MYSQL複数キーワード+あいまい検索+一致ソートの実装方法を教えてください。

WBOY
WBOYオリジナル
2016-06-23 14:23:271603ブラウズ

mysql php のあいまい検索ソート

MYSQL の UNION を使用して実装しましたが、効率が悪すぎるため、より良い方法がないかフォーラムの専門家に質問したいと思います。

ディスカッションへの返信 (解決策)

テーブル構造と SQL を投稿します

この投稿は、2013-02-23 10:18:55 に xuzuning によって最終編集されました

sql:
(SELECT a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` FROM `phpcms_ask` a LEFT JOIN `phpcms_ask_posts` b ON a.`askid`=b.`askid` WHERE (a.status=3 OR a.status=5) AND (LOCATE('中国北京天安门',a.`title`)>0) AND b.`isask`=1)UNION (SELECT a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` FROM `phpcms_ask` a LEFT JOIN `phpcms_ask_posts` b ON a.`askid`=b.`askid` WHERE (a.status=3 OR a.status=5) AND (LOCATE('中国',a.`title`)>0 AND LOCATE('北京',a.`title`)>0 AND LOCATE('天安门',a.`title`)>0) AND b.`isask`=1) UNION (SELECT a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` FROM `phpcms_ask` a LEFT JOIN `phpcms_ask_posts` b ON a.`askid`=b.`askid` WHERE (a.status=3 OR a.status=5) AND (LOCATE('中国',a.`title`)>0 AND LOCATE('北京',a.`title`)>0) AND b.`isask`=1)UNION(SELECT a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` FROM `phpcms_ask` a LEFT JOIN `phpcms_ask_posts` b ON a.`askid`=b.`askid` WHERE (a.status=3 OR a.status=5) AND (LOCATE('北京',a.`title`)>0 AND LOCATE('天安门',a.`title`)>0) AND b.`isask`=1)UNION(SELECT a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` FROM `phpcms_ask` a LEFT JOIN `phpcms_ask_posts` b ON a.`askid`=b.`askid` WHERE (a.status=3 OR a.status=5) AND (LOCATE('中国',a.`title`)>0 OR LOCATE('北京',a.`title`)>0 OR LOCATE('天安门',a.`title`)>0) AND b.`isask`=1)LIMIT 0,20

phpcms_ask table :アスクイドcatid タイトル タグ 報酬 ユーザー ID ユーザー名 addtime 終了時刻 ステータス フラグ 回答数 匿名性 ヒット ischeck


phpcms_ask_posts テーブル: pid askid isask メッセージ addtime 返信 rptime 候補 最適な復帰 ユーザー ID ステータス 匿名性 ユーザー名

出現回数を数える必要がないので、組み合わせたほうがいいですよね
れーれー

一致度を計算するには、
selectsign(LOCATE('中国',a.`title`))+sign(LOCATE('北京',a.`title`)) するだけです。 +sign(LOCATE('天安門',a.`title`)) as ... からの一致数

出現回数をカウントする必要がないので、一緒にすると良いのではないでしょうか
SQL コード?123SELECT a.`askid`、a.`catid`、a.`title`、a.`status`、a.`addtime`、a.`reward`、a.`answercount`、b.`message` FROM `phpcms_ask` a LEFT JOIN ` phpcms_ask_posts` b……

モデレーターのおかげで、あなたの方法は非常に効果的です。 !今はもっと速くなりました。

一致度ソートの実装方法

一致度を計算するには、
selectsign(LOCATE('China',a.`title`))+sign(LOCATE('Beijing',a.`title `)) するだけです。 +sign(LOCATE('天安門',a.`title`)) as ... からの一致数

モデレータ 質問してください: 指定された単語がフィールドに出現する回数で並べ替えるにはどうすればよいですか? 1 つのフィールドのみでクエリを実行します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。