Как получить результат сопоставления MySQL в виде процентов? - PullRequest
3 голосов
/ 10 марта 2011

Я использую Match (Col1) Against (Val) в mysql.

select match(body) against(body_var) from articles;

теперь в случае полного совпадения я получаю результат в виде числа (например, 14.43).что означает это число?и главный вопрос: Могу ли я получить результат в процентном виде (например, 0,94)
спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Вероятно, есть НАМНОГО более простой способ сделать это .. Каким-то образом я упал в кроличью нору на этом .. Но он проверен и работает (возвращает процент результатов)

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

Вы также можете округлить его до двух десятичных знаков ...

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;

Как я уже сказал ... Я проверил его на 358 строках с 50 совпадениями 50/ 350 = 0,1396648 ... (для первого результата) 0,14 для округленного результата


Если вы хотите преобразовать значение релевантности в процент для одного результата - это действительно не произойдет ...

Значение релевантности из MATCH / AGAINST не является хорошим индикатором совпадения процентов. Это подробно рассматривается в Интернете. Поиск "Преобразовать значение релевантности в проценты" ...

Если вы хотите упорядочить свои результаты по процентам совпадений с первым соответствием, при этом первое совпадение всегда будет иметь 100% -ное совпадение, вы можете сделать это ...

Что касается попытки получить значение, аналогичное PHP__yxt_text, - выАрканзасЛучше переложить эту работу на клиента ...

Значение полнотекстового поиска измеряется в?

http://forums.mysql.com/read.php?107,125239,146610#msg-146610

http://seminex.blogspot.com/2005/06/mysql-relevance-in-fulltext-search.html

0 голосов
/ 22 марта 2018

Обход, который я придумал, состоит в том, чтобы найти наилучшие совпадения и использовать их, чтобы получить процентные значения относительно этих максимумов, в этом случае это может быть не совсем полезно, но это, безусловно, дает вам представление.Я использую этот метод для поиска дубликатов, сначала я вставляю строку, а затем запускаю этот запрос, конечно же, наилучшее совпадение - это та же строка.

Сначала я должен выбрать наилучшее совпадение:

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

Я не верю этомуэто лучшее решение, но оно хорошо в моем случае.

...