programing

MySQL match() again() - 관련성과 컬럼에 따른 순서?

procenter 2022. 12. 29. 21:40
반응형

MySQL match() again() - 관련성과 컬럼에 따른 순서?

여러 열에 대해 전체 텍스트 검색을 수행하려고 합니다. 다음과 같이 단순합니다.

SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)

이제 관련성에 따라 순서를 정하겠습니다. (몇 개의 단어가 검색됩니까?) 다음과 같은 작업을 수행할 수 있습니다.

SELECT * , MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE) AS relevance 
FROM pages
WHERE MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE)
ORDER BY relevance

을 잃은 , 이 .head★★★★★★ 。

컬럼을 수 것 는 두 개의 관련 컬럼을 만들 수 있을 것 같습니다.head는 ★★★★★★★★★★★★★★★★★용body이 시점에서 테이블에서 같은 검색을 3회 실시합니다.또, 이 기능을 작성하기 위해서는, 쿼리가 다른 테이블과 결합해 매칭되기 때문에, 퍼포먼스가 중요합니다.

그래서 중요한 질문은 관련성을 검색하고 특정 열의 우선순위를 매길 수 있는 더 빠른 방법은 없을까 하는 것입니다.(또한 보너스로서는 단어들이 컬럼에서 발생하는 횟수를 관련 수로 계산해도 될까요?)

어떤 제안이나 조언이라도 좋습니다.

주의: LAMP 서버에서 실행합니다.(로컬 테스트에서는 WAMP)

그러면 원하는 머리 부분과의 관련성이 높아질 수 있습니다.두 배로 늘지는 않겠지만, 당신을 위해서도 충분히 좋을지도 모릅니다.

SELECT pages.*,
       MATCH (head, body) AGAINST ('some words') AS relevance,
       MATCH (head) AGAINST ('some words') AS title_relevance
FROM pages
WHERE MATCH (head, body) AGAINST ('some words')
ORDER BY title_relevance DESC, relevance DESC

-- alternatively:
ORDER BY title_relevance + relevance DESC

DB 엔진을 전환할 수 있는 유연성이 있다면 Postgres도 검토해야 합니다.연산자의 가중치를 설정하고 랭킹을 조작할 수 있습니다.

필요한 사람을 더하면..테이블 바꾸는 거 잊지 마!

ALTER TABLE table_name ADD FULLTEXT(column_name);

한 번도 안 해봤는데,

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

머리에 있는 성냥에 무게를 두 배로 줘야 해


문서 페이지에서 이 코멘트를 읽어보세요.귀사에 도움이 될 수 있다고 생각합니다.

Patrick O'Lone에 의해 2002년 12월 9일 오전6시 51분

매뉴얼에서는 IN BOUALAL MODE는 거의 항상 1.0의 관련성을 반환한다는 점에 유의해야 합니다.의미 있는 관련성을 얻으려면 다음을 수행해야 합니다.

SELECT MATCH('Content') AGAINST ('keyword1 keyword2') as Relevance 
FROM table 
WHERE MATCH ('Content') AGAINST('+keyword1+keyword2' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
ORDER BY Relevance DESC 

BOUALAN MODE를 사용하는 WHERE 절과 결합된 관련성 요소를 얻기 위해 일반 관련성 쿼리를 수행하고 있습니다.BOUALAN MODE는 BOUAL 검색의 요건을 충족하는 서브셋을 제공하며, 관련성 쿼리는 관련성 요소를 충족하며, HAVING 절(이 경우)은 문서가 검색과 관련성이 있는지 확인합니다(즉, 0.2점 미만의 문서는 관련이 없는 것으로 간주됩니다).또한 관련성에 따라 순서를 지정할 수도 있습니다.

메일링 리스트에서 읽은 코멘트에 따르면 IN BOULLAN MODE의 관련성 순위는 그다지 복잡하지 않기 때문에 실제로 관련 문서를 제공하는 데 도움이 되지 않습니다.BTW - 2개의 MATCH 구가 다른 경우에도 MySQL이 FULLTEXT 검색을 1회만 수행하는 것으로 나타나기 때문에 성능 저하를 알아차리지 못했습니다.이것을 증명하려면 EXPLY를 사용합니다.

따라서 전체 텍스트 검색을 두 번 호출하는 것에 대해 걱정할 필요는 없지만 "이것을 증명하기 위해 설명"을 사용해야 합니다.

나도 이거 가지고 장난친 거야.가중치를 추가할 수 있는 한 가지 방법은 코드의 ORDER BY 영역에 있습니다.

예를 들어, 3개의 서로 다른 열을 일치시키고 특정 열의 가중치를 높이려는 경우:

SELECT search.*,
MATCH (name) AGAINST ('black' IN BOOLEAN MODE) AS name_match,
MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE) AS keyword_match,
MATCH (description) AGAINST ('black' IN BOOLEAN MODE) AS description_match
FROM search
WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE)
ORDER BY (name_match * 3  + keyword_match * 2  + description_match) DESC LIMIT 0,100;

덧붙여 커스텀 랭킹을 사용하고 있는 경우는, WHERE 대신에 HAVING을 사용해 부하를 경감하는 것을 잊지 말아 주세요.

SELECT MATCH(x,y) AGAINST (? IN BOOLEAN MODE) AS r1,
MATCH(z) AGAINST (? IN BOOLEAN MODE) AS r2,
...
FROM table 
HAVING (r1 + r2) > 0
ORDER BY (r1 * 3 + r2) DESC
LIMIT 10

언급URL : https://stackoverflow.com/questions/6259647/mysql-match-against-order-by-relevance-and-column

반응형