I while ago I blogged about creating a static link to a pre-refined (pre-filtered) search page. This post follows that idea to it’s natural conclusion by providing a number of JavaScript functions which can dynamically create search result page URLs. These URLs will look something like this:
https://tenant.sharepoint.com/search#Default=%7B%22k%22%3A%22article%22%2C%22r%22%3A%5B%7B%22n%22%3A%22RefinableString20%22%2C%22t%22%3A%5B%22%5C%22%C7%82%C7%824275696c64%5C%22%22%5D%2C%22o%22%3A%22OR%22%2C%22k%22%3Afalse%2C%22m%22%3A%7B%22%5C%22%C7%82%C7%824275696c64%5C%22%22%3A%22Build%22%7D%7D%2C%7B%22n%22%3A%22RefinableString21%22%2C%22t%22%3A%5B%22%5C%22%C7%82%C7%824c6f6e646f6e%5C%22%22%5D%2C%22o%22%3A%22OR%22%2C%22k%22%3Afalse%2C%22m%22%3A%7B%22%5C%22%C7%82%C7%824c6f6e646f6e%5C%22%22%3A%22London%22%7D%7D%5D%7D
The provided scripts support filtering on:
- a search term
- multiple refiners
- multiple values for a refiner, or
- any combination of the above
It would be worth reading the intro of my earlier article to get a better understanding of what is happening in the snippets provided in this post.

OF NOTE:
- As the most common usage will surely be to produce search result page URLs that are refined on a single value, I have written an ‘overload’ function that simplifies calling the method in this scenario
- The ‘search page URL’ can be provided to the functions in a number of ways including:
- “/search” : to the web. The default page for that web. In the case of an Enterprise Search Centre this will be the ‘Everything’ search results page
- “/search/Pages/peopleresults.aspx” : to the page
- Use an absolute URL if you are out of the context of the SharePoint Online tenant in which the search page resides. This will be true for provider hosted add-ins (apps)
- If you are writing your own refiner, then pass an empty string and set
window.location.hash
to the result of the function
- This script has no dependencies on other libraries (jQuery, SP.js, etc)
- The hex encoded string must be UTF-8 encoded. JavaScript is natively UTF-16. The particular scenario where this raised an issue for me was the wide-ampersand character which is often used instead of a standard ampersand as it is XML friendly. ‘unescape’ returns a UTF-8 encoded string and is used to force the required encoding. Thanks to ecmanaut for this solution
- I took inspiration for the stringToHex method from a post by pussard
The functions:
These are examples of how to call the function that are defined above.
Paul.
thank you so much. this blog helped me a lot to customize search.
searchObj.r.push(searchObjRefiner);
i think this line should be out of inner for loop.
I think that you are correct, thanks.
Thanks for the above solution. Have you experienced intermittent loading of results on a custom search result page with refinement panel and cswp webparts? With the same constructed url, there are times it works, and there are times it won’t, but when you refresh the page it will eventually work.
This is a great idea – I’m using for a solution with O365 + Search Pages. I’m looking into a problem with it – for refiner values containing a space – eg. “New York” – as opposed to “London”. Also – issue with characters, like “Washington (DC)”. Have you experienced that also ??