Thursday, July 16, 2020

How to configure Auto Completion enabled search form with Adobe Search and Promote?

This tutorial explains the details on configuring the Auto Completion enabled search form to a website with Adobe Search and promote.

Autocomplete, or word completion, is a feature in which the search form recommends the search terms based on the word user beginning to type.

adobe-search-and-promote-auto-completion

I am enabling the indexing through IndexConnector and enabling custom JSON based templates.

Refer the below URL for details on enabling IndexConnector and the custom templates.

Sample XML feed data

<feed xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<channel>
<title>Product Feed</title>
<Item>
<link>https://qa.example.com/product-title/p/prod1</link>
<title>
<![CDATA[Java Title1]]>
</title>
<description>
<![CDATA[<p>Prod1 description</p>]]>
</description>
<productType>Java</productType>
<ProductId>prod1</ProductId>
<imageUrl>/content/dam/Images/product/prod1.jpg</imageUrl>
</Item>
<Item>
<link>https://qa.example.com/product-title/p/prod2</link>
<title>
<![CDATA[Java Title2]]>
</title>
<description>
<![CDATA[<p>Prod2 description</p>]]>
</description>
<productType>java</productType>
<ProductId>prod2</ProductId>
<imageUrl>/content/dam/Images/product/prod2.jpg</imageUrl>
</Item>
<Item>
<link>https://qa.example.com/product-title/p/prod3</link>
<title>
<![CDATA[Java Title3]]>
</title>
<description>
<![CDATA[<p>Prod3 description</p>]]>
</description>
<productType>java</productType>
<ProductId>prod3</ProductId>
<imageUrl>/content/dam/Images/product/prod3.jpg</imageUrl>
</Item>
<Item>
<link>https://qa.example.com/product-title/p/prod4</link>
<title>
<![CDATA[Java Title4]]>
</title>
<description>
<![CDATA[<p>Prod4 description</p>]]>
</description>
<productType>java</productType>
<ProductId>prod4</ProductId>
<imageUrl>/content/dam/Images/product/prod4.jpg</imageUrl>
</Item>
<Item>
<link>https://qa.example.com/product-title/p/prod5</link>
<title>
<![CDATA[Lava Title]]>
</title>
<description>
<![CDATA[<p>Lava description</p>]]>
</description>
<productType>Lava</productType>
<ProductId>prod5</ProductId>
<imageUrl>/content/dam/Images/product/prod5.jpg</imageUrl>
</Item>
</channel>
</feed>

The various areas of Auto-Complete can be configured through Design → Auto-Complete

Image for post

Configure and setup the options that control the generation of the auto-complete enabled search form

adobe-search-and-promote-auto-completion

Maximum suggestions — Specifies the maximum number of items to display in the auto-complete suggestions list.

Minimum input characters — Specifies the number of characters that a customer must type into the auto-complete search form before it displays suggestions.

Maximum cache entries — Specifies the maximum number of previously requested auto-complete suggestions to cache in the customer’s browser. Generally, you should leave this setting at the default of 1000. While you can completely disable browser caching by setting this option to 0, it is not recommended.

Display shadow — Adds a cosmetic drop-shadow to the auto-complete suggestions list.

Form name — Specifies the “name” attribute of the auto-complete enabled search form’s “form” tag.

Div tag ID — Specifies the ID attribute of the auto-complete enabled search form’s “div” tag.

Input tag ID — Specifies the ID attribute of the auto-complete enabled search form’s “input” tag.

Match only at beginning of phrase — Specifies whether to match the with the beginning of phrase.

Enable the required configurations and save changes

Configure the list of words and phrases that Auto-Complete displays to a customer as suggestions.

adobe-search-and-promote-auto-completion

Popular Searches Period — Controls the time period for the inclusion of words and phrases from a customer’s recent searches.

Maximum Search Count — Controls the maximum number of searched words and phrases to include in the auto-complete word list. The top words and phrases, which are also the most popular, are included.

Field Name — Each field name defines the name of one field for which to include indexed values. Use + and — to add or remove field names.

