2010-07-31 3 views
2

그 안에 TEXT 열이있는 테이블 (MySQL 또는 SQlite)을 사용하면 해당 행의 값을 다소 비슷한 텍스트가있는 유사한 행을 찾을 수있는 방식으로 사용할 수 있습니다 가치? 내가 row_3하기 관련 행을 찾기 위해 원하는 경우 예를 들어관련 행은 텍스트 열을 기반으로합니다

, 나는 - 모두 1 &이 일치합니다 :

row_1 = this is about sports 
row_2 = this is about study 
row_3 = this is about study and sports 

을 나는 핵심 단어가 있다면 내가 FULLTEXT 또는 FTS3를 사용할 수 있다는 것을 알고있다 I 열 값에 대해 MATCH을 원했습니다. 그러나 나는 단지 행과 다소 관련이있는 텍스트를 찾으려고합니다.

답변

1

당신은에 나사 파운드에 잘못된 망치를 사용하는 데이터베이스 열에서 하나의 문자열 데이터를 저장하는 방법이 아니다. 관심있는 부분에 쉽게 도달 할 수 없으며 이는 개별 단어입니다.

텍스트 비교 문제에 대한 많은 연구가 있습니다. 이 필요성에 대해 진지하게 생각하고 있다면, 문제 영역에서 다양한 기술에 대해 읽는 것을 원할 것입니다.

첫 번째 단서는 전체 텍스트 문자열이 아닌 단어 또는 문장 단편으로 데이터에 액세스/색인하려는 것입니다 (비슷한 단어의 철자에 관심이있는 경우가 아니라면 더 어렵습니다).

한 가지 기술의 한 예로, 겹쳐진 세 단어 집합을 잡아서 문장에서 사슬을 생성하고 사슬을 저장하십시오. 그런 다음 많은 수의 체인 세그먼트가 공통적으로있는 항목을 검색 할 수 있습니다. 당신의 문에 체인 세그먼트의 세트는 위의 것 :

row_1 =이 스포츠에 대한

row_2입니다 = 이 약

row_3을 연구한다 =이 연구에 대한 스포츠

입니다
  • 이 약 (3 경기)
  • 이 연구에 대해 (2 경기) 연구에 대한
  • 연구 및 스포츠
  • 어쩌면
3

MySQL은 QUERY EXPANSION이라는 전체 텍스트 검색 옵션을 지원합니다. 아이디어는 키워드를 검색하고 행을 찾은 다음 해당 행의 단어를 키워드로 사용하여 더 일치하는 행을 검색하는 것입니다. 여기에 대한

SELECT ... FROM StudiesTable WHERE MATCH(description_text) 
    AGAINST ('sports' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); 

읽기 :. http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html

+0

좋은 키워드이지만 검색 할 키워드가 없습니다. 관련 행을 찾기 위해 이미 행에있는 데이터에서 벗어나려고합니다. 그러나 내가 필요로 할 때 이것을 도움이되는 것으로 북마크했다. – Xeoncross

+0

불행히도 MySQL 전체 텍스트 검색으로는 그렇게 할 수 없습니다. 패턴은 열 이름, 매개 변수 또는 사용자 변수가 아닌 문자열 리터럴이어야합니다. –

1

은 각 관련 단어 (4 개 이상의 문자를 취할 충분한 것입니다 스포츠에 관한 것입니다? 또는 전체 단어 검색을위한 키워드로 그들을 사용하여 기본 행에있는 비교) 및 tmp 테이블 (id, row_matched_id, count)을 구축하여 일치 할 때마다 1에 더하는 각 행에 대한 일치를 기록하십시오. 마지막으로 tmp 테이블에서 일치하는 모든 줄과 일치하는 줄 (얼마나 많은 관련 단어가 같은지)을 가져옵니다.
전체 데이터베이스에 대해 한 번 실행하고 결과를 유지하려면 지속 된 테이블을 사용하고 기본 행 ID에 대한 열을 추가하고 결과 테이블을 업데이트하기 위해 삽입 (또는 업데이트) 된 각 새 행에 대한 검색을 수행하십시오 .
이 결과 테이블을 사용하면 검색을 다시하지 않고도 기본 행의 더 많은 단어와 일치하는 행을 신속하게 찾을 수 있습니다.

편집 :이 기능을 사용하면 결과에 "점수를 매길"수 있습니다. 예를 들어 기본 행에 x 개의 관련 단어가 포함 된 경우 % (일치/x * 100)로 점수를 계산하고 예를 들어 50 % 미만 일치. 귀하의 예에서, 각 row_1과 row_2는 관련 단어를 고려할 경우 50 %를, 4 개 이상의 문자가있는 단어 만 고려하거나 모든 단어를 고려하면 67 %를 제공합니다.

관련 문제