2017-10-24 7 views
0

mysqls MATCH() ... AGAINST()를 사용하여 문제가 발생했습니다.mysqls MATCH() 상단의 전체 수학과 비교() 관련성

내 문제를 해결하기가 더 쉬울 수도 있기 때문에 작은 SQLFiddle을 만들었습니다.

필자는 "Foo Bar Foo"가 "Foo Bar"와 더 관련이있는 이유를 완전히 이해하고 있습니다. 하지만 내가 원했던 것은 "전체 일치"용어는 "전체 일치 및 조금 더"라는 용어보다 높은 관련성으로 처리된다는 것입니다.

title   relevance 
Foo Bar  0.046829063445329666 
Foo Bar Foo 0.031219376251101494 
Foo   0 
Bar   0 

"union"을 사용하여 두 명령문을 결합하지 않고도이 결과를 사용할 수 있습니까?

대답 (고든 리노 프 덕분에) :

SELECT * 
FROM FOOBAR 
WHERE title LIKE '%Foo Bar%' 
ORDER BY (CASE WHEN title LIKE 'Foo Bar%' THEN 1 ELSE 0 end) DESC, 
     MATCH (title) AGAINST ('Foo Bar' IN BOOLEAN MODE) ASC 

답변

1

당신은 당신이 order by에서 원하는 것을 할 수 있습니다. 한 가지 방법은 관련 오름차순으로 일치하고 각 그룹 내에서 다른 단어 순서의 수를 계산하는 것입니다 :

SELECT fb.*, 
     MATCH (title) AGAINST ('+Foo +Bar' IN BOOLEAN MODE) AS relevance 
FROM FOOBAR fb 
ORDER BY ((case when title like '%Foo%' then 1 else 0 end) + 
      (case when title like '%Bar%' then 1 else 0 end) 
     ) desc, 
     relevance asc 

이 말은 예를 들어 데이터를 원하는 것을. 관련성 계산에는 단어가 일치하는 횟수와 문자열의 길이 외에 다른 요인이 있기 때문에 일반적으로 작동하지 않을 수 있습니다.

+0

내가 원하는 것! 감사! 내 시작점을 약간 수정 한 버전으로 업데이트하겠습니다. :) –