Maximum Value Count — Defines the maximum count of field values that are allowed for the selected field name. The top values, which are also the most referenced, are included.

Add these words and phrases — The auto-complete word list is populated with the words and phrases that are listed in this area

Remove these words and phrases — Entries in this area are not displayed in the auto-complete word list.Regular expressions are allowed in this list. To specify a regular expression in this list, start the line with regexp followed by a single space, followed by the regular expression. Any lines in the word list that match the regular expression are removed

Ignore Case — Duplicate entries in the auto-complete word list that differ only by alphabetic uppercase/lowercase are removed; all word list entries are forced to lowercase.

Update on Re-Index — Auto-complete word list is automatically regenerated after each successful account re-index.

After enabling the the required configurations the final word list can be previewed — the words are included from different sources “Popular Searches”, “Field Values”, “Added Words & Phrases” and “Removed Words & Phrases”

adobe-search-and-promote-auto-completion

Configure the auto-complete cascading style sheet that you want to use. Auto-Complete CSS controls the content of autocomplete_styles.css, which is included as a part of the auto-complete enabled search form.The CSS you specify here controls the visual presentation of the auto-complete suggestion list.

Image for post

Enable the required CSS changes.

Now the form configurations ready, push the changes to live. The form can be previewed by clicking on “Search Form”

Image for post

The search form HTML can be integrated to website now, retrieve the form source by clicking on “Form Source”

adobe-search-and-promote-auto-completion
<html><!--To apply your custom auto-complete CSS, add the line below (un-commented) within the head section of the page containing this search form.  -->
<head>
<link rel="stylesheet" type="text/css" href="https://content.atomz.com/xxxxxxxxxx/publish/autocomplete_styles.css?sp_css_cache_ver=2" />
</head><body>
<!-- Omniture HTML for Search w/Auto-Complete -->
<!-- Do not change the name of the form from "search_form"! -->
</br>
</br>
<div class="yui-skin-sam">
<form name="search_form" method="get" action="http://xxxxxxxxxx.guided.ss-omtrdc.net" target="_blank">
<input type="text" id="q" name="q" />
<input type="submit" value="Search" />
<div id="autocomplete"></div>
<input type="hidden" name="sp_cs" value="UTF-8" />
</form>
</div>
<!-- For maximum performance, place these tags at the bottom of the body section of the page(s) containing this search form. -->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/utilities/utilities.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/datasource/datasource-min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/autocomplete/autocomplete-min.js"></script>
<script type="text/javascript" src="https://content.atomz.com/xxxxxxxxxx/publish/autocomplete_data.js?sp_js_cache_ver=6"></script>
</body></html>
Image for post

The values of sp_css_cache_ver and sp_js_cache_ver changed on every modification of auto complete setup.

The updated CSS and JavaScript values can be retrieved by enabling the presentation template, enable the required configuration in the presentation template based on the template type, I am using JSON template type in my case

custom_presentation_json.tmpl (Sample with minimal configuration)

<guided-content-type-header content="application/json" />
<guided-if-query-param-defined gsname="callback" /><guided-query-param gsname="callback" />(</guided-if-query-param-defined>
{
"general" :
{
"query" : "<guided-query-param gsname='q' />",
"total" : "<guided-results-total />",
"page_lower" : "<guided-results-lower>",
"page_upper" : "<guided-results-upper>",
"page_total": "<guided-page-total/>"
},
"search-form":
{
"auto-complete-enabled": "<guided-if-autocomplete>1<guided-else-autocomplete>0</guided-if-autocomplete>",
"css": "<guided-ac-css escape="ijson"/>" ,
"form-content": "<guided-ac-form-content escape="ijson"/>",
"javascript": "<guided-ac-javascript escape="js"/>"
}
,
"facets" :
[

],
"results" :
[
<guided-results gsname="default">
{
"index" : "<guided-result-index />",
"title" : "<guided-result-field gsname="title" escape="ijson" />",
"productType" : "<guided-result-field gsname="productType" escape="ijson" />"
}<guided-if-not-last>,</guided-if-not-last>
</guided-results>
]
}
<guided-if-query-param-defined gsname="callback">)</guided-if-query-param-defined>

