Home › Forums › Product Support Forums › Ajax Search Pro for WordPress Support › Plurals on website search
- This topic has 5 replies, 2 voices, and was last updated 1 year, 7 months ago by
Ernest Marcinko.
-
AuthorPosts
-
October 8, 2024 at 1:38 pm #51353
wtseng
ParticipantHow do I set up the search parameters so that when a particular word is searched, the plural is also included. The main one I want to fix is for when people search “Masks” on the website. Only 4 results show. But when they search for “Mask” 7 pages show. The likelihood of someone searching for Masks with a plural is more probable than the singular word. How do I change or include this in my results?
October 9, 2024 at 7:07 am #51366Ernest Marcinko
KeymasterHi,
It depends on the case – but if you only expect a few of these, then using the synonyms feature is the best option.
If you want a semi-automated solution for english language, then it’s also possible, but requires a bit of custom code to be added.
– Try adding the custom code from below via the Code Snippets plugin or to the functions.php file in your theme/child theme directory – make sure to have a full server back-up first for safety. For more details you can check the safe coding guidelines.
– Then make sure to use the index table engine
– After adding the code re-create the indexThe snippet will hook into the index process, will check all words and add plurals and singulars wherever it finds them in the text.
class Inflect { static $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)y$/i' => "$1ies", '/(hive)$/i' => "$1s", '/(?:([^f])fe|([lr])f)$/i' => "$1$2ves", '/(shea|lea|loa|thie)f$/i' => "$1ves", '/sis$/i' => "ses", '/([ti])um$/i' => "$1a", '/(tomat|potat|ech|her|vet)o$/i'=> "$1oes", '/(bu)s$/i' => "$1ses", '/(alias)$/i' => "$1es", '/(octop)us$/i' => "$1i", '/(ax|test)is$/i' => "$1es", '/(us)$/i' => "$1es", '/s$/i' => "s", '/$/' => "s" ); static $singular = array( '/(quiz)zes$/i' => "$1", '/(matr)ices$/i' => "$1ix", '/(vert|ind)ices$/i' => "$1ex", '/^(ox)en$/i' => "$1", '/(alias)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", '/(li|wi|kni)ves$/i' => "$1fe", '/(shea|loa|lea|thie)ves$/i'=> "$1f", '/(^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", '/(h|bl)ouses$/i' => "$1ouse", '/(corpse)s$/i' => "$1", '/(us)es$/i' => "$1", '/s$/i' => "" ); static $irregular = array( 'move' => 'moves', 'foot' => 'feet', 'goose' => 'geese', 'sex' => 'sexes', 'child' => 'children', 'man' => 'men', 'tooth' => 'teeth', 'person' => 'people' ); static $uncountable = array( 'sheep', 'fish', 'deer', 'series', 'species', 'money', 'rice', 'information', 'equipment' ); public static function pluralize( $string ) { // save some time in the case that singular and plural are the same if ( in_array( strtolower( $string ), self::$uncountable ) ) return $string; // check for irregular singular forms foreach ( self::$irregular as $pattern => $result ) { $pattern = '/' . $pattern . '$/i'; if ( preg_match( $pattern, $string ) ) return preg_replace( $pattern, $result, $string); } // check for matches using regular expressions foreach ( self::$plural as $pattern => $result ) { if ( preg_match( $pattern, $string ) ) return preg_replace( $pattern, $result, $string ); } return $string; } public static function singularize( $string ) { // save some time in the case that singular and plural are the same if ( in_array( strtolower( $string ), self::$uncountable ) ) return $string; // check for irregular plural forms foreach ( self::$irregular as $result => $pattern ) { $pattern = '/' . $pattern . '$/i'; if ( preg_match( $pattern, $string ) ) return preg_replace( $pattern, $result, $string); } // check for matches using regular expressions foreach ( self::$singular as $pattern => $result ) { if ( preg_match( $pattern, $string ) ) return preg_replace( $pattern, $result, $string ); } return $string; } public static function pluralize_if($count, $string) { if ($count == 1) return "1 $string"; else return $count . " " . self::pluralize($string); } } add_filter( 'asp_indexing_string_post_process', 'asp_index_add_singular_plural', 10, 1 ); function asp_index_add_singular_plural($s) { $final = array(); $words = explode(' ', $s); foreach ($words as $word) { $singular = Inflect::singularize($word); $plural = Inflect::pluralize($word); $final[] = $word; if ($singular != $word) $final[] = $singular; if ($plural != $word) $final[] = $plural; } return implode(' ', $final); }October 9, 2024 at 10:04 am #51371wtseng
ParticipantHi there,
Thanks for your reply! I want to try the synonyms option first as it seem the easiest. I don’t really know about code and don’t want to break the website.
I added original word ‘mask’ and synonym ‘masks’ and created the new index table. After testing it is still not working. I went through all the videos that was made by Ajax Search Pro and there was nothing about synonyms that I could cross check.
Does anyone know what else i can do other than what I am doing??
Thanks!
October 9, 2024 at 11:16 am #51372Ernest Marcinko
KeymasterSure!
I have logged in to check, and the index table engine was not enabled on the search bar, so I enabled it.
Now you should see kind of similar number of results – not exactly the same as due to fuzzy matches, but the number should be much closer.
October 10, 2024 at 10:55 am #51380wtseng
ParticipantThanks so much for that! It’s working!
October 10, 2024 at 11:04 am #51381Ernest Marcinko
KeymasterYou are very welcome 🙂
If you don’t mind, I will close this topic soon and mark it as resolved, feel free to open another one if you have other questions or issues.
If you like the plugin and have not rated already, feel free to leave a rating on your codecanyon downloads page and on the wordpress plugin repository, it’s greatly appreciated.
To help us improving the plugin, you can take this super short survey, we appreciate your feedback!
-
AuthorPosts
- You must be logged in to reply to this topic.