Forums » Plugin: Relevanssi - A Better Search » Need help fine tuning the Did you mean feature

  • Resolved CB

    (@cbrandt)


    Hi,

    Thanks for this great plugin. I’ve only now realized that it has the “Did you mean?” feature, and I’m trying to implement it on a free version (hobby site). Mine is a pronunciation dictionary, and as is common for online dictionaries, I’ve set Relevanssi to (1) redirect to the word when there’s (only one) perfect match; (2) list alternative words when there are more than one match; and (3) 404 with “Your search didn’t find anything” when there’s no match at all.

    I’ve managed to add the snippet to create the shortcode for the Did You Mean functionality, but I’m having 2 issues.

    First, I’m having a hard time adding the filter to change the number of hits a successful search needs to have to be considered as alternative. Currently, only misspelled searches for words that would return 3 or more hits are properly showing alternatives. So I’m trying to add the filter to actually reduce that number, instead of increasing it, as having only 1 hit would be the case with 95% of my posts.

    add_filter( 'relevanssi_get_words_having', function() { return 1; } );
    

    I tried adding it right before and right after the shortcode snippet in the functions.php, but it changed nothing.

    Do I also need to change the line that invokes the shortcode in the search resultsindex.php file? Sorry if this is too basic, but though familiar with coding to add snippets, I’m not a developer.

    The second issue is that, for those cases where the DYM is successfully added to the results page, I’m seeing it return twice the same line, with the same URL. That URL is the search results page with all the hits for the successful term. So if I search for tho it give me back:

    Você quis dizer: to?
    
    Você quis dizer: to?

    Where to is actually the URL where you find matches for the term to as well as 5 expressions such as have to, next to etc. Ideally, I’d have 6 lines, each pointing to the end URL of each of these terms and phrases.

    Thank you in advance for your time and any help will be much welcome.

    EDIT: I should add that I’ve set search logging a few years back, so I have enough terms already logged. Example of searches that are not returning:

    • Query # Hits Clicks
    • that 24 1 –
    • where 20 1 –
    • there 20 1 –
    • this 20 1 –
    • with 20 2 –
    • This topic was modified 6 months, 2 weeks ago by CB.

    The page I need help with: [log in to see the link]

