문제

방금 SQL에서 "전문 검색"을 언급 한 게시물을 읽었습니다.

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

도움이 되었습니까?

해결책

일반적으로 "정밀도"와 "리콜"사이에는 상충이 있습니다. 높은 정밀도는 관련이없는 결과가 적다는 것을 의미하며 (오 탐지는 없음) 높은 리콜은 적은 관련 결과가 누락되었음을 의미합니다 (잘못된 네거티브는 없음). Like Operator를 사용하면 리콜을위한 양보없이 100% 정밀도를 제공합니다. 전문 검색 시설은 더 나은 리콜을 위해 정밀도를 조정할 수있는 많은 유연성을 제공합니다.

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

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

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

  • 어휘 분석 또는 토큰 화 - 구조화되지 않은 텍스트 블록을 개별 단어, 문구 및 특수 토큰으로 깨뜨립니다.
  • 형태 학적 분석, 또는 줄기 - 주어진 단어의 변형을 하나의 색인 용어로 변형시킨다. 예를 들어, "마우스"및 "마우스"또는 "전기 화"및 "전기"를 같은 단어로 처리합니다.
  • 순위 - 쿼리 문자열과 일치하는 레코드의 유사성 중심

다른 팁

FTS에는 많은 레코드를 빠르게 검색하기 위해 텍스트 필드 내에서 개별 단어를 색인화하는 것이 포함됩니다. Like를 사용하려면 필드 내에서 문자열 검색 (선형 등)을 수행해야합니다.

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

또한 이렇게 대답합니다:

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

인덱싱 :

같은 것 :

WHERE Foo LIKE '%Bar';

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

스템 밍 :

풀 텍스트 검색은 단어를 줄일 수 있습니다. Run을 검색하면 "Ran"또는 "Running"에 대한 결과를 얻을 수 있습니다. 대부분의 전체 텍스트 엔진에는 다양한 언어로 STEM 사전이 있습니다.

가중 결과 :

풀 텍스트 색인은 여러 열을 포함 할 수 있습니다. 예를 들어, "Peach Pie"를 검색 할 수 있으며 색인에는 제목, 키워드 및 신체가 포함될 수 있습니다. 제목과 일치하는 결과는 더 관련성이 높고 상단 근처에 표시되도록 정렬 할 수 있습니다.

단점 :

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

전체 텍스트 인덱스는 업데이트가 느리게 진행될 수 있습니다. 데이터가 많이 변경되면 표준 인덱스에 비해 일부 LAG 업데이트 인덱스가있을 수 있습니다.

와일드 카드 만 사용하는 것처럼 강력한 것은 아닙니다.

전체 텍스트는 유사한 사운드 결과 (Soundex) 및 더 많은 항목을 포함하여 훨씬 더 복잡한 검색을 허용합니다.

사용 가능한 내용을 더 잘 이해할 수 있도록 () freetext () 및 관련 전문 검색 항목과 관련된 전체 텍스트 검색 항목을 살펴보기 시작합니다.

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

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 테이블의 각 행은 "문서"로 간주되고 텍스트 열에는 단락이 포함될 수 있습니다. 문서 ID로.

이 SQL 쿼리는 O (1) 성능이 다소 가질 것임을 기억하십시오. 쿼리는 독립적입니다

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

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

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

경고 :이 쿼리에 주문을 추가하면 Runtimes는 여러 매개 변수에 따라 다릅니다. 그 중 하나는 일치하는 행/문서 수입니다. 그러니 조심하십시오.

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

FTS는 더 효율적이고 강력합니다 (특히 단어 차단기 및 스템 기능의 경우). 그러나 때로는 DBS가 모든 언어를 지원하지 않기 때문에 요구 사항을 확인하십시오. http://msdn.microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top