Retrieve the details through http://xxxxxxxxxx.guided.ss-omtrdc.net/?do=json

{
"general": {
"query": "",
"total": "223",
"page_lower": "1",
"page_upper": "10",
"page_total": "23"
},
"search-form": {
"auto-complete-enabled": "1",
"css": "<link rel=\"stylesheet\" type=\"text/css\" href=\"//content.atomz.com/xxxxxxxxxx/publish/autocomplete_styles.css?sp_js_param=2\" />\n",
"form-content": "<div id=\"autocomplete\"></div>\n\n",
"javascript": "<script type=\"text/javascript\" src=\"
http://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/utilities/utilities.js\"></script>\n<script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/datasource/datasource-min.js\"></script>\n<script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/autocomplete/autocomplete-min.js\"></script>\n<script type=\"text/javascript\" src=\"//content.atomz.com/xxxxxxxxxx/publish/autocomplete_data.js?sp_js_param=4\"></script>"
}
,
"facets": [],
"results": [
{
"index": "",
"title": "Book Lava title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava Title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava Title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava Title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava Title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava title",
"productType": "Book"
},
{
"index": "",
"title": "Book Lava Title",
"productType": "Book"
}
]
}

If you are using custom search form with custom java script and CSS, the auto completion data can be retrieved through the below JSONP URL

https://content.atomz.com/autocomplete/spxx/xx/xx/xx/?callback=jQuery35109061281263500554_1594919810495&query=tit&max_results=7&beginning=1&ignore_apostrophes=1

beginning=0, matches the query data anywhere in the auto completion data

spxx/xx/xx/xx/ — Split the account number to this specific pattern

Stage URL — https://content.atomz.com/autocomplete/spxx/xx/xx/xx-stage/?callback=jQuery35109061281263500554_1594919810495&query=java&max_results=7&beginning=0&ignore_apostrophes=1

<html>
<head>
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<head>
<body>
<script>
var accountno='spxxxxxxxx';
var splitan = accountno.substring(0, 4) + "/" + accountno.substring(4, 6) + "/" + accountno.substring(6, 8) + "/" + accountno.substring(8) + "/";
var url = "https://content.atomz.com/autocomplete/" + splitan;
var query = 'tit';
var max_results = 7;
var beginning = 1;
$.ajax({
url : url,
data : {query: query, max_results: max_results, beginning: beginning},
dataType : 'jsonp',
success : function(data){
if(data.length){
alert(data);
$.each(data, function(i, field){
//add the individual data to the auto completion div
});
}else{

}
}
});
</script>
</body>
<html>
Image for post

The Auto-completion can be used in the search form to recommends the search terms based on the word user beginning to type.



Tuesday, July 14, 2020

How to enable Did you mean feature in Adobe Search and Promote | Enable Guided Suggestions in Adobe Search and Promote

This tutorial explains the details on “Did You Mean” feature in Adobe Search and Promote.

You can configure “Did You Mean” so that customers are given suggestions for valid search terms when they have tried searches that have failed. Suggestions are formed by looking for spelling and typing corrections to the search terms that result in a valid search.

This feature helps to avoid the null search due to wrong spelling of words in the search term and improve the conversion.

Configuring Did You Mean

You can tailor how site search/merchandising makes search suggestions when a customer’s query returns no, or minimal, search results.

To enable Did You Mean feature, access Linguistics → Did You Mean

adobe-search-and-promote-did-you-mean

Remove these Words from Suggestions — enter space or line separated words to filter undesirable suggestions.

Suggestion Algorithm — Adjusts how far the software goes to find suggestions. If a user makes a one-letter mistake, all of the algorithms come up with the same suggestions. The reason why is because it only takes one edit to arrive at a working suggestion, and all algorithms find words that are close to the original. But when the original search terms are not similar to existing terms in the index, the Deep and Bad Spellers Suggestion Algorithms continue to search for possible suggestions. This scenario is useful if a customer tries a proper name that is hard to type, and they sound out the names. However, if you only want similar suggestions to appear, you can choose the Quick algorithm