Viewing 9 replies - 1 through 9 (of 9 total)
  • Plugin Author Mikko Saari

    (@msaari)

    This filter hook does not do what you think it does:

    add_filter( 'relevanssi_get_words_having', function() { return 1; } );

    Remove this; this may stop your “Did you mean” suggestions from working at all.

    The minimum number of hits is set in the relevanssi_didyoumean() function:

    if ( function_exists( 'relevanssi_didyoumean' ) ) {
        relevanssi_didyoumean(
        	get_search_query( false ),
            '<p>Did you mean: ',
            '</p>',
            5
        );
    }

    There the number 5 is the minimum number of results. Change that to 1.

    If you’re seeing the suggestion twice, it is possible you’re calling the function twice? Could you please show me the template?

    You may also want to remove all stopwords from Relevanssi settings; stopwords are not useful for dictionaries.

    Thread Starter CB

    (@cbrandt)

    There the number 5 is the minimum number of results. Change that to 1.

    I had tried that, and because it didn’t solve my issue, I then tried adding the filter. I’ve now removed the filter and changed that back from 5 to 1, but it doesn’t change things.

    Could you please show me the template?

    Please see: https://pastebin.com/Uz5XtquC

    remove all stopwords

    Yes, I removed them in the initial setup.

    Thank you for your time and support.

    • This reply was modified 6 months, 2 weeks ago by CB.
    Plugin Author Mikko Saari

    (@msaari)

    And you have the fifth parameter of the function set to false in the shortcode? If it’s true or missing, then you’d get the output twice.

    Make sure it looks exactly like this:

    add_shortcode( 'rlv_didyoumean', function() {
      $didyoumean = '';
      if ( function_exists( 'relevanssi_didyoumean' ) ) {
        $didyoumean = relevanssi_didyoumean(
          get_search_query( false ),
          '<p>Did you mean: ',
          '</p>',
          1,
          false
        );
      }
      return $didyoumean;
    } );

    And now that I read your question correctly, then yes, you do also need this:

    add_filter( 'relevanssi_get_words_having', function() { return 1; } );

    It’s not a good thing to do, though; there’s a reason why the minimum here is three. I would recommend not using this for performance reasons, it’s possible setting this to 1 will break this feature, as too many words are included.

    In any case, adjusting this takes effect slowly, as the suggestion words are heavily cached. There’s a month-long cache, as the query to fetch the words is very slow. You can have this take instant effect by adding this to your site:

    delete_transient( 'relevanssi_didyoumean_query' );

    Add this to your theme functions.php, do a search, then remove the line.

    Thread Starter CB

    (@cbrandt)

    function set to false in the shortcode?

    Oh, yes, I had removed false when trying stuff, but fixed this now and it’s working without the double. Thanks.

    Add this to your theme functions.php, do a search, then remove the line.

    The idea here is to remove the cache for the suggestions, and start it anew? Or just to make the function look at the whole cache?

    As far as performance goes, this is a test and I’d set my caching plugin to cache the results, so it *may* be worth trying, no? I’m also adding rate-limiting to search queries if it all works, to avoid bots running random queries.

    Plugin Author Mikko Saari

    (@msaari)

    The remove_transient() deletes the cache, forcing Relevanssi to recreate it.

    Your cache plugin won’t help with this; the problem is that the query may be too heavy to run even for the first time, causing the Did you mean feature to fail completely. But if it runs, then there’s no problem doing searches, because Relevanssi caches the query results for 30 days and it’ll be pretty fast with that.

    Thread Starter CB

    (@cbrandt)

    Thank you. So far, what worked is adding the filter relevanssi_get_words_having but with a value of 0 instead of 1. The logic is based on greater than, right? So greater than 0 returns suggestions with at least 1 search hit, which is what I want. However, I can’t make it return more than 1 word. So a search for the word “ug” would return correctly:

    Did you mean: up?

    While a search for “ut” returns:

    Did you mean: it?

    “up” has just one search hit, while it has 4 hits. So it seems to order by number of hits and only return the first result. Is there a way to change that and make it return:

    Did you mean: up, it, ...?

    As a side note re: performance, this is a small website, and with logging enabled for over a year, it only has about 100 words logged as successful searches, so I guess returning suggestions with only 1 hit shouldn’t be a big weight on the system, right?

    • This reply was modified 6 months, 2 weeks ago by CB.
    Thread Starter CB

    (@cbrandt)

    only has about 100 words

    Sorry, that of course is the limit in the log viewer. I’ve just downloaded the log CSV file, and filtering for hits greater than 0 I got a bit less than 4,000 successful hits for a month (September).

    Plugin Author Mikko Saari

    (@msaari)

    The Relevanssi “Did you mean” works like the Google one and only offers the best suggestion.

    The hit count isn’t checked, only the closeness to the original word. “Up” and “it” are both one letter exchange away from “ut”, so they’re equally good; “it” just happens to come first, probably because the change is in the first letter. This isn’t optimized for small words like this and makes more sense with larger words.

    There’s no way to get more suggestions out of this. If you want a “Did you mean” feature that returns multiple results, you need to customize the function. It wouldn’t be terribly difficult – instead of returning one result, return all that are within specific Levenshtein distance (that’s what the function uses to determine the closeness) – but it does require some rewriting of the code to produce links to multiple searches.

    Thread Starter CB

    (@cbrandt)

    The Relevanssi “Did you mean” works like the Google one and only offers the best suggestion.

    It all makes total sense to me now, thank you.

    customize the function

    require some rewriting of the code

    I’ll see if I can come up with a solution for multiple suggestions, but…

    As it is, the function does a great job! I re-ran many of the logged “unsuccessful” searches and it does an amazing job as far as suggesting the right word, I’d say something like >90% of the attempts.

    I only had a small issue with expressions. Though 99% or entries in the dictionary are single words, I have a small set of 2- or 3-word phrases, like “come on”, but searching for anything with a space character resulted in an odd output. To circumvent that, I added an if condition to the index.php excluding queries with an space from invoking the DYM shortcode.

    My final setup, for those searching for a solution to a similar situation, that is, adding Did You Mean functionality to a dictionary or dictionary-like website:

    In the child theme’sfunctions.php:

    // Add Did You Mean? functionality to search by Relevanssi
    // Discussion: https://wordpress.org/support/topic/need-help-fine-tuning-the-did-you-mean-feature/
    
    add_shortcode( 'rlv_didyoumean', function() {
      $didyoumean = '';
      if ( function_exists( 'relevanssi_didyoumean' ) ) {
        $didyoumean = relevanssi_didyoumean(
          get_search_query( false ),
          '<p>Voc&ecirc; quis dizer: ',
          '?</p>',
          1,
          false
        );
      }
      return $didyoumean;
    } );
    // Get suggestions from words with 1 or more results
    add_filter( 'relevanssi_get_words_having', function() { return 0; } );
    

    In the index.php (which in the Twenty-Twenty theme handles search results):

    // Invoke Did You Mean shortcode, by Relevanssi
    // But only if query does not contain a space character
    
    $query_str = get_search_query( false );
    if (preg_match("/\s/", urldecode($query_str) ) == false){ 
        echo do_shortcode( '[rlv_didyoumean]' );
    }

    Thank you very much, @msaari for this great plugin and your generous support. I appreciate the time you devoted to guide me through this.

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘Need help fine tuning the Did you mean feature’ is closed to new replies.