3

mysqlで Match(Col1)Against(Val)を使用しています。

記事からmatch(body)against(body_var)を選択します。

今、完全に一致する場合、私は数値として結果を取得しています(たとえば14.43)。この数字はどういう意味ですか?主な質問は、結果をパーセンテージ形式(たとえば、0.94)で取得できる
かどうかです 。ご協力いただきありがとうございます。

4

2 に答える 2

1

これを行うにはおそらくはるかに簡単な方法があります..どういうわけか私はこれでウサギの穴に落ちました..しかし、それはテストされて動作します(結果のパーセンテージを返します)

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

于 2011-03-10T11:06:02.443 に答える
0

私が思いついた回避策は、最適な一致を見つけ、それらを使用してこれらの最大値に対するパーセンテージ値を設定することです。この場合、これは完全には役に立たない可能性がありますが、確かにアイデアが得られます。このメソッドを使用して重複を探します。最初に行を挿入してからこのクエリを実行します。もちろん、最適な一致は同じ行です。

まず、最適なものを選択する必要があります。

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

これが最善の解決策だとは思いませんが、私の場合はうまくいきます。

于 2018-03-22T00:47:42.793 に答える