データベースから関連する結果を見つける、自分の Web サイトの検索機能を作成しています。単語の出現回数をカウントする方法を探していますが、単語の両側に単語の境界があることを確認する必要があります (したがって、「リッピング」が必要なときに「トリプル」になってしまうことはありません)。
誰にもアイデアはありますか?
人々は私の質問を誤解しています:
単一の行内でそのような発生回数をカウントするにはどうすればよいですか?
これは、リレーショナル データベースが得意とする類のものではありません。ただし、フルテキスト インデックスを使用できず、InnoDB を使用しているため使用できないと既に述べている場合を除きます。関連する行を選択し、アプリケーション コードでワード カウントを行うことをお勧めします。
この倒錯した方法を試すことができます:
SELECT
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
このようなものが機能するはずです:
フィールド名REGEXP'[[:<:]] word [[:>:]]';のテーブルからcount(*)を選択します。
厄介な詳細は、MySQLマニュアルのセクション11.4.2にあります。
検索が必要な場合は、Sphinx や Lucene などをお勧めします。Sphinx は (独立した全文インデクサーとして) セットアップと実行がはるかに簡単です。高速に実行され、インデックスを非常に高速に生成します。MyISAM を使用していたとしても、それを使用することをお勧めします。MyISAM の全文索引よりもはるかに強力です。
また、MySQL と (ある程度) 統合することもできます。
LIKE や REGEXP などはスケーリングされません (左端のプレフィックスが一致しない限り)。
代わりに、やりたいことにフルテキスト インデックスを使用することを検討してください。
select count(*) from yourtable where match(title, body) against ('some_word');
以下のリンクで説明されている手法を使用しました。このメソッドは、 MySQL の 使用length
と機能を使用します。replace
使用している DBMS によって異なりますが、これを実行できる UDF を作成できるものもあります。