2011-09-15 7 views
1

안녕 나는이미리 정의 된 단어

word_id int(10) 
word varchar(30) 

과 같은 데이터베이스 테이블을 가지고 있고 나는이 텍스트의 단어 중 하나가 해당 테이블에 정의 된보고 싶어, 텍스트를 가지고, 무슨 일이의에 대한 텍스트 검색 이 일을하는 가장 우아한 방법?

현재 모든 단어에 대해 데이터베이스를 쿼리 한 다음 PHP를 사용하여 전체 텍스트에서 각 단어를 검색하므로 데이터베이스에서 모든 단어를 PHP로 다운로드하는 데 오랜 시간이 걸리고 각각을 검사합니다. 그들 중 내 텍스트에 반대합니다.

+0

텍스트를 단어로 분할하고 DB에서 각 단어를 검색하는 방법을 고려해 보았습니까? 훨씬 더 효율적 일 것입니다. – JohnFx

+0

기존 검색 엔진을 사용하면 어떨까요? 몇 가지 오픈 소스 옵션이 있습니다. 데이터베이스를 쿼리하도록 코드를 수정할 수 있습니다. – Dan

+0

무엇을 하든지간에 혈전증 문제를 조심하십시오. (http://thedailywtf.com/Articles/The-Clbuttic-Mistake-.aspx) – JohnFx

답변

3

당신은 텍스트의 단어를 추출하려고이 같은 SELECT 쿼리에 넣을 수 있습니다

$words = array_unique(get_words_in_text(...)); 
$sql = "SELECT * FROM words WHERE word IN (".implode(", ", $words)).")"; 

당신의 SQL 엔진이 문을 최적화하는 것이 될 수 있습니다. 어쨌든 데이터베이스 연결은 현재 사용중인 것보다 적게 사용됩니다.

임시로 별도의 단어 표을 작성하고 텍스트의 모든 단어를 해당 표에 추가 할 수도 있습니다. 그런 다음 기본 단어 표가있는 JOIN을 수행 할 수 있습니다. 두 테이블의 색인이 제대로 지정되면이 일 수 있습니다.

편집 :이 질문에 대한 답변은 실제로 임시 테이블을 만드는 것이 더 빠릅니다 (의견보기 참조) : mysql select .. where .. in -> optimizing. 그러나 사용하는 구체적인 데이터베이스, 단어 표의 크기, 텍스트의 크기 및 색인 구성에 따라 달라집니다. 따라서 특정 시나리오에 대해 두 가지 방법을 모두 평가하는 것이 좋습니다. 결과를보고하십시오. :-)

0

아이디어 :

// get words in file into array 
$file = file_get_contents('file.txt', FILE_IGNORE_NEW_LINES); 
$file_words = explode(" ", $file); 

// remove duplicate words, count elements in array after de-duplication 
$file_words = array_unique($file_words); 
$file_count = count($file_words); 

// create empty array in which to store hits 
$words_with_definition = array(); 

// check to see if each word exists in database 
for ($i=0; $i < $file_count; $i++) 
{ 
    // intentionally leaving out db connection, this is just a concept 
    // word should be at least three characters, change as needed 
    if (strlen($file_words[$i]) >= 3) 
    { 
     $sql = "SELECT word FROM your_table WHERE word='".$file_words[$i]."'"; 

     if (mysql_num_rows($sql) > 0) 
     { 
      // this is a hit, add it to $words_with_definition 
      array_push($words_with_definition, $file_words[$i]); 
     } 
    } 
} 

는 $ words_with_definition 배열에 뭐든간에 데이터베이스를 맞을 단어 일 것이다.

관련 문제