사용자가 하나의 필드 만 가지고있는 MySQL에서 검색을 시도하고 있습니다. 표는 다음과 같습니다 : 사용자의 입력이 단지 blah blubber
, 검색은 모든 단어 어떠했는지를 확인해야하는 경우 MySQL : MySQL 관련 검색을 사용하는 특수 검색 알고리즘
ID BIGINT
TITLE TEXT
DESCRIPTION TEXT
FILENAME TEXT
TAGS TEXT
ACTIVE TINYINT
지금 필드
TITLE
,
DESCRIOTION
,
FILENAME
또는
TAGS
에 나타납니다. 결과 자체는 관련성에 따라 정렬되어야하므로 레코드에 문자열이 얼마나 자주 표시되는지. I이 예 데이터를 얻었다 :
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | blah | blah | bdsai | bdha | 1
2 | blubber | blah | blah | adsb | 1
3 | blah | dsabsadsab | dnsa | dsa | 1
이 예에서, ID (2)는, 상단 (2 × ㅋ, 1X 두툼한)이어야 후 1 (배 ㅋ), 그리고 (3) (1X ㅋ). 이 과정은 동적이어야하므로 사용자는 더 많은 단어를 입력 할 수 있고 관련성은 하나 또는 여러 단어와 동일하게 작동합니다.
MySQL에서만 실현 가능합니까 아니면 일부 PHP를 사용해야합니까? 이것이 정확히 어떻게 작동할까요?
도움 주셔서 감사합니다. 감사합니다, 플로리안
편집 : 문자열을 검색하는 경우, 지금
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | s | s | s | s | 1
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
3 | 0 | s | s | s | 1
4 | a | a | a | a | 1
: I는 다음과 같이 네 개의 레코드가
: 여기 결과는 내가 톰 맥의 대답을 시도 이후 s
, 나는 s의 관련성에 따라 정렬 된 상위 3 개의 레코드 만 가져야합니다. 이 기록이 같은 주문자해야 의미 :
matchRank | ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
:
select t . *
from (
select
match(title) against('*s*' in boolean mode)
+ match(description) against('*s*' in boolean mode)
+ match(filename) against('*s*' in boolean mode)
+ match(tags) against('*s*' in boolean mode)
as matchrank,
bb . *
from pages bb) t
where t.matchrank > 0
order by t.matchrank desc
이 쿼리는이를 반환 : 이제
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1 <== 8x s
1 | s | s | s | s | 1 <== 4x s
3 | 0 | s | s | s | 1 <== 3x s
, 나는 (테이블의 이름이 PAGES
입니다)이처럼 내 쿼리를 시도
와일드 카드 때문입니까? 제 생각에는 문자열 *s*
도 단지 s
인 값을 찾아야합니다 ...
와일드 카드 솔루션은 'ft_min_word_len'설정에 대한 유효한 해결 방법이 아닙니다. 가장 좋은 방법은이 설정을 1로 변경하고 mysql을 재시작하는 것이다. 'LIKE'을 사용하여 회피 방법을 쓸 수는 없지만 하나 이상의 문자열에 & 4 자 미만의 문자는 잘 작동하지 않습니다. ('s') –