2010-12-10 4 views
5

Im '문자열을 일치시키기 위해 mysql을 사용하여 전체 텍스트 검색을 시도합니다. 문제는 처음에는 이상한 결과를 반환한다는 것입니다.MySQL 일치 전체 텍스트

예를 들어, 문자열은 '2.0 TDI를 PASSAT'

  AND MATCH (
      records_veiculos.titulo, records_veiculos.descricao 
      ) 
      AGAINST (
      'passat 2.0 tdi' WITH QUERY EXPANSION 
      ) 

(나머지는 괜찮) 첫 번째 결과로이 반환 : 더이 이후

Volkswagen Passat Variant 1.9 TDI- ANO 2003 

느릅 나무는 잘못 없다 이 예에서는 "2.0"입니다.

무엇이 될 수 있습니까?

편집 : 또한,이 때문에 아마도이 검색 방법 자체에 대한 가장 좋은 것, 대용량 데이터베이스 (500.000 기록까지 기대를) 할 것이다, 또는이 스핑크스와 같은 다른 검색 엔진을 설치하는 것이 좋습니다 것입니까? 또는 그렇지 않은 경우 관련 결과를 표시하는 방법은 무엇입니까?

EDIT2 : 질문에도 불구하고 기록에 대해서는 대답으로, MySQL의 구분 기호의 문제가 지속, 그래서 사람이 구분 기호를 탈출하는 방법에 대한 제안이있는 경우, 그것은에서 500 점을 높이 평가 가치가있을 것입니다 표시되고 말뚝. 나는 결과 집합을 증가 발견 sollution처럼, 내가 필요한 단어를 얻기 위해 엔진을 강제로 연산자를 사용하여, 인디애나의 BOOLEAN 모드와 쿼리 확장을 대체하는 것이 었습니다 : 그것은 전혀 해결되지 않았다

AND MATCH (
records_veiculos.titulo, records_veiculos.descricao 
) 
AGAINST (
'+passat +2.0 +tdi' IN BOOLEAN MODE 
) 

하지만, 최소한 결과의 관련성이 크게 변경되었습니다.

답변

5

가 난 단지 인덱스를 MySQL과 4 개 이상의 문자와 단어를 일치 생각합니다. 또한 그 기간을 벗어날 수 있습니까? 이것을 무시하거나 정지 문자로 사용할 수도 있습니다. 에서

+2

+1 이것이 왜 부정 투표를했는지 생각할 수 없습니다. 아주 사실. 'FULLTEXT' 인덱스에 대해 서버 와이드 기본 설정이 변경되지 않으면'2.0'이 이스케이프되는지 여부가 무시됩니다. – Orbling

+1

@Yoda : 특히 'ft_max_word_len'에 대해 읽으십시오. http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html – Orbling

+0

문자를 이스케이프하는 방법에 대한 제안이 있으십니까? 나는 '\'을 사용해 보았는데 성공하지 못했습니다. – yoda

4

그 결과로 반환되는 일치 순위는 무엇입니까? 경기에는 Google과 같이 작동하고 일부 단어 만 일치시켜야한다는 모든 이해가 포함되어야합니다.

WITH QUERY EXPANSION을 추가하면 자동으로 "관련"단어에 대한 두 번째 검색이 실행됩니다.이 단어는 사용자가 입력하지 않은 것일 수 있지만 전체 텍스트 엔진은 아마도 관련 있다고 간주합니다.

관련 문서 : 기본적으로 http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html

+1

왜 이것이 부정적인 투표를 받았습니까? – Orbling

+2

나에게 같은 것을 물었다. 결정된. 멍청한 사람들. – methodin

+0

@methodin 환호. – Orbling

7

MySQL documentation on Fulltext search :; "."

는 "(공간)", "(쉼표)와"단어 시작 및 종료 특정 구분 문자를 찾아서 곳 FULLTEXT 파서가 결정하는 예는 " (기간)."

이것은 마침표가 2와 0을 구분한다는 것을 의미합니다. 따라서 '2.0'을 찾고 있지 않습니다. 그것은 '2'와 '0'을 찾고 그것을 찾지 못합니다. QUERY EXPANSION을 사용하면 관련된 관련 단어가 표시되어 결과 순위에서 '2'와 '0'이 개별 단어가 될 필요가 없습니다. 최소 문자가 시행 될 수도 있습니다.

+0

문자를 이스케이프하는 방법에 대한 제안이 있으십니까? 나는 '\'을 사용해 보았는데 성공하지 못했습니다. – yoda

1

"." 조회 결과에서 2003과 일치하는 항목입니다.

3 문자 문자열에 대한 검색을 수행하려면 mysql 구성에서 ft_min_word_len = 3 을 설정하고 mysql을 다시 시작해야합니다. 그렇지 않으면 "TDI-"가있는 행은 색인되지만 "TDI"는 색인 된 행이 없기 때문에 "tdi"를 검색하면 "TDI-"가 아닌 "TDI"만있는 결과가 반환됩니다.

구성을 변경 한 후에는 해당 테이블에서 색인을 다시 작성해야합니다. (경고 : 귀하의 색인은 현재 상당히 클 수 있습니다.)

+0

입력 해 주셔서 감사합니다.하지만 이미 대부분의 문제에 대해 논의했으며 문제가 남아 있습니다. – yoda