2011-12-07 6 views
0

테이블 구조는 :PHP MySQL의 검색 전체 텍스트

Companies: id, name, city, branch, keywords, country 

키워드 필드는 지금 단지 'musicfactory 런던을'리턴 '% 음악 런던 %'예를 들어 와일드 카드와 함께 LIKE를 사용, 함께 이름 도시와 분기를 포함

그러나 예를 들어 사용자가 London (레스토랑)의 Vini & Magraine을 검색하려고하는데 입력이 'vini londen'인 경우 사용자가 'magraine london'을 삽입하면 정확하지 않습니다. 발견 될 것이다.

그래서 문제는 prob 키워드가 순서입니다, 지금 전 텍스트 검색으로 변환 할 계획입니다, 키워드 필드에 색인을 만들었습니다 또한 키워드 필드 스마트 아이디어입니까? 올바른 결과를 반환하지 않습니다 그러나

SELECT id, name, branch FROM companies WHERE MATCH(keywords) AGAINST(? IN BOOLEAN MODE) AND country = ? LIMIT 7 

:

내 주요 질문은 내가이 쿼리와 전체 텍스트 검색을 창조인가? 최선의 해결책은 무엇입니까?

읽어 주셔서 감사합니다.

답변

1

이것은 연산자에 대한 표준 일치를 잘 보여줍니다. 그것은 당신의 쿼리를 작성하는 방법을 명확히해야한다 : 내가 제대로 당신이 회사 테이블의 "키워드"열이 좋습니다 묻는하고 질문을 읽으면

http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

- 내가 말하는 당신 방법에 따라 달라집니다 그것을 채우지 만 확실히, 나쁘지 않습니다. 이전에 관련 필드 모음의 모든 표준 텍스트가 포함 된 집단 키워드 열을 사용했는데 잘 수행되었습니다.

몇 가지 다른 음 -

1) 나는 당신의 LIKE 예는 결함이 생각하고 그 규칙에 의해 나는 당신이 어떤 결과를 얻었다 놀랐어요. %는 방향을 나타내는 와일드 카드입니다. 그래서 '% music london %'는 'musicfactory london'을 반환하지 않아야합니다. 그게 작동하도록 WHERE (keywords LIKE '% music %'AND keywords LIKE '% london %')로 써야합니다.

2) 전체 텍스트 검색은 MyISAM 테이블에서만 사용할 수 있으므로 innoDB에 의존하는 프레임 워크를 사용한다면 관계형 임시 해결 방법을 만들어야합니다. (또는 innoDB를 사용하는 다른 이유)

3)에 대한 match는 기본적으로 ini 설정의 디폴트 최소 문자 수 4입니다. 설정에서 그 값을 더 낮게 설정 한 다음 최소 문자 범위가 필요한 경우 전체 텍스트 인덱스를 다시 작성해야합니다. '예술'과 같은 단어를 고려하면이 값을 낮추는 것이 좋은 이유를 알 수 있습니다. 그렇지 않으면 짧은 문자열에 대해 일치 모드와 LIKE 모드 사이를 전환하기위한 조건을 작성해야 할 수 있습니다.

+0

여기서 한 말을 다시 확인할 수 있습니까? 데이터베이스가 innoDB입니까? 일치하는 경우에 당신과 당신을 위해 작동하지 않습니다 당신은 해결 방법을 고려해야합니다. 확인할 수 있습니까? 그 외에, 자신이 정의한 일련의 연산자를 기반으로 쿼리 문자열을 작성할 수 있습니다. regex를 사용하면 예를 들어 따옴표, 쉼표 등 검색 용어의 특정 항목을 쉽게 식별 할 수 있습니다. 그런 다음이를 사용하여 용어와 일치하는 항목을 수정하는 데 필요한 (+, - 등)를 결정할 수 있습니다. –