PHP indeksleme metin dosyaları

1 Cevap php

Ben bütün kelime 4 karakter veya daha fazla sürer, ve kelime kullanılmıştır kaç kez birlikte bir veritabanında saklar indexleyici oluşturmak için bir meydan okuma seti olmuştur.

Ben 4.000 txt dosyaları bu dizinleyiciyi çalıştırmak zorunda. Şu anda, yaklaşık 12-15 dakika sürer - ve herkes şeyleri hızlandırmak için bir önerisi var, merak ediyorum?

Aşağıdaki gibi şu anda ben bir dizide kelimeler yerleştirerek ediyorum:

// ==============================================================
// === Create an index of all the words in the document
// ==============================================================
function index(){

	$this->index = Array();
	$this->index_frequency = Array();

	$this->original_file = str_replace("\r", " ", $this->original_file);
	$this->index = explode(" ", $this->original_file);

	// Build new frequency array
	foreach($this->index as $key=>$value){

		// remove everything except letters
		$value = clean_string($value);

		if($value == '' || strlen($value) < MIN_CHARS){
			continue;
		}

		if(array_key_exists($value, $this->index_frequency)){
			$this->index_frequency[$value] = $this->index_frequency[$value] + 1;
		} else{
			$this->index_frequency[$value] = 1;
		}

	}

	return $this->index_frequency;

}

Ben şu anda büyük darboğaz veritabanında sözcükleri saklamak için komut olduğunu düşünüyorum. Bu deneme tabloya belgeyi ekleyin ve kelime tablosunda varsa kelime yoksa o zaman sadece bunu eklemek sonra, alana essayid (kelimenin sıklığı) eklemek gerekiyor ...

// ==============================================================
// === Store the word frequencies in the db
// ==============================================================
private function store(){

	$index = $this->index();

	mysql_query("INSERT INTO essays (checksum, title, total_words) VALUES ('{$this->checksum}', '{$this->original_filename}', '{$this->get_total_words()}')") or die(mysql_error());

	$essay_id = mysql_insert_id();

	foreach($this->index_frequency as $key=>$value){

		$check_word = mysql_result(mysql_query("SELECT COUNT(word) FROM `index` WHERE word = '$key' LIMIT 1"), 0);

		$eid_frequency = $essay_id . "(" . $value . ")";

		if($check_word == 0){
			$save = mysql_query("INSERT INTO `index` (word, essays) VALUES ('$key', '$eid_frequency')");
		} else {
			$eid_frequency = "," . $eid_frequency;
			$save = mysql_query("UPDATE `index` SET essays = CONCAT(essays, '$eid_frequency') WHERE word = '$key' LIMIT 1");
		}

	}

}

Herhangi bir fikir?

1 Cevap

Sen darboğazlar tam olarak nerede olduğunu bilmek için app profil düşünebilirsiniz. Bu size geliştirilebilir ne daha iyi bir anlayış verebilir.

DB optimizasyonu ile ilgili: Eğer word sütun üzerinde bir dizin olup olmadığını kontrol, o zaman DB erişmek sayısını azaltmayı deneyin. INSERT ... ON DUPLICATE KEY UPDATE ..., belki?