전체 텍스트 검색과 LIKE 란 무엇입니까


133

방금 SQL에서 "전체 텍스트 검색"이 언급 된 게시물을 읽었습니다.

FTS와 LIKE의 차이점이 무엇인지 궁금합니다. 나는 몇 기사를 읽었지만 그것을 잘 설명하는 것을 찾을 수 없었습니다.

답변:


164

일반적으로 "정밀도"와 "리콜"사이에는 상충 관계가 있습니다. 높은 정밀도는 관련성이없는 결과가 더 적다는 것을 의미하고 (오 탐지 없음), 높은 회수율은 관련 결과가 더 적다는 것을 의미합니다 (거짓이 없음). LIKE 연산자를 사용하면 회수 할 필요없이 100 % 정밀도를 얻을 수 있습니다. 전체 텍스트 검색 기능을 사용하면 더 나은 리콜을 위해 정밀도를 조정할 수있는 유연성이 많이 있습니다.

대부분의 전체 텍스트 검색 구현은 "반전 인덱스"를 사용합니다. 이는 키가 개별 용어 인 색인이며 관련 값은 해당 용어를 포함하는 레코드 세트입니다. 전체 텍스트 검색은 이러한 레코드 세트의 교집합, 합집합 등을 계산하도록 최적화되어 있으며 일반적으로 주어진 레코드가 검색 키워드와 얼마나 강력하게 일치 하는지를 평가하는 순위 알고리즘을 제공합니다.

SQL LIKE 연산자는 매우 비효율적 일 수 있습니다. 인덱싱되지 않은 열에 적용하면 인덱싱되지 않은 필드의 쿼리와 마찬가지로 전체 검색이 일치 항목을 찾는 데 사용됩니다. 열이 인덱스 된 경우 인덱스 키에 대해 일치를 수행 할 수 있지만 대부분의 인덱스 조회보다 효율성이 훨씬 낮습니다. 최악의 경우, LIKE 패턴에는 모든 인덱스 키를 검사해야하는 선행 와일드 카드가 있습니다. 반대로 많은 정보 검색 시스템은 선택된 필드에서 접미사 트리를 미리 컴파일하여 선행 와일드 카드를 지원할 수 있습니다.

전체 텍스트 검색의 일반적인 다른 기능은 다음과 같습니다.

  • 어휘 분석 또는 토큰 화-구조화되지 않은 텍스트 블록을 개별 단어, 구 및 특수 토큰으로 분리
  • 형태 학적 분석 또는 형태소 분석 — 주어진 단어의 변형을 하나의 색인 용어로 축소; 예를 들어, "마우스"와 "마우스"또는 "전기 화"와 "전기"를 같은 단어로 취급
  • 순위-쿼리 문자열과 일치하는 레코드의 유사성을 측정

2
설명 낫다 순위 VipinJain의 @
ychaouche

39

FTS는 많은 레코드를 신속하게 검색 할 수 있도록 텍스트 필드 내의 개별 단어를 색인화합니다. LIKE를 사용하려면 필드 내에서 문자열 검색 (선형 등)을 수행해야합니다.


23

MySQL은 활성화 된 전체 텍스트 검색 열의 단어에서 색인을 생성하고이 색인에서 검색을 수행합니다. MySQL은 정교한 알고리즘을 사용하여 검색 쿼리와 일치하는 행을 결정합니다.

또한 이 SO 답변에서 :

전체 텍스트 검색에는 몇 가지 장점이 있습니다.

인덱싱 :

다음과 같은 것 :

WHERE Foo LIKE '%Bar';

인덱스를 이용할 수 없습니다. 모든 단일 행을보고 일치하는지 확인해야합니다. 그러나 전체 텍스트 인덱스는 가능합니다. 실제로 전체 텍스트 색인은 단어 일치 순서, 단어가 얼마나 가까운 지 등의 측면에서 훨씬 더 융통성을 제공 할 수 있습니다.

줄기 :

전체 텍스트 검색은 단어를 막을 수 있습니다. 실행을 검색하면 "ran"또는 "running"에 대한 결과를 얻을 수 있습니다. 대부분의 전체 텍스트 엔진에는 다양한 언어로 된 줄기 사전이 있습니다.

가중 결과 :

전체 텍스트 인덱스는 여러 열을 포함 할 수 있습니다. 예를 들어 "peach pie"를 검색하면 색인에 제목, 키워드 및 본문이 포함될 수 있습니다. 제목과 일치하는 결과는 관련성이 높을수록 가중치가 높을 수 있으며 맨 위 근처에 표시되도록 정렬 할 수 있습니다.

단점 :

전체 텍스트 인덱스는 표준 B-TREE 인덱스보다 몇 배 더 클 수 있습니다. 이러한 이유로 데이터베이스 인스턴스를 제공하는 많은 호스팅 제공 업체는이 기능을 비활성화하거나 추가 요금을 청구합니다. 예를 들어, 마지막으로 확인한 Windows Azure는 전체 텍스트 쿼리를 지원하지 않았습니다.

전체 텍스트 인덱스도 업데이트 속도가 느려질 수 있습니다. 데이터가 많이 변경되면 표준 인덱스와 비교하여 지연 업데이트 인덱스가있을 수 있습니다.


16

마찬가지로 와일드 카드 만 사용하며 그렇게 강력하지는 않습니다.

전체 텍스트를 사용하면 And, Or, Not, 심지어 유사한 사운드 결과 (SOUNDEX) 및 더 많은 항목을 포함하여 훨씬 더 복잡한 검색이 가능합니다.

SQL CONTAINS () FREETEXT () 및 관련 전체 텍스트 검색 항목을 살펴보고 사용 가능한 항목을 더 잘 이해할 수 있습니다.


2
내가보기 엔 모두 검사하는 것이 좋습니다 SOUNDEX
sotn

11

실제 차이점은 스캔 방법입니다. 전체 텍스트 검색의 경우 단어 (용어)가 해시 키로 사용됩니다. 각 키는 용어 (용어)가 나타나는 문서 배열과 관련이 있습니다.

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) 성능을 갖습니다. 쿼리는 독립적입니다

  1. TEXT 열의 단어 / 단어 수
  2. 기준과 일치하는 행 / 문서 수
  3. 단어 / 용어의 길이

예를 들어이 SQL을 실행하여 주어진 단어 XYZ와 일치하는 모든 행을 추출 할 수 있습니다.

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

주의 사항 :이 쿼리에 ORDER BY를 추가하면 런타임은 여러 매개 변수에 따라 달라지며 그 중 하나는 일치하는 행 / 문서 수입니다. 그러니 조심하십시오.

그러나 LIKE는 이것에 대해 아무것도 얻지 못했습니다. 문장 / 문자열을 선형 적으로 스캔하고 일치하는 모든 용어를 찾아야합니다. 와일드 카드를 추가하면 엉망이됩니다. 상상할 수 있듯이 작은 길이의 문자열에는 효과적이지만 더 긴 문장에는 비참하게 실패합니다. 단락이나 전체 텍스트 페이지 등을 가질 때 확실히 비교할 수 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.