Default count of suggestions to show — Specifies the number of Did You Mean term suggestions (0–20) that you want to show when a customer’s search returns no results. The default is 3.

Minimal suggestion word length — Prunes Did You Mean terms by specifying the minimal number of letters for a suggested word. For example, if you set the value to 4, the software does not suggest a word that is 1, 2, or 3 characters long. If you specify a value of 0, no short words are removed from the term suggestions. If you specify a high value, it usually results in no term suggestions. The default value is 3.

Minimum index frequency — Specifies the minimum number of times a word has to appear in the index before it is included in the Did You Mean dictionary. You cannot specify a negative number in the field.

Search for suggest term if no results — Automatically re-searches for the first suggested term when a customer’s search yields no results and there is at least one Did You Mean term suggestion.

Make suggestions due to low results — If a customer searches for a term that yields less than ten results, the search engine checks to see if it has a suggestion that can yield more than 100 results. The number of suggestions is controlled by the value that is specified in Default count of suggestions to show. The low and high threshold are configurable by the options below.

Make suggestions when the initial results are fewer than — Controls the number of results when the system starts to offer suggestions. This option appears only when you check Make suggestions due to low results. The default is 10.

The Did You Mean functionality can be enabled in three ways: make suggestions due to no results, automatically search against the first suggestion when we have no results, or make suggestions due to low results (where the suggestions have a higher result count).

Let us enable the indexing with IndexConnector(the URL entrypoint can be used if required), refer the below URL for details on enabling IndexConnector and configuring custom templates.

The sample feed data for indexing, enable the required metadata, IndexConnector, URL entrypoint and the custom templates by following the previous tutorial URL

<feed xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<channel>
<title>Product Feed</title>
<Item>
<link>https://qa.example.com/product-title/p/prod1</link>
<title>
<![CDATA[Java Title]]>
</title>
<description>
<![CDATA[<p>Prod1 description</p>]]>
</description>
<productType>Java</productType>
<ProductId>prod1</ProductId>
<imageUrl>/content/dam/Images/product/prod1.jpg</imageUrl>
</Item>
<Item>
<link>https://qa.example.com/product-title/p/prod2</link>
<title>
<![CDATA[Lava Title]]>
</title>
<description>
<![CDATA[<p>Prod2 description</p>]]>
</description>
<productType>Lava</productType>
<ProductId>prod2</ProductId>
<imageUrl>/content/dam/Images/product/prod2.jpg</imageUrl>
</Item>

</channel>
</feed>

Enable the transport template — custom_backend_json.tpl

<search-content-type-header charset="UTF-8">
{
"general": {
"query" : "<search-query />",
"total" : "<search-total />",
"lower" : "<search-lower />",
"upper" : "<search-upper />"
},
<search-if-suggestions>
"suggestions":
[
<search-suggestions>
{
"suggestion":"<search-suggestion-text />",
"count": "<search-suggestion-result-count>"
}<search-if-not-last-suggestion>,</search-if-not-last-suggestion>
</search-suggestions>
],
</search-if-suggestions>


"facets" : [
{
"name" : "n1",
"values" : [<search-field-value-list name="n1" quotes="yes" data="values" sortby="values" encoding="json" />],
"counts" : [<search-field-value-list name="n1" quotes="no" data="results" sortby="values" />]
}
],
"results" : [
<search-results>
{
"fields" :
[
{
"name" : "mdi",
"value" : "<search-display-field name="mdi" length="500" encoding="json" />"
},
{
"name" : "title",
"value" : "<search-display-field name="title" encoding="json" />"
},
{
"name" : "productType",
"value" : "<search-display-field name="productType" encoding="json" />"
}
]
}
<search-if-not-last>,</search-if-not-last>
</search-results>
]
}

Enable the transport template — custom_presentation_json.tmpl

