Skip to main content

Query suggestions in SP 2013 Using Rest API (/_api/search/suggest)


SharePoint Query suggestions: In this post I am going to share with you code snippets to implement the query suggestion in custom text box.



Below are the dependency files 

1. Jquery UI : http://code.jquery.com/ui/1.10.0/jquery-ui.js

2. Jquery AutoComplete CSS:
http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css
http://code.jquery.com/ui/1.10.0/themes/base/jquery.ui.autocomplete.css

3. JQuery: http://code.jquery.com/jquery-1.8.3.js

Query Suggestion Parameter: Here is the post http://blogs.msdn.com/b/nadeemis/archive/2012/08/24/sharepoint-2013-search-rest-api.aspx that specified the detail query suggestions parameter list.

Implementation:

I have two vertical examples.
1. People Vertical
2. Everything Vertical
I wanted to display the query suggestions on TeamSite pages although my search is configured in one of our serach center, so when user search for a particular term and it contains in the search query completion list the rest query get the result form the search center and based on the Jquery autocomplete plugin the results render to the UI. So below is the code snippet.

Get / copy the below code and paste in your script editor web part.

People and everything Query suggestion

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery-ui.css" />
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.0/themes/base/jquery.ui.autocomplete.css" />
<script src="http://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<script src="http://code.jquery.com/jquery-1.8.3.js"></script>
<script>
    // Parse an item and create an title/value hash table with all the properties available
    function getFields(results, requestUrl) {
        r = {};

        if (results != undefined) {
            if (results.Query != undefined) {
                r["Query"] = results.Query;
                r["Path"] = requestUrl + "?k=" + results.Query;
            }
            else {
                r["Query"] = results;
                r["Path"] = requestUrl + "?k=" + results;
            }
        }
        return r;
    }

    function autocompletefn(controlId,requestUrl, isPeople)
    {
        var autocomplete = $(controlId).autocomplete({
            minLength: 3,
            source: function (request, response) {
                $.ajax({
                    beforeSend: function (request) {
                        request.setRequestHeader("Accept", "application/json;odata=verbose;charset=utf-8");
                    },

                    url: "/_api/search/suggest?querytext='" + request.term + "'&fprequerysuggestions=true&showpeoplenamesuggestions=" + isPeople,
                    dataType: "json",
                    success: function (data) {

                        if (isPeople=="true") {
                            response($.map(data.d.suggest.PeopleNames.results, function (item) {
                                return {
                                    fields: getFields(item, requestUrl)
                                }
                            }));
                        } else {
                            response($.map(data.d.suggest.Queries.results, function (item) {
                                return {
                                    fields: getFields(item, requestUrl)
                                }
                            }));
                        }

                    },
                    error: function (data) {
                        alert('search error');
                    }
                });
            },
            // Run this when the item is in focused (not selected)
            focus: function (event, ui) {
               
                return false;
            },
            // Run this when the item is selected
            select: function (event, ui) {
                location.href = ui.item.fields.Path;

            },
            appendTo: $('#menu-container')
        }).data("uiAutocomplete")._renderItem = function (ul, item) {
            return $("<li>").append('<a>' + item.fields.Query + '</a>')
                .appendTo(ul);
        };
    }



    $(document).ready(function () {
        autocompletefn("#restSearch", "http://Sharepointfordeveloper.com/Search/Pages/Results.aspx", "false");   });

  autocompletefn("#People", "http://Sharepointfordeveloper.com/Search/Pages/Peoples.aspx", "true");   });

</script>

<table>
    <tbody>
        <tr>
            <td>Everything Search:</td>
            <td>
                <div id="menu-container" style="width:600px">
                    <input type="text" id="restSearch" size="50" />
                </div>
            </td>
        </tr>
        <tr>
            <td>People Search:</td>
            <td>
                <div id="menu-container" style="width:600px">
                    <input type="text" id="People" size="50" />
                </div>
            </td>
        </tr>

    </tbody>
</table>

"/_api/search/suggest Rest Service responsible for returning query suggestions response. Below are the list of parameters that I used. 

Name
Description
Type
Default
querytext
The text of the search query.
String
Empty
http://host/site/_api/search/suggest?querytext='nad'
fprequerysuggestions
Specifies whether to retrieve pre-query suggestions or post-query suggestions.
bool
False
http://host/site/_api/search/suggest?querytext='nad'&fprequerysuggestions=true
showpeoplenamesuggestions
Specifies if people names should be included in query suggestions.
bool
False
http://host/site/_api/search/suggest?querytext='nad'&showpeoplenamesuggestions=true

Comments

Popular posts from this blog

SharePoint RPC Protocols Examples Using OWSSVR.DLL

What is SharePoint RPC Protocols? Part 1 This reference includes information about the methods and usage of SharePoint Foundation Remote Procedure Call (RPC) protocol. This protocol can be used in Win32-based applications or in ASPX applications to make HTTP POST requests to the server. Methods in this protocol that do not modify the contents of the database can also be used in URL protocol to make HTTP GET requests. Definition taken from http://msdn.microsoft.com/en-us/library/ms448359.aspx You will find the OWSSVR.DLL in SharePoint 2010 Server Physical Path: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI and MOSS C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI OWSSVR.DLL List of commands DialogView  Display ExportList GetProjSchema GetUsageBlob HitCounter RenderView To read more about the OWSSVR.DLL command Please read the URL Protocol from Microsoft Blog having a URL http://msdn.microsoft.com/en...

SharePoint 2013 Search Database Part 1

SharePoint 2013 Search architecture drastically change, as earlier in FS4SP 2010 we have 2 search applications “FASTContentSSA” and “FASTQuerySSA” and 7 total database in use. Following are the List of DB (FS4SP) FASTContentSSA Search Service Application DB Search Service Application Crawl Store DB Search Service Application Property Store DB FASTQuerySSA Search Service Application DB Search Service Application Crawl Store DB Search Service Application Property Store DB FASTSearchAdminDatabase : Fast Search Admin Database  In SharePoint 2013 search has only 1 Search Service application and 4 database in use. No property store database need any more, now the properties are directly stored inside the index component and all the index directly indexed to the physical system where FS4SP data comes from database as well as from the File system now data directly stored and indexed/ retried from the Physical disk because of this performance increase and search experien...

STS CryptographicException Error : Key set does not exist

Common mistakes Both SharePoint Site and SSO Site NOT running on the same application pool. Application pool identity user doesn’t have permission to access the certification.  Solution to this problem Set the same identity pool to  : 2. Be sure to grant rights to the certificate for the App Pool running the web service Start -> Run -> MMC File -> Add/Remove Snapin Add the Certificates Snap In Select Computer Account, then hit next Select Local Computer (the default), then click Finish On the left panel from Console Root, navigate to Certificates (Local Computer) -> Personal -> Certificates You're certificate will most likely be here. Right click on your certificate -> All Tasks -> Manage Private Keys Set you're private key settings here. Add app pool account Reset iis