• Resolved yovamacua

    (@yovamacua)


    I have a problem when using the search engine and is that if I have the word “things” but the result is called “thing” when I put the extra “s” but it tells me that there are no results, and I want to show me even if they are only partial results of my search, the search works fine if I just type “thin” without “g” but if I add an additional character even if the rest if it matches it is not shown.

Viewing 3 replies - 1 through 3 (of 3 total)
  • Plugin Author wpdreams

    (@wpdreams)

    Hi,

    It happens, because partial/fuzzy matching is only possible in one direction, meaning that the phrase has to match at least partially the matching content – not the other way around.

    The only way to deal with this is via custom code to apply an inflection library singularize function on the phrase. I will copy/paste a code below, which can deal with it.

    For details on where to place this custom code please can check the safe coding guidelines.

    class InflectTest {
        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',
            'valve'  => 'valves'
        );
    
        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( 'asl_search_phrase_after_cleaning', 'asp_singularize_all_keywords', 10, 1 );
    add_filter( 'asp_search_phrase_after_cleaning', 'asp_singularize_all_keywords', 10, 1 );
    function asp_singularize_all_keywords($s) {
        $s = explode(" ", $s);
        $final = array();
      
        foreach ($s as $word) {
            $singular = InflectTest::singularize($word);
            $final[] = $singular;
        }
    
        return implode(" ", $final);
    }

    All the best,
    Ernest

    Thread Starter yovamacua

    (@yovamacua)

    thank you very much, the code solves my problem perfectly.

    Plugin Author wpdreams

    (@wpdreams)

    Great ?? Thank you for the feedback!

    I will mark this as resolved. Feel free to rate the plugin if you like it, it helps us a lot and it is greatly appreciated!

    All the best,
    Ernest

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘Problem with matching in search’ is closed to new replies.