<guided-content-type-header content="application/json" />
<guided-if-query-param-defined gsname="callback" /><guided-query-param gsname="callback" />(</guided-if-query-param-defined>
{
"general" :
{
"query" : "<guided-query-param gsname='q' />",
"total" : "<guided-results-total />",
"page_lower" : "<guided-results-lower>",
"page_upper" : "<guided-results-upper>",
"page_total": "<guided-page-total/>"
},

"suggestions":
{
"auto_searched": "<guided-if-suggestion-autosearch>1<guided-else-suggestion-autosearch>0</guided-if-suggestion-autosearch>"
<guided-if-suggestion-autosearch>,
"auto_search_query":"<guided-query-param gsname="q"/>",
"original_query":"<guided-suggestion-original-query />"
</guided-if-suggestion-autosearch>,
"suggestion_low_result":"<guided-if-suggestion-low-results>1<guided-else-suggestion-low-results>0</guided-if-suggestion-low-results>",
"suggestion_items":[
<guided-if-suggestions>
<guided-suggestions>
{
"path": "<guided-suggestion-path>",
"value": "<guided-suggestion>",
"count": "<guided-suggestion-result-count>"
}<guided-if-not-last>,</guided-if-not-last>
</guided-suggestions>
</guided-if-suggestions>
]
},"facets" :
[

],
"results" :
[
<guided-results gsname="default">
{
"index" : "<guided-result-index />",
"title" : "<guided-result-field gsname="title" escape="ijson" />",
"productType" : "<guided-result-field gsname="productType" escape="ijson" />"
}<guided-if-not-last>,</guided-if-not-last>
</guided-results>
]
}
<guided-if-query-param-defined gsname="callback">)</guided-if-query-param-defined>

The configurations are ready, let us now run a Stage indexing (note the configuration are not pushed to live yet)

Index →Full Index →Staged Index →Run Full Index

Image for post

Let us now test with the default “Did You Mean” configurations

Access http://stage-xxxxxxxxxxx.guided.ss-omtrdc.net/do=json&sp_staged=1&q=bava

xxxxxxxxxxx — Search and Promote account number

There is no matching data for the term “bava”, this will provide all the available suggestions with search link and search value those data can be used to show the suggestion to the users.

{
"general": {
"query": "bava",
"total": "0",
"page_lower": "0",
"page_upper": "0",
"page_total": "1"
},
"suggestions": {
"auto_searched": "0",
"suggestion_low_result": "0",
"suggestion_items": [
{
"path": "?do=json;i=1;q=lava;sp_staged=1",
"value": "lava",
"count": "1"
},
{
"path": "?do=json;i=1;q=java;sp_staged=1",
"value": "java",
"count": "1"
}
]

},
"facets": [],
"results": []
}

Let us now enable “Search for suggest term if no results” option — Automatically re-searches for the first suggested term when a customer’s search yields no results and there is at least one Did You Mean term suggestion.

Image for post

Access http://stage-xxxxxxxxxxx.guided.ss-omtrdc.net/do=json&sp_staged=1&q=bava, this will provide all the available suggestions(other than the first suggestion used for auto search) and returns the result by searching with first suggested term.

{
"general": {
"query": "lava",
"total": "1",
"page_lower": "1",
"page_upper": "1",
"page_total": "1"
},
"suggestions": {
"auto_searched": "1",
"auto_search_query": "lava",
"original_query": "bava",
"suggestion_low_result": "0",
"suggestion_items": [
{
"path": "?do=json;i=1;q=java;sp_staged=1",
"value": "java",
"count": "1"
}
]

},
"facets": [],
"results": [
{
"index": "",
"title": "Lava Title",
"productType": "Lava"
}
]

}

“Make suggestions due to low results” — if a customer searches for a term that yields less than ten results, the search engine checks to see if it has a suggestion that can yield more than 100 results.

Image for post

This will return “suggestion_low_result”: “1” and the available suggestions that yield more than 100 results but somehow the scenario is not working as expected. I will be updating the tutorial with further details.

The configuration can be pushed live after successful validation and run a live index →Full Index →Live Index →Run Full Index

The URL to access live data http://xxxxxxxxxxx.guided.ss-omtrdc.net/do=json&q=bava

The suggest data returned can be used to enable the “Did You Mean” functionality in the website.