This mod enhances Sphiders capabilities to search also for parts of a word. You may use * wildcards like
*searchme
*searchme*
searchme*
The query search*me will be rejected. With some small changes this mod could be modificated to search for parts of a word also without any wildcard. But to search for parts of a word requires an additional mySQL request. So, as this would slow down every search enquiry, I decided for the first issue to include the *wildcards.
In .../include/searchfuncs.php search for:
while (($words < count($wordarray)) && $possible_to_find == 1) {
if ($stem_words == 1) {
$searchword = addslashes(stem($wordarray[$words]));
} else {
$searchword = addslashes($wordarray[$words]);
}
$wordmd5 = substr(md5($searchword), 0, 1);
$query1 = "SELECT distinct link_id, weight, domain from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by weight desc";
echo mysql_error();
$result = mysql_query($query1);
$num_rows = mysql_num_rows($result);
if ($num_rows == 0) {
if ($type != "or"

{
$possible_to_find = 0;
break;
}
}
if ($type == "or"

{
$indx = 0;
} else {
$indx = $words;
}
while ($row = mysql_fetch_row($result)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
$linklist[$indx]['weight'][$row[0]] = $row[1];
}
$words++;
}
Delete all that and replace it with the following:
// If * wildcard, search for part of a word
$wild_correct = 0;
$searchword = addslashes($wordarray[$words]); // get only first word of search query
$wildcount = substr_count($searchword, '*');
if ($wildcount == 1 xor $wildcount ==2) { // only one or two * are allowed
$length = strlen($searchword);
$first = strpos($searchword, '*');
$last = strrpos($searchword, '*');
if ($wildcount == 1) { // if we have only one *
if ($first == 0) $wild_correct = '1a'; // * must be always in pos 0
if ($last == ($length-1)) $wild_correct = '1b'; // or alternate in last position
}
if($wildcount == 2) { // if we have two *
if ($first == 0 && $last == ($length-1)) $wild_correct = '2'; // they must be in first and last position
}
if ($wild_correct != 0) {
$searchword = str_replace('*','%', $searchword);
$recovered = str_replace('%', '',$searchword);
$wordarray[0]= $recovered;
$searchstr['hilight'][0] = $recovered;
$searchstr['+'][0] = $recovered;
$query = "SELECT keyword_id, keyword from ".$mysql_table_prefix."keywords where keyword like '$searchword'";
echo mysql_error();
$result = mysql_query($query);
$num_rows = mysql_num_rows($result);
if ($num_rows == 0) { // if there was no searchword in table keywords
$possible_to_find = 0;
$break = 1;
}
if ($num_rows !=0) {
for ($i=0; $i<$num_rows; $i++) { // get all searchwords as keywords from table keywords
$keyword_id = mysql_result($result, $i, "keyword_id"

;
$keyword = mysql_result($result, $i, "keyword"

;
$wordmd5 = substr(md5($keyword), 0, 1); // calculate attribute for link_keyword table
$query1 = "SELECT link_id, weight, domain from ".$mysql_table_prefix."link_keyword$wordmd5 where keyword_id = '$keyword_id' order by weight desc";
echo mysql_error();
$reso = mysql_query($query1);
$lines = mysql_num_rows($reso);
if ($lines != 0) {
$indx =$words;
}
while ($row = mysql_fetch_row($reso)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
$linklist[$indx]['weight'][$row[0]] = $row[1];
}
}
}
}
} else { // standard search without wildcard
while (($words < count($wordarray)) && $possible_to_find == 1) {
if ($stem_words == 1) {
$searchword = addslashes(stem($wordarray[$words]));
} else {
$searchword = addslashes($wordarray[$words]);
}
$wordmd5 = substr(md5($searchword), 0, 1);
$query1 = "SELECT distinct link_id, weight, domain from ".$mysql_table_prefix."link_keyword$wordmd5, ".$mysql_table_prefix."keywords where ".$mysql_table_prefix."link_keyword$wordmd5.keyword_id= ".$mysql_table_prefix."keywords.keyword_id and keyword='$searchword' $domain_qry order by weight desc";
echo mysql_error();
$result = mysql_query($query1);
$num_rows = mysql_num_rows($result);
if ($num_rows == 0) {
if ($type != "or"

{
$possible_to_find = 0;
break;
}
}
if ($type == "or"

{
$indx = 0;
} else {
$indx = $words;
}
while ($row = mysql_fetch_row($result)) {
$linklist[$indx]['id'][] = $row[0];
$domains[$row[0]] = $row[2];
$linklist[$indx]['weight'][$row[0]] = $row[1];
}
$words++;
}
}
In the same file search for:
$page_size = number_format($page_size, 1)."kb";
Beyond that row additionally include the following:
// Enable part of a word highlighting in result report
$recovered = str_replace('*', '',trim($query));
$words['hilight'][0] = $recovered;
$words['+'][0] = $recovered;
Happy coding
Tec