JsyJack Posted November 5, 2012 Share Posted November 5, 2012 Hello, I'm looking to find out the most advanced searching method to search a Mysql database. I know a bit about fulltext. Is there any other methods? Lets say I'm using the latest Mysql version... Thanks Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/ Share on other sites More sharing options...
QuickOldCar Posted November 5, 2012 Share Posted November 5, 2012 Fultext is most likely the most advanced can get with it, with indexing can fetch fairly fast results depending on the amount of data. Not sure if you looked into all the operators or weighting methods. http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html Take a look into sphinx, it can provide some advanced and also fast search results. http://sphinxsearch.com/ I wrote a few posts for fulltext search and gave some examples on some advanced search and multiple dynamic queries. http://forums.phpfreaks.com/topic/262145-best-search-algorithm-to-accomplish-this/?do=findComment&comment=1343591 Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1390446 Share on other sites More sharing options...
JsyJack Posted November 6, 2012 Author Share Posted November 6, 2012 Ok thanks for your help. Do you know anyways to work with the search term before its queried? Eg... Match with similar words, plural words etc... Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1390515 Share on other sites More sharing options...
QuickOldCar Posted November 8, 2012 Share Posted November 8, 2012 You can use what's called stemming to include the plural words as well within the search results. http://sphinxsearch.com/docs/current.html#conf-morphology And for mysql the Porter stemmer is popular to use http://dev.mysql.com/worklog/task/?id=2423 You can use a thesaurus, produce an array of similar definition words and provide all the results. As for ending in ing, es, ed, etc.. , would need to make word associations, could be time consuming to create, or can try using a wildcard with * Wordnik has a free thesaurus api you can use, has some limitations, is a pro version too. http://developer.wordnik.com/ Is also wordnet that can do them, is an online version, also can install your own local version. http://wordnet.princeton.edu/ It would take a real long time to explain how exactly I do my various searches, but I use sphinx to search for links, mysql fulltext in booleon mode for my simple site search, and then if are a member I let them use various advanced searches to narrow down exactly what they need. Here's a simple search using a combination of wordnick thesaurus with also my own local version of wordnet as suggestions. Instead of suggestions like I did, you could add the same into a query. I chose not to because some of the meanings are most likely not what they are looking for. http://dynaindex.com/search.php?s=jobs One last item that may be of interest to you is ajax based suggestions, which could also be used as the query. http://robertnyman.com/ajax-suggestions/ http://www.w3schools.com/php/php_ajax_php.asp Personally your best bet may be using sphinx, it's well documented and also articles written to do additional or special searches with it. Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1391161 Share on other sites More sharing options...
QuickOldCar Posted November 9, 2012 Share Posted November 9, 2012 someone made a class that has pluralize and singular in it. http://www.kavoir.com/2011/04/php-class-converting-plural-to-singular-or-vice-versa-in-english.html Here is a fixed version <?php /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ // +----------------------------------------------------------------------+ // | Akelos PHP Application Framework | // +----------------------------------------------------------------------+ // | Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.com/ | // | Released under the GNU Lesser General Public License | // +----------------------------------------------------------------------+ // | You should have received the following files along with this library | // | - COPYRIGHT (Additional copyright notice) | // | - DISCLAIMER (Disclaimer of warranty) | // | - README (Important information regarding this library) | // +----------------------------------------------------------------------+ /** * Inflector for pluralize and singularize English nouns. * * This Inflector is a port of Ruby on Rails Inflector. * * It can be really helpful for developers that want to * create frameworks based on naming conventions rather than * configurations. * * It was ported to PHP for the Akelos Framework, a * multilingual Ruby on Rails like framework for PHP that will * be launched soon. * * @author Bermi Ferrer Martinez * @copyright Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.org * @license GNU Lesser General Public License * @since 0.1 * @version $Revision 0.1 $ */ class Inflector { // ------ CLASS METHODS ------ // // ---- Public methods ---- // // {{{ pluralize() /** * Pluralizes English nouns. * * @access public * @static * @param string $word English noun to pluralize * @return string Plural noun */ function pluralize($word) { $plural = array( '/(quiz)$/i' => '\1zes', '/^(ox)$/i' => '\1en', '/([m|l])ouse$/i' => '\1ice', '/(matr|vert|ind)ix|ex$/i' => '\1ices', '/(x|ch|ss|sh)$/i' => '\1es', '/([^aeiouy]|qu)ies$/i' => '\1y', '/([^aeiouy]|qu)y$/i' => '\1ies', '/(hive)$/i' => '1s', '/(?[^f])fe|([lr])f)$/i' => '\1\2ves', '/sis$/i' => 'ses', '/([ti])um$/i' => '\1a', '/(buffal|tomat)o$/i' => '\1oes', '/(bu)s$/i' => '\1ses', '/(alias|status)/i'=> '\1es', '/(octop|vir)us$/i'=> '\1i', '/(ax|test)is$/i'=> '\1es', '/s$/i'=> 's', '/$/'=> 's'); $uncountable = array('equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep'); $irregular = array( 'person' => 'people', 'man' => 'men', 'child' => 'children', 'sex' => 'sexes', 'move' => 'moves'); $lowercased_word = strtolower($word); foreach ($uncountable as $_uncountable){ if(substr($lowercased_word,(-1*strlen($_uncountable))) == $_uncountable){ return $word; } } foreach ($irregular as $_plural=> $_singular){ if (preg_match('/('.$_plural.')$/i', $word, $arr)) { return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1).substr($_singular,1), $word); } } foreach ($plural as $rule => $replacement) { if (preg_match($rule, $word)) { return preg_replace($rule, $replacement, $word); } } return false; } // }}} // {{{ singularize() /** * Singularizes English nouns. * * @access public * @static * @param string $word English noun to singularize * @return string Singular noun. */ function singularize($word) { $singular = array ( '/(quiz)zes$/i' => '\1', '/(matr)ices$/i' => '\1ix', '/(vert|ind)ices$/i' => '\1ex', '/^(ox)en/i' => '\1', '/(alias|status)es$/i' => '\1', '/([octop|vir])i$/i' => '\1us', '/(cris|ax|test)es$/i' => '\1is', '/(shoe)s$/i' => '\1', '/(o)es$/i' => '\1', '/(bus)es$/i' => '\1', '/([m|l])ice$/i' => '\1ouse', '/(x|ch|ss|sh)es$/i' => '\1', '/(m)ovies$/i' => '\1ovie', '/(s)eries$/i' => '\1eries', '/([^aeiouy]|qu)ies$/i' => '\1y', '/([lr])ves$/i' => '\1f', '/(tive)s$/i' => '\1', '/(hive)s$/i' => '\1', '/([^f])ves$/i' => '\1fe', '/(^analy)ses$/i' => '\1sis', '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => '\1\2sis', '/([ti])a$/i' => '\1um', '/(n)ews$/i' => '\1ews', '/s$/i' => '', ); $uncountable = array('equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep'); $irregular = array( 'person' => 'people', 'man' => 'men', 'child' => 'children', 'sex' => 'sexes', 'move' => 'moves'); $lowercased_word = strtolower($word); foreach ($uncountable as $_uncountable){ if(substr($lowercased_word,(-1*strlen($_uncountable))) == $_uncountable){ return $word; } } foreach ($irregular as $_plural=> $_singular){ if (preg_match('/('.$_singular.')$/i', $word, $arr)) { return preg_replace('/('.$_singular.')$/i', substr($arr[0],0,1).substr($_plural,1), $word); } } foreach ($singular as $rule => $replacement) { if (preg_match($rule, $word)) { return preg_replace($rule, $replacement, $word); } } return $word; } // }}} // {{{ titleize() /** * Converts an underscored or CamelCase word into a English * sentence. * * The titleize function converts text like "WelcomePage", * "welcome_page" or "welcome page" to this "Welcome * Page". * If second parameter is set to 'first' it will only * capitalize the first character of the title. * * @access public * @static * @param string $word Word to format as tile * @param string $uppercase If set to 'first' it will only uppercase the * first character. Otherwise it will uppercase all * the words in the title. * @return string Text formatted as title */ function titleize($word, $uppercase = '') { $uppercase = $uppercase == 'first' ? 'ucfirst' : 'ucwords'; return $uppercase(Inflector::humanize(Inflector::underscore($word))); } // }}} // {{{ camelize() /** * Returns given word as CamelCased * * Converts a word like "send_email" to "SendEmail". It * will remove non alphanumeric character from the word, so * "who's online" will be converted to "WhoSOnline" * * @access public * @static * @see variablize * @param string $word Word to convert to camel case * @return string UpperCamelCasedWord */ function camelize($word) { return str_replace(' ','',ucwords(preg_replace('/[^A-Z^a-z^0-9]+/',' ',$word))); } // }}} // {{{ underscore() /** * Converts a word "into_it_s_underscored_version" * * Convert any "CamelCased" or "ordinary Word" into an * "underscored_word". * * This can be really useful for creating friendly URLs. * * @access public * @static * @param string $word Word to underscore * @return string Underscored word */ function underscore($word) { return strtolower(preg_replace('/[^A-Z^a-z^0-9]+/','_', preg_replace('/([a-zd])([A-Z])/','\1_\2', preg_replace('/([A-Z]+)([A-Z][a-z])/','\1_\2',$word)))); } // }}} // {{{ humanize() /** * Returns a human-readable string from $word * * Returns a human-readable string from $word, by replacing * underscores with a space, and by upper-casing the initial * character by default. * * If you need to uppercase all the words you just have to * pass 'all' as a second parameter. * * @access public * @static * @param string $word String to "humanize" * @param string $uppercase If set to 'all' it will uppercase all the words * instead of just the first one. * @return string Human-readable word */ function humanize($word, $uppercase = '') { $uppercase = $uppercase == 'all' ? 'ucwords' : 'ucfirst'; return $uppercase(str_replace('_',' ',preg_replace('/_id$/', '',$word))); } // }}} // {{{ variablize() /** * Same as camelize but first char is underscored * * Converts a word like "send_email" to "sendEmail". It * will remove non alphanumeric character from the word, so * "who's online" will be converted to "whoSOnline" * * @access public * @static * @see camelize * @param string $word Word to lowerCamelCase * @return string Returns a lowerCamelCasedWord */ function variablize($word) { $word = Inflector::camelize($word); return strtolower($word[0]).substr($word,1); } // }}} // {{{ tableize() /** * Converts a class name to its table name according to rails * naming conventions. * * Converts "Person" to "people" * * @access public * @static * @see classify * @param string $class_name Class name for getting related table_name. * @return string plural_table_name */ function tableize($class_name) { return Inflector::pluralize(Inflector::underscore($class_name)); } // }}} // {{{ classify() /** * Converts a table name to its class name according to rails * naming conventions. * * Converts "people" to "Person" * * @access public * @static * @see tableize * @param string $table_name Table name for getting related ClassName. * @return string SingularClassName */ function classify($table_name) { return Inflector::camelize(Inflector::singularize($table_name)); } // }}} // {{{ ordinalize() /** * Converts number to its ordinal English form. * * This method converts 13 to 13th, 2 to 2nd ... * * @access public * @static * @param integer $number Number to get its ordinal value * @return string Ordinal representation of given string. */ function ordinalize($number) { if (in_array(($number % 100),range(11,13))){ return $number.'th'; }else{ switch (($number % 10)) { case 1: return $number.'st'; break; case 2: return $number.'nd'; break; case 3: return $number.'rd'; default: return $number.'th'; break; } } } // }}} } ?> Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1391238 Share on other sites More sharing options...
Barand Posted November 9, 2012 Share Posted November 9, 2012 $irregular = array( 'person' => 'people', 'man' => 'men', 'child' => 'children', 'sex' => 'sexes', 'move' => 'moves'); What is irregular about "move => moves" ? Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1391384 Share on other sites More sharing options...
QuickOldCar Posted November 11, 2012 Share Posted November 11, 2012 (edited) I didn't make that script. But i may have an answer for moves. if is a noun, it's move, if is a verb it's moves. Either way there are many missing from the script, here are over 100 for instances http://www.scribd.co...ouns-in-English di,dice octopus,octopi woman,women child,children These remain the same plural and singular bison buffalo deer fish moose pike sheep salmon trout swine plankton I haven't seen an all working solution that's 100% correct when it comes to making a word plural or singular. There will even be variations or accepted usages of plural forms depending where it originates. Edited November 11, 2012 by QuickOldCar Quote Link to comment https://forums.phpfreaks.com/topic/270319-advanced-search-script-php/#findComment-1391690 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.