mysqlで Match(Col1)Against(Val)を使用しています。
記事からmatch(body)against(body_var)を選択します。
今、完全に一致する場合、私は数値として結果を取得しています(たとえば14.43)。この数字はどういう意味ですか?主な質問は、結果をパーセンテージ形式(たとえば、0.94)で取得できる
かどうかです
。ご協力いただきありがとうございます。
これを行うにはおそらくはるかに簡単な方法があります..どういうわけか私はこれでウサギの穴に落ちました..しかし、それはテストされて動作します(結果のパーセンテージを返します)
SELECT (mthCount / ttlCount) AS mPercent
FROM (
SELECT COUNT( * ) AS mthCount
FROM articles WHERE (
MATCH(body) AGAINST(body_var)
)
) AS MCount JOIN (
SELECT COUNT( * ) AS ttlCount
FROM articles
) AS TCount;
mPercent列を持つ1つのレコード/結果を返します
小数点以下第2位に四捨五入することもできます...
SELECT FORMAT((mthCount / ttlCount),2) AS mPercent
FROM (
SELECT COUNT( * ) AS mthCount
FROM articles WHERE (
MATCH(body) AGAINST(body_var)
)
) AS MCount JOIN (
SELECT COUNT( * ) AS ttlCount
FROM articles
) AS TCount;
私が言ったように..私は50の一致で358行に対してそれをテストしました50/350=0.1396648 ...(最初の結果の場合)丸められた結果の場合は0.14
単一の結果の関連性の値をパーセントに変換しようとしている場合、それは実際には起こりません...
MATCH / AGAINSTからの関連性の値は、一致率の良い指標ではありません。これはインターネット全体で詳細に説明されています。「関連性の値をパーセントに変換」を検索してください...
関連性の一致率で結果を並べ替えたい場合、最初の結果は常に100%の関連性を持ち、それを行うことができます...
PHPのsimilar_textのような値を取得しようとする場合、その作業をクライアントにオフロードすることをお勧めします...
http://forums.mysql.com/read.php?107,125239,146610#msg-146610
http://seminex.blogspot.com/2005/06/mysql-relevance-in-fulltext-search.html
私が思いついた回避策は、最適な一致を見つけ、それらを使用してこれらの最大値に対するパーセンテージ値を設定することです。この場合、これは完全には役に立たない可能性がありますが、確かにアイデアが得られます。このメソッドを使用して重複を探します。最初に行を挿入してからこのクエリを実行します。もちろん、最適な一致は同じ行です。
まず、最適なものを選択する必要があります。
SELECT
MAX(MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)) AS bscore_col1 ,
MAX(MATCH (table.col2) AGAINST ('text 2'
IN NATURAL LANGUAGE MODE)) AS bscore_col2
FROM table
ORDER BY bscore_name col1 DESC, bscore_col2 DESC) AS bests
もちろん複数の列を追加することもできますが、最初に適切な全文検索インデックスを作成する必要があります。
完全なクエリは最初のクエリの結果を取得し、それらを参照として使用します。比率を0.5に変更できます。0.5は、取得されるスコアが最高スコアの50%を超える必要があることを意味します。すべての結果を取得する場合は、削除します。比較式。
SELECT *,
MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)/bests.bscore_col1 AS score_col1 ,
MATCH (table.col2) AGAINST ('text 2' IN NATURAL LANGUAGE MODE)/bests.bscore_col2 AS score_col2
FROM (table,
(SELECT
MAX(MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)) AS bscore_col1 ,
MAX(MATCH (table.col2) AGAINST ('text 2' IN NATURAL LANGUAGE MODE)) AS bscore_col2
FROM table
ORDER BY bscore_col2 DESC, bscore_col1 DESC) AS bests)
WHERE
MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)/bests.bscore_col1 > 0.5 AND
MATCH (table.col2) AGAINST ('text 2'IN NATURAL LANGUAGE MODE)/bests.bscore_col2 > 0.5
ORDER BY score_col2 DESC, score_col1 DESC
これが最善の解決策だとは思いませんが、私の場合はうまくいきます。