<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.socialstack.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=46.16.211.253</id>
	<title>SocialStack - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.socialstack.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=46.16.211.253"/>
	<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Special:Contributions/46.16.211.253"/>
	<updated>2026-10-16T05:42:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=625</id>
		<title>Filters</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=625"/>
		<updated>2024-01-29T16:50:51Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Sorting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filters are a query-like mechanism for filtering out results from a list endpoint. At their core, they are textual and support a set of arguments.&lt;br /&gt;
&lt;br /&gt;
= Filter examples =&lt;br /&gt;
&lt;br /&gt;
A textual filter with arguments is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
(UserId=? or UserId=?) and CreatedUtc&amp;gt;?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is not case sensitive. Filters in the permission system do not support these ? arguments (as it wouldn&amp;#039;t know where to bind the value from).&lt;br /&gt;
&lt;br /&gt;
Typically you&amp;#039;ll see this textual form of filter inside a Where() call in the C# API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
uint userId = 14;&lt;br /&gt;
&lt;br /&gt;
var listOfThingsByThisUser = await Where(&amp;quot;UserId=?&amp;quot;).Bind(userId).ListAll(context);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.Bind() is used to bind the actual value of an argument. Values are bound in this way such that the filter string is a constant and can benefit from being precompiled. Indeed, the whole filter system is built to be entirely non-allocating, as the Bind calls internally set your provided value onto an compiled object field, with that object originating from a pool for the given cached filter.&lt;br /&gt;
&lt;br /&gt;
= JS filter notation =&lt;br /&gt;
&lt;br /&gt;
Filters can also be constructed by the frontend, most often by [[Loop]]. In this scenario, a convenience filter notation is also available - it&amp;#039;ll take the object notation you provide, and then convert it into the textual format with arguments. Here&amp;#039;s some examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;quot;page&amp;quot; filter={&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}&amp;gt;&lt;br /&gt;
 {page =&amp;gt; { return &amp;lt;p&amp;gt;{page.url}&amp;lt;/p&amp;gt;; }}&lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filter object itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Operators]] can be used by passing an object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: {&lt;br /&gt;
            greaterThan: 14&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or statements are represented with an array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: [{&lt;br /&gt;
        userId: 14&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        userId: 16&lt;br /&gt;
    }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And statements are performed by providing multiple field values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14,&lt;br /&gt;
        createdUtc: {&lt;br /&gt;
            greaterThan: yesterday /* yesterday is a JS Date */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need more expressive power, you can also directly specify the query and args:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query/args being passed in to webRequest and Loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;#039;page&amp;#039; filter={{query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]}}&amp;gt; ... &lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operators =&lt;br /&gt;
&lt;br /&gt;
Filters support a variety of operators for comparisons:&lt;br /&gt;
&lt;br /&gt;
* Greater than&lt;br /&gt;
  * Field&amp;gt;?   (query notation)&lt;br /&gt;
  * {greaterThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than&lt;br /&gt;
  * Field&amp;lt;?   (query notation)&lt;br /&gt;
  * {lessThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Greater than or equal&lt;br /&gt;
  * Field&amp;gt;=?   (query notation)&lt;br /&gt;
  * {greaterThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {geq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than or equal&lt;br /&gt;
  * Field&amp;lt;=?   (query notation)&lt;br /&gt;
  * {lessThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {leq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Equals&lt;br /&gt;
  * Field=?   (query notation)&lt;br /&gt;
  * x    (JS notation)&lt;br /&gt;
  * {equals: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Not&lt;br /&gt;
  * Field!=?   (query notation)&lt;br /&gt;
  * !( .... )   (query notation)&lt;br /&gt;
  * {not: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Starts with (textual values only)&lt;br /&gt;
  * Field startsWith ?   (query notation)&lt;br /&gt;
  * {startsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Ends with (textual values only)&lt;br /&gt;
  * Field endsWith ?   (query notation)&lt;br /&gt;
  * {endsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Contains (textual values only)&lt;br /&gt;
  * Field contains ?   (query notation)&lt;br /&gt;
  * {contains: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
If you provide an array of values you must tell the query system that you are doing so by surrounding your ? arg with square brackets, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Name=[?]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This syntax exists such that the precompiled filter is ready to receive a set of values rather than just one.&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;re doing this in C# you can then bind any IEnumerable like so, provided its data type matches that of the target field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nameList = new List&amp;lt;string&amp;gt;() { &amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
var resultsWithEitherName = await Where(&amp;quot;Name=[?]&amp;quot;).Bind(nameList).ListAll(context);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From javascript you can just pass an array inside your args like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;query&amp;quot;: &amp;quot;Name=[?]&amp;quot;,&lt;br /&gt;
    &amp;quot;args&amp;quot;: [&lt;br /&gt;
        [&amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot;]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Virtual Fields =&lt;br /&gt;
&lt;br /&gt;
Virtual Fields can be used inside filter query strings as well just by simply using their name. The value is always the uint IDs. So for example if we want to get all pages tagged with &amp;quot;hello&amp;quot;, first we need to get the ID of the tag &amp;quot;hello&amp;quot; (which we&amp;#039;ll say is tag #4) and then from there can use it as either an array or a number as-is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains ?&amp;quot;, // Results must have tag #4 on them, but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=?&amp;quot;, // Results must have exactly 1 tag and it must be tag #4&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can query with an array as well, and like above there are two variants:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains [?]&amp;quot;, // Results must have tag #4 and tag #5 on them but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=[?]&amp;quot;, // Results must have exactly tags #4 and #5 and no others&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sorting =&lt;br /&gt;
&lt;br /&gt;
You can create a filter which sorts using &amp;quot;sort&amp;quot; like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    //query+args or where here,&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;sort&amp;quot;:{&lt;br /&gt;
        &amp;quot;field&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
        &amp;quot;direction&amp;quot;: &amp;quot;desc&amp;quot; // or asc&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Filter functions =&lt;br /&gt;
&lt;br /&gt;
Most often seen in the permission system. These are functions used within a query filter. Filter functions are generic and can also be custom defined by installable modules if you need another. Example code which adds a filter function can be seen on the [[API_Context|context extensions page]]. Variations of UserPermits (&amp;quot;CompanyPermits&amp;quot; etc) are quite common.&lt;br /&gt;
&lt;br /&gt;
* IsSelf()&lt;br /&gt;
* HasUserPermit()&lt;br /&gt;
* HasRolePermits()&lt;br /&gt;
* IsIncluded()&lt;br /&gt;
* On(...)&lt;br /&gt;
&lt;br /&gt;
Todo: describing the above, particularly On and IsIncluded&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=624</id>
		<title>Filters</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=624"/>
		<updated>2024-01-29T16:49:47Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Sorting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filters are a query-like mechanism for filtering out results from a list endpoint. At their core, they are textual and support a set of arguments.&lt;br /&gt;
&lt;br /&gt;
= Filter examples =&lt;br /&gt;
&lt;br /&gt;
A textual filter with arguments is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
(UserId=? or UserId=?) and CreatedUtc&amp;gt;?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is not case sensitive. Filters in the permission system do not support these ? arguments (as it wouldn&amp;#039;t know where to bind the value from).&lt;br /&gt;
&lt;br /&gt;
Typically you&amp;#039;ll see this textual form of filter inside a Where() call in the C# API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
uint userId = 14;&lt;br /&gt;
&lt;br /&gt;
var listOfThingsByThisUser = await Where(&amp;quot;UserId=?&amp;quot;).Bind(userId).ListAll(context);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.Bind() is used to bind the actual value of an argument. Values are bound in this way such that the filter string is a constant and can benefit from being precompiled. Indeed, the whole filter system is built to be entirely non-allocating, as the Bind calls internally set your provided value onto an compiled object field, with that object originating from a pool for the given cached filter.&lt;br /&gt;
&lt;br /&gt;
= JS filter notation =&lt;br /&gt;
&lt;br /&gt;
Filters can also be constructed by the frontend, most often by [[Loop]]. In this scenario, a convenience filter notation is also available - it&amp;#039;ll take the object notation you provide, and then convert it into the textual format with arguments. Here&amp;#039;s some examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;quot;page&amp;quot; filter={&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}&amp;gt;&lt;br /&gt;
 {page =&amp;gt; { return &amp;lt;p&amp;gt;{page.url}&amp;lt;/p&amp;gt;; }}&lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filter object itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Operators]] can be used by passing an object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: {&lt;br /&gt;
            greaterThan: 14&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or statements are represented with an array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: [{&lt;br /&gt;
        userId: 14&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        userId: 16&lt;br /&gt;
    }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And statements are performed by providing multiple field values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14,&lt;br /&gt;
        createdUtc: {&lt;br /&gt;
            greaterThan: yesterday /* yesterday is a JS Date */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need more expressive power, you can also directly specify the query and args:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query/args being passed in to webRequest and Loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;#039;page&amp;#039; filter={{query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]}}&amp;gt; ... &lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operators =&lt;br /&gt;
&lt;br /&gt;
Filters support a variety of operators for comparisons:&lt;br /&gt;
&lt;br /&gt;
* Greater than&lt;br /&gt;
  * Field&amp;gt;?   (query notation)&lt;br /&gt;
  * {greaterThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than&lt;br /&gt;
  * Field&amp;lt;?   (query notation)&lt;br /&gt;
  * {lessThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Greater than or equal&lt;br /&gt;
  * Field&amp;gt;=?   (query notation)&lt;br /&gt;
  * {greaterThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {geq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than or equal&lt;br /&gt;
  * Field&amp;lt;=?   (query notation)&lt;br /&gt;
  * {lessThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {leq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Equals&lt;br /&gt;
  * Field=?   (query notation)&lt;br /&gt;
  * x    (JS notation)&lt;br /&gt;
  * {equals: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Not&lt;br /&gt;
  * Field!=?   (query notation)&lt;br /&gt;
  * !( .... )   (query notation)&lt;br /&gt;
  * {not: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Starts with (textual values only)&lt;br /&gt;
  * Field startsWith ?   (query notation)&lt;br /&gt;
  * {startsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Ends with (textual values only)&lt;br /&gt;
  * Field endsWith ?   (query notation)&lt;br /&gt;
  * {endsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Contains (textual values only)&lt;br /&gt;
  * Field contains ?   (query notation)&lt;br /&gt;
  * {contains: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
If you provide an array of values you must tell the query system that you are doing so by surrounding your ? arg with square brackets, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Name=[?]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This syntax exists such that the precompiled filter is ready to receive a set of values rather than just one.&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;re doing this in C# you can then bind any IEnumerable like so, provided its data type matches that of the target field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nameList = new List&amp;lt;string&amp;gt;() { &amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
var resultsWithEitherName = await Where(&amp;quot;Name=[?]&amp;quot;).Bind(nameList).ListAll(context);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From javascript you can just pass an array inside your args like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;query&amp;quot;: &amp;quot;Name=[?]&amp;quot;,&lt;br /&gt;
    &amp;quot;args&amp;quot;: [&lt;br /&gt;
        [&amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot;]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Virtual Fields =&lt;br /&gt;
&lt;br /&gt;
Virtual Fields can be used inside filter query strings as well just by simply using their name. The value is always the uint IDs. So for example if we want to get all pages tagged with &amp;quot;hello&amp;quot;, first we need to get the ID of the tag &amp;quot;hello&amp;quot; (which we&amp;#039;ll say is tag #4) and then from there can use it as either an array or a number as-is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains ?&amp;quot;, // Results must have tag #4 on them, but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=?&amp;quot;, // Results must have exactly 1 tag and it must be tag #4&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can query with an array as well, and like above there are two variants:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains [?]&amp;quot;, // Results must have tag #4 and tag #5 on them but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=[?]&amp;quot;, // Results must have exactly tags #4 and #5 and no others&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sorting =&lt;br /&gt;
&lt;br /&gt;
You can create a filter which sorts using &amp;quot;sort&amp;quot; like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;sort&amp;quot;:{&lt;br /&gt;
        &amp;quot;field&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
        &amp;quot;direction&amp;quot;: &amp;quot;desc&amp;quot; // or asc&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Filter functions =&lt;br /&gt;
&lt;br /&gt;
Most often seen in the permission system. These are functions used within a query filter. Filter functions are generic and can also be custom defined by installable modules if you need another. Example code which adds a filter function can be seen on the [[API_Context|context extensions page]]. Variations of UserPermits (&amp;quot;CompanyPermits&amp;quot; etc) are quite common.&lt;br /&gt;
&lt;br /&gt;
* IsSelf()&lt;br /&gt;
* HasUserPermit()&lt;br /&gt;
* HasRolePermits()&lt;br /&gt;
* IsIncluded()&lt;br /&gt;
* On(...)&lt;br /&gt;
&lt;br /&gt;
Todo: describing the above, particularly On and IsIncluded&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=623</id>
		<title>Filters</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=623"/>
		<updated>2024-01-29T16:48:14Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Sorting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filters are a query-like mechanism for filtering out results from a list endpoint. At their core, they are textual and support a set of arguments.&lt;br /&gt;
&lt;br /&gt;
= Filter examples =&lt;br /&gt;
&lt;br /&gt;
A textual filter with arguments is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
(UserId=? or UserId=?) and CreatedUtc&amp;gt;?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is not case sensitive. Filters in the permission system do not support these ? arguments (as it wouldn&amp;#039;t know where to bind the value from).&lt;br /&gt;
&lt;br /&gt;
Typically you&amp;#039;ll see this textual form of filter inside a Where() call in the C# API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
uint userId = 14;&lt;br /&gt;
&lt;br /&gt;
var listOfThingsByThisUser = await Where(&amp;quot;UserId=?&amp;quot;).Bind(userId).ListAll(context);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.Bind() is used to bind the actual value of an argument. Values are bound in this way such that the filter string is a constant and can benefit from being precompiled. Indeed, the whole filter system is built to be entirely non-allocating, as the Bind calls internally set your provided value onto an compiled object field, with that object originating from a pool for the given cached filter.&lt;br /&gt;
&lt;br /&gt;
= JS filter notation =&lt;br /&gt;
&lt;br /&gt;
Filters can also be constructed by the frontend, most often by [[Loop]]. In this scenario, a convenience filter notation is also available - it&amp;#039;ll take the object notation you provide, and then convert it into the textual format with arguments. Here&amp;#039;s some examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;quot;page&amp;quot; filter={&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}&amp;gt;&lt;br /&gt;
 {page =&amp;gt; { return &amp;lt;p&amp;gt;{page.url}&amp;lt;/p&amp;gt;; }}&lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filter object itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Operators]] can be used by passing an object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: {&lt;br /&gt;
            greaterThan: 14&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or statements are represented with an array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: [{&lt;br /&gt;
        userId: 14&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        userId: 16&lt;br /&gt;
    }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And statements are performed by providing multiple field values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14,&lt;br /&gt;
        createdUtc: {&lt;br /&gt;
            greaterThan: yesterday /* yesterday is a JS Date */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need more expressive power, you can also directly specify the query and args:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query/args being passed in to webRequest and Loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;#039;page&amp;#039; filter={{query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]}}&amp;gt; ... &lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operators =&lt;br /&gt;
&lt;br /&gt;
Filters support a variety of operators for comparisons:&lt;br /&gt;
&lt;br /&gt;
* Greater than&lt;br /&gt;
  * Field&amp;gt;?   (query notation)&lt;br /&gt;
  * {greaterThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than&lt;br /&gt;
  * Field&amp;lt;?   (query notation)&lt;br /&gt;
  * {lessThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Greater than or equal&lt;br /&gt;
  * Field&amp;gt;=?   (query notation)&lt;br /&gt;
  * {greaterThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {geq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than or equal&lt;br /&gt;
  * Field&amp;lt;=?   (query notation)&lt;br /&gt;
  * {lessThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {leq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Equals&lt;br /&gt;
  * Field=?   (query notation)&lt;br /&gt;
  * x    (JS notation)&lt;br /&gt;
  * {equals: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Not&lt;br /&gt;
  * Field!=?   (query notation)&lt;br /&gt;
  * !( .... )   (query notation)&lt;br /&gt;
  * {not: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Starts with (textual values only)&lt;br /&gt;
  * Field startsWith ?   (query notation)&lt;br /&gt;
  * {startsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Ends with (textual values only)&lt;br /&gt;
  * Field endsWith ?   (query notation)&lt;br /&gt;
  * {endsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Contains (textual values only)&lt;br /&gt;
  * Field contains ?   (query notation)&lt;br /&gt;
  * {contains: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
If you provide an array of values you must tell the query system that you are doing so by surrounding your ? arg with square brackets, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Name=[?]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This syntax exists such that the precompiled filter is ready to receive a set of values rather than just one.&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;re doing this in C# you can then bind any IEnumerable like so, provided its data type matches that of the target field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nameList = new List&amp;lt;string&amp;gt;() { &amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
var resultsWithEitherName = await Where(&amp;quot;Name=[?]&amp;quot;).Bind(nameList).ListAll(context);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From javascript you can just pass an array inside your args like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;query&amp;quot;: &amp;quot;Name=[?]&amp;quot;,&lt;br /&gt;
    &amp;quot;args&amp;quot;: [&lt;br /&gt;
        [&amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot;]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Virtual Fields =&lt;br /&gt;
&lt;br /&gt;
Virtual Fields can be used inside filter query strings as well just by simply using their name. The value is always the uint IDs. So for example if we want to get all pages tagged with &amp;quot;hello&amp;quot;, first we need to get the ID of the tag &amp;quot;hello&amp;quot; (which we&amp;#039;ll say is tag #4) and then from there can use it as either an array or a number as-is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains ?&amp;quot;, // Results must have tag #4 on them, but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=?&amp;quot;, // Results must have exactly 1 tag and it must be tag #4&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can query with an array as well, and like above there are two variants:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains [?]&amp;quot;, // Results must have tag #4 and tag #5 on them but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=[?]&amp;quot;, // Results must have exactly tags #4 and #5 and no others&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sorting =&lt;br /&gt;
&lt;br /&gt;
You can create a filter which sorts using &amp;quot;sort&amp;quot; like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;sort&amp;quot;:{&lt;br /&gt;
        &amp;quot;field&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
        &amp;quot;dir&amp;quot;: &amp;quot;desc&amp;quot; // or asc&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Filter functions =&lt;br /&gt;
&lt;br /&gt;
Most often seen in the permission system. These are functions used within a query filter. Filter functions are generic and can also be custom defined by installable modules if you need another. Example code which adds a filter function can be seen on the [[API_Context|context extensions page]]. Variations of UserPermits (&amp;quot;CompanyPermits&amp;quot; etc) are quite common.&lt;br /&gt;
&lt;br /&gt;
* IsSelf()&lt;br /&gt;
* HasUserPermit()&lt;br /&gt;
* HasRolePermits()&lt;br /&gt;
* IsIncluded()&lt;br /&gt;
* On(...)&lt;br /&gt;
&lt;br /&gt;
Todo: describing the above, particularly On and IsIncluded&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=622</id>
		<title>Filters</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=622"/>
		<updated>2024-01-29T16:47:42Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Sorting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filters are a query-like mechanism for filtering out results from a list endpoint. At their core, they are textual and support a set of arguments.&lt;br /&gt;
&lt;br /&gt;
= Filter examples =&lt;br /&gt;
&lt;br /&gt;
A textual filter with arguments is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
(UserId=? or UserId=?) and CreatedUtc&amp;gt;?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is not case sensitive. Filters in the permission system do not support these ? arguments (as it wouldn&amp;#039;t know where to bind the value from).&lt;br /&gt;
&lt;br /&gt;
Typically you&amp;#039;ll see this textual form of filter inside a Where() call in the C# API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
uint userId = 14;&lt;br /&gt;
&lt;br /&gt;
var listOfThingsByThisUser = await Where(&amp;quot;UserId=?&amp;quot;).Bind(userId).ListAll(context);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.Bind() is used to bind the actual value of an argument. Values are bound in this way such that the filter string is a constant and can benefit from being precompiled. Indeed, the whole filter system is built to be entirely non-allocating, as the Bind calls internally set your provided value onto an compiled object field, with that object originating from a pool for the given cached filter.&lt;br /&gt;
&lt;br /&gt;
= JS filter notation =&lt;br /&gt;
&lt;br /&gt;
Filters can also be constructed by the frontend, most often by [[Loop]]. In this scenario, a convenience filter notation is also available - it&amp;#039;ll take the object notation you provide, and then convert it into the textual format with arguments. Here&amp;#039;s some examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;quot;page&amp;quot; filter={&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}&amp;gt;&lt;br /&gt;
 {page =&amp;gt; { return &amp;lt;p&amp;gt;{page.url}&amp;lt;/p&amp;gt;; }}&lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filter object itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Operators]] can be used by passing an object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: {&lt;br /&gt;
            greaterThan: 14&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or statements are represented with an array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: [{&lt;br /&gt;
        userId: 14&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        userId: 16&lt;br /&gt;
    }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And statements are performed by providing multiple field values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14,&lt;br /&gt;
        createdUtc: {&lt;br /&gt;
            greaterThan: yesterday /* yesterday is a JS Date */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need more expressive power, you can also directly specify the query and args:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query/args being passed in to webRequest and Loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;#039;page&amp;#039; filter={{query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]}}&amp;gt; ... &lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operators =&lt;br /&gt;
&lt;br /&gt;
Filters support a variety of operators for comparisons:&lt;br /&gt;
&lt;br /&gt;
* Greater than&lt;br /&gt;
  * Field&amp;gt;?   (query notation)&lt;br /&gt;
  * {greaterThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than&lt;br /&gt;
  * Field&amp;lt;?   (query notation)&lt;br /&gt;
  * {lessThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Greater than or equal&lt;br /&gt;
  * Field&amp;gt;=?   (query notation)&lt;br /&gt;
  * {greaterThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {geq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than or equal&lt;br /&gt;
  * Field&amp;lt;=?   (query notation)&lt;br /&gt;
  * {lessThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {leq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Equals&lt;br /&gt;
  * Field=?   (query notation)&lt;br /&gt;
  * x    (JS notation)&lt;br /&gt;
  * {equals: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Not&lt;br /&gt;
  * Field!=?   (query notation)&lt;br /&gt;
  * !( .... )   (query notation)&lt;br /&gt;
  * {not: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Starts with (textual values only)&lt;br /&gt;
  * Field startsWith ?   (query notation)&lt;br /&gt;
  * {startsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Ends with (textual values only)&lt;br /&gt;
  * Field endsWith ?   (query notation)&lt;br /&gt;
  * {endsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Contains (textual values only)&lt;br /&gt;
  * Field contains ?   (query notation)&lt;br /&gt;
  * {contains: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
If you provide an array of values you must tell the query system that you are doing so by surrounding your ? arg with square brackets, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Name=[?]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This syntax exists such that the precompiled filter is ready to receive a set of values rather than just one.&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;re doing this in C# you can then bind any IEnumerable like so, provided its data type matches that of the target field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nameList = new List&amp;lt;string&amp;gt;() { &amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
var resultsWithEitherName = await Where(&amp;quot;Name=[?]&amp;quot;).Bind(nameList).ListAll(context);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From javascript you can just pass an array inside your args like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;query&amp;quot;: &amp;quot;Name=[?]&amp;quot;,&lt;br /&gt;
    &amp;quot;args&amp;quot;: [&lt;br /&gt;
        [&amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot;]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Virtual Fields =&lt;br /&gt;
&lt;br /&gt;
Virtual Fields can be used inside filter query strings as well just by simply using their name. The value is always the uint IDs. So for example if we want to get all pages tagged with &amp;quot;hello&amp;quot;, first we need to get the ID of the tag &amp;quot;hello&amp;quot; (which we&amp;#039;ll say is tag #4) and then from there can use it as either an array or a number as-is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains ?&amp;quot;, // Results must have tag #4 on them, but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=?&amp;quot;, // Results must have exactly 1 tag and it must be tag #4&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can query with an array as well, and like above there are two variants:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains [?]&amp;quot;, // Results must have tag #4 and tag #5 on them but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=[?]&amp;quot;, // Results must have exactly tags #4 and #5 and no others&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sorting =&lt;br /&gt;
&lt;br /&gt;
You can create a filter which sorts using &amp;quot;sort&amp;quot; like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhiglight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;sort&amp;quot;:{&lt;br /&gt;
        &amp;quot;field&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
        &amp;quot;dir&amp;quot;: &amp;quot;desc&amp;quot; // or asc&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Filter functions =&lt;br /&gt;
&lt;br /&gt;
Most often seen in the permission system. These are functions used within a query filter. Filter functions are generic and can also be custom defined by installable modules if you need another. Example code which adds a filter function can be seen on the [[API_Context|context extensions page]]. Variations of UserPermits (&amp;quot;CompanyPermits&amp;quot; etc) are quite common.&lt;br /&gt;
&lt;br /&gt;
* IsSelf()&lt;br /&gt;
* HasUserPermit()&lt;br /&gt;
* HasRolePermits()&lt;br /&gt;
* IsIncluded()&lt;br /&gt;
* On(...)&lt;br /&gt;
&lt;br /&gt;
Todo: describing the above, particularly On and IsIncluded&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=621</id>
		<title>Filters</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Filters&amp;diff=621"/>
		<updated>2024-01-29T16:47:07Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Filters are a query-like mechanism for filtering out results from a list endpoint. At their core, they are textual and support a set of arguments.&lt;br /&gt;
&lt;br /&gt;
= Filter examples =&lt;br /&gt;
&lt;br /&gt;
A textual filter with arguments is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
(UserId=? or UserId=?) and CreatedUtc&amp;gt;?&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is not case sensitive. Filters in the permission system do not support these ? arguments (as it wouldn&amp;#039;t know where to bind the value from).&lt;br /&gt;
&lt;br /&gt;
Typically you&amp;#039;ll see this textual form of filter inside a Where() call in the C# API:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
uint userId = 14;&lt;br /&gt;
&lt;br /&gt;
var listOfThingsByThisUser = await Where(&amp;quot;UserId=?&amp;quot;).Bind(userId).ListAll(context);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.Bind() is used to bind the actual value of an argument. Values are bound in this way such that the filter string is a constant and can benefit from being precompiled. Indeed, the whole filter system is built to be entirely non-allocating, as the Bind calls internally set your provided value onto an compiled object field, with that object originating from a pool for the given cached filter.&lt;br /&gt;
&lt;br /&gt;
= JS filter notation =&lt;br /&gt;
&lt;br /&gt;
Filters can also be constructed by the frontend, most often by [[Loop]]. In this scenario, a convenience filter notation is also available - it&amp;#039;ll take the object notation you provide, and then convert it into the textual format with arguments. Here&amp;#039;s some examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;quot;page&amp;quot; filter={&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}&amp;gt;&lt;br /&gt;
 {page =&amp;gt; { return &amp;lt;p&amp;gt;{page.url}&amp;lt;/p&amp;gt;; }}&lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filter object itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Operators]] can be used by passing an object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: {&lt;br /&gt;
            greaterThan: 14&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or statements are represented with an array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: [{&lt;br /&gt;
        userId: 14&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        userId: 16&lt;br /&gt;
    }]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And statements are performed by providing multiple field values:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    where: {&lt;br /&gt;
        userId: 14,&lt;br /&gt;
        createdUtc: {&lt;br /&gt;
            greaterThan: yesterday /* yesterday is a JS Date */&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need more expressive power, you can also directly specify the query and args:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Query/args being passed in to webRequest and Loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import webRequest from &amp;#039;UI/Functions/WebRequest&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
webRequest(&amp;quot;page/list&amp;quot;, {&lt;br /&gt;
    query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]&lt;br /&gt;
}).then(response =&amp;gt; {&lt;br /&gt;
    // response.json contains the set of pages made by user #14&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Loop over=&amp;#039;page&amp;#039; filter={{query: &amp;quot;UserId=?&amp;quot;,&lt;br /&gt;
    args: [14]}}&amp;gt; ... &lt;br /&gt;
&amp;lt;/Loop&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operators =&lt;br /&gt;
&lt;br /&gt;
Filters support a variety of operators for comparisons:&lt;br /&gt;
&lt;br /&gt;
* Greater than&lt;br /&gt;
  * Field&amp;gt;?   (query notation)&lt;br /&gt;
  * {greaterThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than&lt;br /&gt;
  * Field&amp;lt;?   (query notation)&lt;br /&gt;
  * {lessThan: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Greater than or equal&lt;br /&gt;
  * Field&amp;gt;=?   (query notation)&lt;br /&gt;
  * {greaterThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {geq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Less than or equal&lt;br /&gt;
  * Field&amp;lt;=?   (query notation)&lt;br /&gt;
  * {lessThanOrEqual: x}    (JS notation)&lt;br /&gt;
  * {leq: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Equals&lt;br /&gt;
  * Field=?   (query notation)&lt;br /&gt;
  * x    (JS notation)&lt;br /&gt;
  * {equals: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Not&lt;br /&gt;
  * Field!=?   (query notation)&lt;br /&gt;
  * !( .... )   (query notation)&lt;br /&gt;
  * {not: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Starts with (textual values only)&lt;br /&gt;
  * Field startsWith ?   (query notation)&lt;br /&gt;
  * {startsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Ends with (textual values only)&lt;br /&gt;
  * Field endsWith ?   (query notation)&lt;br /&gt;
  * {endsWith: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
* Contains (textual values only)&lt;br /&gt;
  * Field contains ?   (query notation)&lt;br /&gt;
  * {contains: x}    (JS notation)&lt;br /&gt;
&lt;br /&gt;
= Arrays =&lt;br /&gt;
&lt;br /&gt;
If you provide an array of values you must tell the query system that you are doing so by surrounding your ? arg with square brackets, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Name=[?]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This syntax exists such that the precompiled filter is ready to receive a set of values rather than just one.&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;re doing this in C# you can then bind any IEnumerable like so, provided its data type matches that of the target field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var nameList = new List&amp;lt;string&amp;gt;() { &amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
var resultsWithEitherName = await Where(&amp;quot;Name=[?]&amp;quot;).Bind(nameList).ListAll(context);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From javascript you can just pass an array inside your args like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;query&amp;quot;: &amp;quot;Name=[?]&amp;quot;,&lt;br /&gt;
    &amp;quot;args&amp;quot;: [&lt;br /&gt;
        [&amp;quot;Dave&amp;quot;, &amp;quot;Steve&amp;quot;]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Virtual Fields =&lt;br /&gt;
&lt;br /&gt;
Virtual Fields can be used inside filter query strings as well just by simply using their name. The value is always the uint IDs. So for example if we want to get all pages tagged with &amp;quot;hello&amp;quot;, first we need to get the ID of the tag &amp;quot;hello&amp;quot; (which we&amp;#039;ll say is tag #4) and then from there can use it as either an array or a number as-is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains ?&amp;quot;, // Results must have tag #4 on them, but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=?&amp;quot;, // Results must have exactly 1 tag and it must be tag #4&lt;br /&gt;
    args: [&lt;br /&gt;
        4&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can query with an array as well, and like above there are two variants:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags contains [?]&amp;quot;, // Results must have tag #4 and tag #5 on them but can have any other tags too&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    query: &amp;quot;Tags=[?]&amp;quot;, // Results must have exactly tags #4 and #5 and no others&lt;br /&gt;
    args: [&lt;br /&gt;
        [4, 5]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sorting =&lt;br /&gt;
&lt;br /&gt;
You can create a filter which sorts using &amp;quot;sort&amp;quot; like so:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;sort&amp;quot;:{&lt;br /&gt;
        &amp;quot;field&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
        &amp;quot;dir&amp;quot;: &amp;quot;desc&amp;quot; // or asc&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
= Filter functions =&lt;br /&gt;
&lt;br /&gt;
Most often seen in the permission system. These are functions used within a query filter. Filter functions are generic and can also be custom defined by installable modules if you need another. Example code which adds a filter function can be seen on the [[API_Context|context extensions page]]. Variations of UserPermits (&amp;quot;CompanyPermits&amp;quot; etc) are quite common.&lt;br /&gt;
&lt;br /&gt;
* IsSelf()&lt;br /&gt;
* HasUserPermit()&lt;br /&gt;
* HasRolePermits()&lt;br /&gt;
* IsIncluded()&lt;br /&gt;
* On(...)&lt;br /&gt;
&lt;br /&gt;
Todo: describing the above, particularly On and IsIncluded&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=521</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=521"/>
		<updated>2023-03-28T16:25:09Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they work best on metadata type fields such as tags, price etc &lt;br /&gt;
&lt;br /&gt;
A basic example would be the &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component and tags.&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Any tags linked to a category can be referenced as &amp;#039;&amp;#039;&amp;#039;taxonomy.xxxxx&amp;#039;&amp;#039;&amp;#039; so in this example &amp;#039;&amp;#039;&amp;#039;taxonomy.animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
These can then be referenced to show a contextual filter in the UI, the example below will pass back an aggregation of any &amp;#039;&amp;#039;&amp;#039;animals&amp;#039;&amp;#039;&amp;#039; tags in the result set, &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; then uses these render an auto generated filter.&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When tags are assigned to category and indexed, you will expose the core tag values and also some auto generated taxonomy fields.&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; value is still exposed in the &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; element as that is used for free text search ranking. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=520</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=520"/>
		<updated>2023-03-28T16:22:46Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they work best on metadata type fields such as tags, price etc &lt;br /&gt;
&lt;br /&gt;
A basic example would be the &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component and tags.&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Any tags linked to a category can be referenced as &amp;#039;&amp;#039;&amp;#039;taxonomy.xxxxx&amp;#039;&amp;#039;&amp;#039; so in this example &amp;#039;&amp;#039;&amp;#039;taxonomy.animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
These can then be referenced to show a contextual filter in the UI, the example below will pass back an aggregation of any &amp;#039;&amp;#039;&amp;#039;animals&amp;#039;&amp;#039;&amp;#039; tags in the result set, &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; then uses these render an auto generated filter.&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When tags are assigned to category and indexed, you will expose the core tag values and also some auto generated taxonomy fields.&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=519</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=519"/>
		<updated>2023-03-28T16:16:06Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they obviously work best on metadata types fields&lt;br /&gt;
&lt;br /&gt;
A basic example would be the &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component and tags.&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Any tags linked to a category can be referenced as &amp;#039;&amp;#039;&amp;#039;taxonomy.xxxxx&amp;#039;&amp;#039;&amp;#039; so in this example &amp;#039;&amp;#039;&amp;#039;taxonomy.animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
These can then be referenced to show a contextual filter in the UI, the example below will pass back an aggregation of any &amp;#039;&amp;#039;&amp;#039;animals&amp;#039;&amp;#039;&amp;#039; tags in the result set, &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; then uses these render an auto generated filter.&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When tags are assigned to category and indexed, you will expose the core tag values and also some auto generated taxonomy fields.&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=518</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=518"/>
		<updated>2023-03-28T16:15:00Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they obviously work best on metadata types fields&lt;br /&gt;
&lt;br /&gt;
A basic example would be the &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component and tags.&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Any tags linked to a category can be referenced as &amp;#039;&amp;#039;&amp;#039;taxonomy.xxxxx&amp;#039;&amp;#039;&amp;#039; so in this example &amp;#039;&amp;#039;&amp;#039;taxonomy.animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
These can then be referenced to show a contextual filter in the UI, the example below will pass back an aggregation of any &amp;#039;&amp;#039;&amp;#039;animals&amp;#039;&amp;#039;&amp;#039; tags in the result set, &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; then uses these render an auto generated filter.&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When tags are assigned to category and indexed, you will expose the core tag values and also some auto generated taxonomy fields.&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=517</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=517"/>
		<updated>2023-03-28T15:42:02Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they obviously work best on metadata types fields&lt;br /&gt;
&lt;br /&gt;
A good example would be the ootb &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If these tags are then assigned to content and indexed, you will expose the core tag values and also some auto generated taxonomy fields. &lt;br /&gt;
&lt;br /&gt;
These can then be referenced to show a contextual filter in the UI&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=516</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=516"/>
		<updated>2023-03-28T15:40:45Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field exposed to Elastic from the social stack application, but they obviously work best on metadata types fields&lt;br /&gt;
&lt;br /&gt;
A good example would be the ootb &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field.&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If these tags are then assigned to content and indexed, you will expose the core tag values and also some auto generated taxonomy fields. These can then be referenced to show an contextual filter in the UI&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		 {&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
            }   &lt;br /&gt;
         } &lt;br /&gt;
         ]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An example of the indexed data in Elastic looks something like the example below where &amp;#039;&amp;#039;&amp;#039;Africa&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Botswana&amp;#039;&amp;#039;&amp;#039; are plain tags but &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039; has been linked to the &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039; category&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
   &amp;quot;tags&amp;quot;: [&lt;br /&gt;
           &amp;quot;Africa&amp;quot;,&lt;br /&gt;
           &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
           &amp;quot;Horse&amp;quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;taxonomy&amp;quot;: {&lt;br /&gt;
      &amp;quot;animals&amp;quot;: [&lt;br /&gt;
         &amp;quot;Horse&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=515</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=515"/>
		<updated>2023-03-28T15:33:49Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field&lt;br /&gt;
&lt;br /&gt;
A good example would be the ootb &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;quot;Animals&amp;quot; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If these tags are assigned to content which is later indexed as well as getting the core tag values you will also get some auto generated taxonomy fields. These can then be referenced to show an contextual filter&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.animals&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=514</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=514"/>
		<updated>2023-03-28T15:32:31Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* Search taxonomy and filters/facets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field&lt;br /&gt;
&lt;br /&gt;
A good example would be the ootb &amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; field&lt;br /&gt;
&lt;br /&gt;
But a better solution is to setup contextual tags using the &amp;#039;&amp;#039;&amp;#039;Api/Categories&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
This allows you to give some context to a tag, so for example you could create an &amp;quot;Animals&amp;quot; category, then when adding a new tag for &amp;#039;&amp;#039;&amp;#039;Cow&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;Horse&amp;#039;&amp;#039;&amp;#039; you would set their category to be &amp;#039;&amp;#039;&amp;#039;Animals&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
If these tags are assigned to content which is later indexed as well as getting the core tag values you will also get some auto generated taxonomy fields. These can then be referenced to show an contextual filter&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=513</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=513"/>
		<updated>2023-03-28T15:28:51Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== Search taxonomy and filters/facets ==&lt;br /&gt;
You can filter or define facets(aggregations in ElasticSerach terminology) on any field&lt;br /&gt;
&lt;br /&gt;
A good example would be the ootb tags field &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
	<entry>
		<id>https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=512</id>
		<title>Search Elastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.socialstack.dev/index.php?title=Search_Elastic&amp;diff=512"/>
		<updated>2023-03-28T15:26:42Z</updated>

		<summary type="html">&lt;p&gt;46.16.211.253: /* UI Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The elastic search module works alongside the [[Search Crawler]] to extract pages from the site into an elastic search instance to enable site wide search&lt;br /&gt;
&lt;br /&gt;
The module registers itself to listen for the search crawler events and creates locale based indexes in the elastic repo for any pages it receives&lt;br /&gt;
&lt;br /&gt;
When indexing the pages, if there is a primary data type then this will also be indexed against the page in &amp;#039;&amp;#039;&amp;#039;primaryObject&amp;#039;&amp;#039;&amp;#039;, this can then be used in query values as explained below&lt;br /&gt;
&lt;br /&gt;
The indexing process is controlled by execution of the search crawler via the site automations&lt;br /&gt;
&lt;br /&gt;
The module contains a Readme.txt file which gives help for the initial setup of elastic but the creation of the indexes/content are all automated.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The basic setup steps are &lt;br /&gt;
&lt;br /&gt;
#Install the following socialstack modules&lt;br /&gt;
#*Api/SearchCrawler&lt;br /&gt;
#*Api/SearchElastic&lt;br /&gt;
#*UI/SiteSearch&lt;br /&gt;
#Mark any pages not to be indexed&lt;br /&gt;
#Install Elastic Search (see &amp;#039;&amp;#039;&amp;#039;Readme.txt&amp;#039;&amp;#039;&amp;#039; in the repo for help and guidance)&lt;br /&gt;
#Configure the sizing/scale in the &amp;#039;&amp;#039;&amp;#039;elasticsearch.yml&amp;#039;&amp;#039;&amp;#039; file (mainly vm memory usage)&lt;br /&gt;
#Start Elastic Search for the first time and get the master password and certificate fingerprint&lt;br /&gt;
#Add the url, credentials and fingerprint values to the module configuration via the ss admin panel&lt;br /&gt;
#Run the automation to index the site, the indexing progress is shown via the console&lt;br /&gt;
&lt;br /&gt;
The module also contains a postman collection which can be used to quick debug/verify the indexed content&lt;br /&gt;
&lt;br /&gt;
Once indexed there is a UI/SiteSearch module which can be used as the basis of the site search&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== GET /v1/sitesearch/reset ===&lt;br /&gt;
&lt;br /&gt;
This removes any indexes from elastic to allow a clean start&lt;br /&gt;
&lt;br /&gt;
=== POST /v1/sitesearch/query ===&lt;br /&gt;
&lt;br /&gt;
This is the core search endpoint which currently accepts the following values &lt;br /&gt;
&lt;br /&gt;
;queryString&lt;br /&gt;
:The query value entered by the user and/or the &amp;#039;&amp;#039;&amp;#039;UI/SiteSearch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; components, elastic search uses the Lucene query language so you can build complex queries &lt;br /&gt;
:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html&lt;br /&gt;
:e.g.&lt;br /&gt;
:&amp;lt;code&amp;gt;Africa AND primaryObject.name:Botswana&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;primaryObject.price:(&amp;gt;=1000 AND &amp;lt;5000)&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;((quick AND fox) OR (brown AND fox) OR fox) AND NOT dog&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;tags&lt;br /&gt;
: This expects a list of comma separated tags, if any are supplied the query will only return results which contain all the passed tag values&lt;br /&gt;
&lt;br /&gt;
;contentTypes&lt;br /&gt;
: This expects a list of comma separated content types, if any are supplied the query will only return results which contain all the passed content types, these are normally the primary data object for the page&lt;br /&gt;
&lt;br /&gt;
;pageSize&lt;br /&gt;
: This expects the page size and will default to 10 if not populated&lt;br /&gt;
&lt;br /&gt;
;pageIndex&lt;br /&gt;
: This expects the starting page number and will default to 1&lt;br /&gt;
&lt;br /&gt;
;aggregationFields&lt;br /&gt;
: This expects a list of comma separated field names, if any are supplied then aggregations/facets are returned for the fields, a good example of this can be be found in &amp;#039;&amp;#039;&amp;#039;UI/ContentSearch&amp;#039;&amp;#039;&amp;#039; component&lt;br /&gt;
&lt;br /&gt;
== UI Components  ==&lt;br /&gt;
;UI/ContentSearch&lt;br /&gt;
&lt;br /&gt;
This provides a good example with filtering and paging&lt;br /&gt;
&lt;br /&gt;
The component will also allow you to override the default values/titles for any aggregation using the aggregationOverrides property, this can be useful to add grouping to values such as regions/countries etc&lt;br /&gt;
&lt;br /&gt;
An example is shown below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;c&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;UI/ContentSearch&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {&lt;br /&gt;
				&amp;quot;aggregationFields&amp;quot;: &amp;quot;taxonomy.price,taxonomy.destination,taxonomy.wildlife&amp;quot;,&lt;br /&gt;
				&amp;quot;contentTypes&amp;quot;: &amp;quot;ItineraryPageDataType&amp;quot;,&lt;br /&gt;
				&amp;quot;aggregationOverrides&amp;quot;: [&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.price&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Price&amp;quot;,&lt;br /&gt;
						&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;3500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;3500&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;5000&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;5000&amp;quot;&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;label&amp;quot;: &amp;quot;&amp;amp;pound;7500&amp;quot;,&lt;br /&gt;
								&amp;quot;key&amp;quot;: &amp;quot;7500&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.destination&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Destination&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 3,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Africa and the Indian Ocean&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Botswana&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Botswana&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Central African Republic&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Central African Republic&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chad&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chad&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Congo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Congo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Djibouti&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Djibouti&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Gabon&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Gabon&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Indian Ocean&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Indian Ocean&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Kenya&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Kenya&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Madagascar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Madagascar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mozambique&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mozambique&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Namibia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Namibia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Rwanda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Rwanda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;South Africa&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;South Africa&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Tanzania&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Tanzania&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Uganda&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Uganda&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zambia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zambia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Zimbabwe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Zimbabwe&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Asia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Borneo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Borneo&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;India&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;India&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Russia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sri Lanka&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sri Lanka&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Latin America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Argentina&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Belize&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Belize&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Brazil&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Brazil&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chile&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chile&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Colombia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Colombia&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Costa Rica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Costa Rica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Ecuador&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Ecuador&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Galapagos&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Galapagos&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Peru&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Peru&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;North America&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Alaska&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Alaska&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Dominica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Dominica&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Polar Regions&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Antarctica&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Antarctica&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Canada&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Canada&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Greenland&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Greenland&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Norway&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Norway&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Svalbard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Svalbard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Arctic Russia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Arctic Russia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Australasia&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Australia&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Australia&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Scotland&amp;quot;,&lt;br /&gt;
										&amp;quot;groupName&amp;quot;: &amp;quot;Europe&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Scotland&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						&amp;quot;name&amp;quot;: &amp;quot;taxonomy.wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;label&amp;quot;: &amp;quot;Wildlife&amp;quot;,&lt;br /&gt;
						&amp;quot;columns&amp;quot;: 4,&lt;br /&gt;
						&amp;quot;groups&amp;quot;: [&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Bears&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Grizzly Bears&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Polar Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Polar Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Spirit Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Spirit Bear&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sun Bear&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sun Bear&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Cats&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Lion&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Lion&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Asiatic Leopard&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Bengal Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cheetah&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cheetah&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Jaguar&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Puma&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Puma&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Siberian Tiger&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Snow Leopard&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Snow Leopard&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Big Five&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;African Elephant&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;African Elephant&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Black Rhinoceros&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Cape Buffalo&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Primates&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Chimpanzee&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Chimpanzee&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Lemurs&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Lemurs&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Mountain Gorilla&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Orangutan&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Orangutan&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Western Lowland Gorilla&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							},&lt;br /&gt;
							{&lt;br /&gt;
								&amp;quot;name&amp;quot;: &amp;quot;Whales&amp;quot;,&lt;br /&gt;
								&amp;quot;buckets&amp;quot;: [&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Beluga Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Beluga Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Blue Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Blue Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Killer Whale&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Killer Whale&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Narwhal&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Narwhal&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Sperm Whales&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Sperm Whales&amp;quot;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										&amp;quot;label&amp;quot;: &amp;quot;Whale Shark&amp;quot;,&lt;br /&gt;
										&amp;quot;key&amp;quot;: &amp;quot;Whale Shark&amp;quot;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 4&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;t&amp;quot;: &amp;quot;p&amp;quot;,&lt;br /&gt;
			&amp;quot;c&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;d&amp;quot;: {},&lt;br /&gt;
			&amp;quot;i&amp;quot;: 2&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;i&amp;quot;: 3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>46.16.211.253</name></author>
	</entry>
</feed>