답변:
일반적으로 "정밀도"와 "리콜"사이에는 상충 관계가 있습니다. 높은 정밀도는 관련성이없는 결과가 더 적다는 것을 의미하고 (오 탐지 없음), 높은 회수율은 관련 결과가 더 적다는 것을 의미합니다 (거짓이 없음). LIKE 연산자를 사용하면 회수 할 필요없이 100 % 정밀도를 얻을 수 있습니다. 전체 텍스트 검색 기능을 사용하면 더 나은 리콜을 위해 정밀도를 조정할 수있는 유연성이 많이 있습니다.
대부분의 전체 텍스트 검색 구현은 "반전 인덱스"를 사용합니다. 이는 키가 개별 용어 인 색인이며 관련 값은 해당 용어를 포함하는 레코드 세트입니다. 전체 텍스트 검색은 이러한 레코드 세트의 교집합, 합집합 등을 계산하도록 최적화되어 있으며 일반적으로 주어진 레코드가 검색 키워드와 얼마나 강력하게 일치 하는지를 평가하는 순위 알고리즘을 제공합니다.
SQL LIKE 연산자는 매우 비효율적 일 수 있습니다. 인덱싱되지 않은 열에 적용하면 인덱싱되지 않은 필드의 쿼리와 마찬가지로 전체 검색이 일치 항목을 찾는 데 사용됩니다. 열이 인덱스 된 경우 인덱스 키에 대해 일치를 수행 할 수 있지만 대부분의 인덱스 조회보다 효율성이 훨씬 낮습니다. 최악의 경우, LIKE 패턴에는 모든 인덱스 키를 검사해야하는 선행 와일드 카드가 있습니다. 반대로 많은 정보 검색 시스템은 선택된 필드에서 접미사 트리를 미리 컴파일하여 선행 와일드 카드를 지원할 수 있습니다.
전체 텍스트 검색의 일반적인 다른 기능은 다음과 같습니다.
FTS는 많은 레코드를 신속하게 검색 할 수 있도록 텍스트 필드 내의 개별 단어를 색인화합니다. LIKE를 사용하려면 필드 내에서 문자열 검색 (선형 등)을 수행해야합니다.
MySQL은 활성화 된 전체 텍스트 검색 열의 단어에서 색인을 생성하고이 색인에서 검색을 수행합니다. MySQL은 정교한 알고리즘을 사용하여 검색 쿼리와 일치하는 행을 결정합니다.
또한 이 SO 답변에서 :
전체 텍스트 검색에는 몇 가지 장점이 있습니다.
인덱싱 :
다음과 같은 것 :
WHERE Foo LIKE '%Bar';
인덱스를 이용할 수 없습니다. 모든 단일 행을보고 일치하는지 확인해야합니다. 그러나 전체 텍스트 인덱스는 가능합니다. 실제로 전체 텍스트 색인은 단어 일치 순서, 단어가 얼마나 가까운 지 등의 측면에서 훨씬 더 융통성을 제공 할 수 있습니다.
줄기 :
전체 텍스트 검색은 단어를 막을 수 있습니다. 실행을 검색하면 "ran"또는 "running"에 대한 결과를 얻을 수 있습니다. 대부분의 전체 텍스트 엔진에는 다양한 언어로 된 줄기 사전이 있습니다.
가중 결과 :
전체 텍스트 인덱스는 여러 열을 포함 할 수 있습니다. 예를 들어 "peach pie"를 검색하면 색인에 제목, 키워드 및 본문이 포함될 수 있습니다. 제목과 일치하는 결과는 관련성이 높을수록 가중치가 높을 수 있으며 맨 위 근처에 표시되도록 정렬 할 수 있습니다.
단점 :
전체 텍스트 인덱스는 표준 B-TREE 인덱스보다 몇 배 더 클 수 있습니다. 이러한 이유로 데이터베이스 인스턴스를 제공하는 많은 호스팅 제공 업체는이 기능을 비활성화하거나 추가 요금을 청구합니다. 예를 들어, 마지막으로 확인한 Windows Azure는 전체 텍스트 쿼리를 지원하지 않았습니다.
전체 텍스트 인덱스도 업데이트 속도가 느려질 수 있습니다. 데이터가 많이 변경되면 표준 인덱스와 비교하여 지연 업데이트 인덱스가있을 수 있습니다.
실제 차이점은 스캔 방법입니다. 전체 텍스트 검색의 경우 단어 (용어)가 해시 키로 사용됩니다. 각 키는 용어 (용어)가 나타나는 문서 배열과 관련이 있습니다.
Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}
이제 용어 문서 매트릭스 (어떤 문서의 멤버)를 다음과 같이 나타낼 수 있습니다.
t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}
"단어 / 용어 t1이 포함 된 모든 문서 가져 오기"를 요청하면 문서 세트 {d1, d5, d9,.. dn
}가 리턴됩니다.
정규화되지 않은 테이블 스키마를 해킹하여 문서를 저장할 수 있습니다. MySQL 테이블의 각 행은 "문서"로 간주되고 TEXT 열에는 단락 등이 포함될 수 있습니다. 반전 된 색인에는 용어가 해시 키 및 행 ID로 포함됩니다. 문서 ID로.
이 SQL 쿼리는 다소 O (1) 성능을 갖습니다. 쿼리는 독립적입니다
예를 들어이 SQL을 실행하여 주어진 단어 XYZ와 일치하는 모든 행을 추출 할 수 있습니다.
SELECT *
FROM my_table
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ;
주의 사항 :이 쿼리에 ORDER BY를 추가하면 런타임은 여러 매개 변수에 따라 달라지며 그 중 하나는 일치하는 행 / 문서 수입니다. 그러니 조심하십시오.
그러나 LIKE는 이것에 대해 아무것도 얻지 못했습니다. 문장 / 문자열을 선형 적으로 스캔하고 일치하는 모든 용어를 찾아야합니다. 와일드 카드를 추가하면 엉망이됩니다. 상상할 수 있듯이 작은 길이의 문자열에는 효과적이지만 더 긴 문장에는 비참하게 실패합니다. 단락이나 전체 텍스트 페이지 등을 가질 때 확실히 비교할 수 없습니다.
FTS는보다 효율적이고 강력합니다 (특히 단어 분리기 및 형태소 분석 기능의 경우). 그러나 DB는 모든 언어를 지원하지 않기 때문에 요구 사항을 확인하십시오. 예를 들어 MSSQL은 그리스어를 지원하지 않습니다 ( http : // msdn 에서이 페이지를 확인하십시오) . microsoft.com/en-us/library/ms176076(v=sql.110).aspx )