object_key = "explnum_id";
$this->object_index_key= "num_obj";
$this->object_words_table = "explnum_words_global_index";
$this->object_fields_table = "explnum_fields_global_index_w_fragments";
$this->stemming_active=0;
$this->keep_empty=0;
}
//2 Modification analyse_query et _get_search_query pour recherche des mots uniquement avant 2eme passe pour recherche des expressions literales
/*
protected function _analyse(){
if(!is_object($this->aq) && $this->user_query){
$this->aq = new analyse_query($this->user_query,0,0,1,$this->keep_empty,$this->stemming_active);
$this->aql = clone $this->aq;
//highlight_string(print_r($this->aq->tree,true));
//Séparation des analyses de mots et d'expressions régulières
$w_to_del = array();
$l_to_del = array();
if(count($this->aq->tree)) {
$last = array_pop($this->aq->tree);
foreach($this->aq->tree as $k=>$term) {
if($term->literal==1) {
$l_to_del[]=$k;
}
if($term->literal==0) {
$w_to_del[$k];
}
}
//highlight_string(print_r($to_del,true));
//highlight_string(print_r($to_add,true));
if(count($l_to_del)) {
foreach($l_to_del as $k=>$v) {
unset($this->aq->tree[$v]);
}
}
if(count($w_to_del)) {
foreach($w_to_del as $k=>$v) {
unset($this->aql->tree[$v]);
}
}
}
}
}
*/
//1 Modification analyse_query et _get_search_query pour recherche des mots dans les expressions litérales avant restriction avec index_wew
/*
protected function _analyse(){
if(!is_object($this->aq) && $this->user_query){
$this->aq= new analyse_query($this->user_query,0,0,1,$this->keep_empty,$this->stemming_active);
$this->original_aq = clone $this->aq;
//highlight_string(print_r($this->aq->tree,true));
//Transformation des analyses literales en et
$to_del = array();
$to_add = array();
if(count($this->aq->tree)) {
$last = array_pop($this->aq->tree);
foreach($this->aq->tree as $k=>$term) {
if($term->literal==1) {
$this->has_literal=true;
$to_del[]=$k;
$sub_user_query = '('.str_replace('+',' ',$term->word).')';
$sub_user_query = '('.preg_replace("/(\s)+/", ' ',$term->word).')';
//echo $sub_user_query.'
';
$sub_aq = new analyse_query($sub_user_query,0,0,1,$this->keep_empty,$this->stemming_active);
if(count($sub_aq->tree)) {
foreach($sub_aq->tree as $k1=>$term1) {
if(!$term1->literal) {
$to_add[] = $term1;
}
}
}
}
}
//highlight_string(print_r($to_del,true));
//highlight_string(print_r($to_add,true));
if(count($to_del)) {
foreach($to_del as $k=>$v) {
unset($this->aq->tree[$v]);
}
}
if(count($to_add)) {
foreach($to_add as $k=>$v) {
$this->aq->tree[] = $v;
}
}
$this->aq->tree[] = $last;
}
}
}
*/
protected function _get_search_type(){
return "explnums";
}
//2 Modification analyse_query et _get_search_query pour recherche des mots uniquement avant 2eme passe pour recherche des expressions literales
protected function _get_search_query() {
$this->_calc_query_env();
if($this->user_query !== "*"){
// $query = $this->aq->get_query_mot($this->object_index_key,$this->object_words_table,$this->object_words_value,'','',$this->field_restrict);
// $query2 = $this->get_query_frag_all($query);
$query = $this->aq->get_query_mot_explnum($this->object_index_key,$this->object_words_table,$this->object_words_value,'','',$this->field_restrict);
} else {
}
return $query;
}
//2 Modification analyse_query et _get_search_query pour recherche des mots uniquement avant 2eme passe pour recherche des expressions literales
// protected function get_query_frag_all() {
// global $charset;
// if (count($this->aql)) {
// foreach ($this->aql->tree as $k=>$term) {
// if($term->literal==1) {
// $s = trim($term->word);
// $s = preg_replace("/\s+/u", ' ' , $s);
// // $s = mb_strtolower($s,$charset);
// // $t_frag = mb_split("\s", $s);
// // log::print_message($t_frag);
// // $this->get_query_frag($t_frag);
// // }
// // }
// // }
// // }
// protected function get_query_frag($t_frag=array()) {
// global $dbh;
// if(count($t_frag)) {
// $first=0;
// $last=count($t_frag)*1-1;
// $t=array();
// $t0=microtime(true);
// foreach($t_frag as $k=>$frag) {
// $t[$k]['md5'] = md5(microtime(true));
// $t[$k]['fragment'] = $frag;
// if($first==$last) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (num_obj int,position int, unique using btree(num_obj,position)) engine=memory
// (select num_obj,position*1+1 as position from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment like ('".addslashes($t_frag[$k])."%'))
// union
// (select num_obj,position*1+1 as position from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where rfragment like reverse('%".addslashes($t_frag[$k])."'))";
// } else if($k==$first) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (num_obj int, position int, unique using btree(num_obj,position)) engine=memory
// select num_obj,position*1+1 as position from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where rfragment like reverse('%".addslashes($t_frag[$k])."')";
// } else if($k==$last) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (num_obj int, position int,unique using btree(num_obj,position)) engine=memory
// select num_obj,position*1+1 as position from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment like ('".addslashes($t_frag[$k])."%') and concat(num_obj,',',position) in (select concat(num_obj,',',position) from frag_searcher_".$t[$k-1]['md5'].")";
// } else {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (num_obj int, position int,unique using btree(num_obj,position)) engine=memory
// select num_obj,position*1+1 as position from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment = '".addslashes($t_frag[$k])."' and concat(num_obj,',',position) in (select concat(num_obj,',',position) from frag_searcher_".$t[$k-1]['md5'].")";
// }
// /*
// if($first==$last) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (op float, index using btree(op)) engine=memory
// (select concat(num_obj,',',position*1+1) as op from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment like ('".addslashes($t_frag[$k])."%'))
// union
// (select concat(num_obj,',',position*1+1) as op from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where rfragment like reverse('%".addslashes($t_frag[$k])."'))";
// } else if($k==$first) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (op float, index using btree(op)) engine=memory
// select concat(num_obj,',',position*1+1) as op from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where rfragment like reverse('%".addslashes($t_frag[$k])."')";
// } else if($k==$last) {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (op float, index using btree(op)) engine=memory
// select concat(num_obj,',',position*1+1) as op from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment like ('".addslashes($t_frag[$k])."%') and concat(num_obj,',',position*1+1) in (select op from frag_searcher_".$t[$k-1]['md5'].")";
// } else {
// $qt = "create temporary table frag_searcher_".$t[$k]['md5']." (op float, index using btree(op)) engine=memory
// select concat(num_obj,',',position*1+1) as op from fragments join explnum_fields_global_index_w_fragments on num_fragment=id_fragment where fragment = '".addslashes($t_frag[$k])."' and concat(num_obj,',',position*1+1) in (select op from frag_searcher_".$t[$k-1]['md5'].")";
// }
// */
// $t[$k]['qf'] = $qf;
// $t[$k]['qt'] = $qt;
// $rt = pmb_mysql_query($qt,$dbh);
// log::print_message($qt);
// $t[$k]['time'] = microtime(true);
// if($k!=0) {
// log::print_message("Tps requete = ".(($t[$k]['time'])*1 - $t[$k-1]['time']))." s";
// } else {
// log::print_message("Tps requete = ".(($t[$k]['time'])*1 - $t0)." s");
// }
// if(pmb_mysql_error($dbh)) {
// log::print_message(pmb_mysql_error($dbh));
// }
// //$rd = pmb_mysql_query($qd,$dbh);
// }
// $ql = "select distinct(num_obj) from frag_searcher_".$t[$k]['md5'];
// $rl = pmb_mysql_query($ql,$dbh);
// $x = pmb_mysql_num_rows($rl);
// $object_ids='';
// if($x) {
// $i=0;
// while($row=pmb_mysql_fetch_object($rl)) {
// if($object_ids!="") $object_ids.=",";
// $object_ids.=$row->num_obj;
// }
// }
// $t1 = microtime(true);
// log::print_message("Nb de résultats= ".$x);
// log::print_message("Liste des résultats= ".$object_ids);
// log::print_message("Tps requetes = ".($t1-$t0)*1)." s";
// @pmb_mysql_free_result($res);
// log::print_message('*******************************');
// }
// }
//1 Modification analyse_query et _get_search_query pour recherche des mots dans les expressions litérales avant restriction avec index_wew
/*
protected function _get_search_query() {
$this->_calc_query_env();
if($this->user_query !== "*"){
$t0 = microtime(true);
$q1 = $this->aq->get_query_mot($this->object_index_key,$this->object_words_table,$this->object_words_value,$this->object_fields_table,$this->object_fields_value,$this->field_restrict);
$t1 = microtime(true);
$r1 = pmb_mysql_query($q1);
echo 'duree recherche sur les mots ='.(($t1-$t0)*1).'
';
if($this->has_literal) {
$q2 = 'select '.$this->object_index_key.' from '.$this->object_fields_table;
$q2.= ' where '.$this->object_index_key.' in ('.$q1.') ';
foreach($this->original_aq->tree as $k=>$term) {
if($term->literal==1) {
//$q2.= ' and '.$this->object_fields_value.' like "%'.addslashes($term->word).'%"';
$q2.= " and match(".$this->object_fields_value.") against ('\"".addslashes($term->word)."\"' in boolean mode)";
}
}
$query = $q2;
}
$r2 = pmb_mysql_query($q2);
$t2 = microtime(true);
echo 'duree recherche sur l\'index ='.(($t2-$t1)*1).'
';
}else{
$query = $this->get_full_results_query();
}
echo $query;
return $query;
}
*/
// public function get_aq() {
// return $this->aq;
// }
/*
protected function _get_search_query(){
$this->_calc_query_env();
if($this->user_query === "*"){
$query = $this->get_full_results_query();
}else{
$query = $this->aq->get_query_mot($this->object_index_key,$this->object_words_table,$this->object_words_value,'','',$this->field_restrict);
}
return $query;
}
*/
}