2011-01-29 6 views
5

나는 많은 쿼리를 사용하고 오타를 계산하기 위해 levenshtein을 사용합니다. 이제 levenshtein은 mysql이 전체 ​​CPU 시간을 차지하도록합니다. 내 쿼리는 UNION 문에서 전체 텍스트 검색 + levenshtein입니다. sql1은 현재 쿼리입니다. sql2는 전체 텍스트 검색으로 너무 빠르며 너무 많이 CPU 시간을 사용하지 않습니다. 마지막 하나는 leventhein 중 하나입니다.levenshtein 대체

누구나 오타를 얻을 수있는 대안이 있습니까? 정규화 데이터에 응답하지 마십시오. 생각해 봤지만 데이터에 적용 할 수 없습니다. 일치/계산을 미리 만들 수 없으며 인덱스가있는 별도의 테이블을 만들 수 없습니다.

  $sql1 = "(SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE)) UNION (SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3) ORDER BY sanction_id"; 

     $sql2 = "SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE) ORDER BY sanction_id"; 

     $sql3 = "SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3"; 

답변

4

MySQL에만 국한되어있는 경우 쉬운 해결책이 아닙니다.

보통 이것은 후보 후보 검색 필터링을 위해 특수 ngram 색인 생성을 사용하고 모든 쌍에 대해 levensthein을 계산하는 것보다 더 빠른 10-50 후보에만 levensthein을 계산하여 해결됩니다. SOLR/루씬 같은

전문 전체 텍스트 검색 엔진이 내장했다.

PostgreSQL의가있다 pg_trgm있는 contrib 모듈 (http://www.postgresql.org/docs/9.0/static/pgtrgm.html)처럼 작동하는 매력.

전체 텍스트 인덱싱을 사용하여 MySQL에서 이것을 시뮬레이트 할 수도 있지만, 모든 문서에서 단어를 수집하여 ngram으로 변환하고, 전체 텍스트 인덱스를 만들고, 모두 검색하여 빠른 검색을 수행해야합니다. 이중화, 동기화와 같은 모든 종류의 문제가 발생합니다. 시간 가치가 없습니다.

관련 문제