Выберите один найденный результат с MATCH AGAINST

Я пытаюсь получить один результат из строки таблицы

Я использую этот запрос

"SELECT * FROM $tableName WHERE MATCH(nombre, mat1, mat2, mat3, mat4, mat5, mat6, mat7) 
AGAINST ('$busqueda' IN BOOLEAN MODE) 
ORDER BY nombre";

Это, очевидно, выбирает все поля строки, если $busqueda находится в любом из полей.

Есть ли способ выбрать только поле, в котором найден поисковый запрос?

1 ответ

Решение

MATCH(nombre, mat1, mat2, mat3, mat4, mat5, mat6, mat7) действует как единое индексное поле, поэтому, когда какой-либо текст сопоставляется с ним, у него нет возможности сказать, какой бит.

Вы по-прежнему можете сравнивать с полным спредом по скорости сопоставления, как это, и использовать индивидуальные MATCH() вызовы против каждого поля в списке полей (после SELECT на месте *) проверка релевантности для определенного уровня, чтобы определить, какое поле соответствует.

SELECT
   IF(MATCH(nombre) AGAINST ('search phrase' IN BOOLEAN MODE) > 0.9, nombre, NULL) AS nombre,
   IF(MATCH(mat1) AGAINST ('search phrase' IN BOOLEAN MODE) > 0.9, mat1, NULL) AS mat1
   /* etc */
FROM myTable
WHERE MATCH(nombre, mat1, mat2, mat3, mat4, mat5, mat6, mat7) 
      AGAINST ('search phrase' IN BOOLEAN MODE) 
ORDER BY nombre

NULL будут возвращены для полей, которые не совпадают, обратите внимание, что вы можете захотеть FULLTEXT индексы по отдельным полям тоже. Это не абсолютное требование при использовании BOOLEAN MODE если я правильно помню.

Другие вопросы по тегам