# SearchApi

All URIs are relative to *https://localhost/alfresco/api/-default-/public/search/versions/1*

Method | HTTP request | Description
------------- | ------------- | -------------
[**search**](SearchApi.md#search) | **POST** /search | Searches Alfresco


<a name="search"></a>
# **search**
> ResultSetPaging search(queryBody)

Searches Alfresco

**Note**: this endpoint is available in Alfresco 5.2 and newer versions.

**You specify all the parameters in this API in a JSON body**, URL parameters are not supported.
A basic query looks like this:

JSON
{
  \"query\": {
    \"query\": \"foo\"
  }
}


**Note:** These are the minimum possible query parameters.

The default search language is **afts** ([Alfresco Full Text Search](http://docs.alfresco.com/5.1/concepts/rm-searchsyntax-intro.html)), but you can also specify **cmis**, and **lucene**.

A basic CMIS query looks like this:

JSON
{
  \"query\": {
    \"query\": \"select * from cmis:folder\",
    \"language\": \"cmis\"
  }
}


By default, **results are limited to the first 100.**
Results can be restricted using \"paging\". For example:
JSON
\"paging\": {
  \"maxItems\": \"50\",
  \"skipCount\": \"28\"
}

This example would ensure that results are **limited by Final Size**,
skipping the first 28 results and returning the next 50.

Alternatively, you can limit the results by using the **limits JSON body parameter**. For example,
JSON
\"limits\": {
  \"permissionEvaluationTime\": 20000,
  \"permissionEvaluationCount\": 2000
}


You can use the **include JSON body parameter** to return additional information.
This works in the same way as in the /nodes/{nodeId}/children method in the core API. For example:
JSON
\"include\": [\"aspectNames\", \"properties\", \"isLink\"]


You can use the **fields JSON body parameter** to restrict the fields returned within a response if, for example, you want to save on overall bandwidth.
This works in the same way as in the /nodes/{nodeId}/children method in the core API. For example:
JSON
\"fields\": [\"id\", \"name\", \"search\"]


You can sort the results using the **sort JSON body parameter**, for example:
JSON
\"sort\": [{\"type\":\"FIELD\", \"field\":\"cm:description\", \"ascending\":\"true\"}]

**Note:** the **sort** parameter is not supported for CMIS queries.

By default, search uses the **\"nodes\" location**, which is the **content store known as workspace://SpacesStore**.
To change the scope to another location you can use the **locations JSON body parameter**. You can specify either **nodes** (the default), **versions** or **deleted-nodes**.  For example,
JSON
\"scope\": {
    \"locations\": [\"deleted-nodes\"]
}

You can specify templates using the **templates JSON body parameter**, for example:
JSON
\"templates\": [{\"name\": \"_PERSON\",\"template\": \"|%firstName OR |%lastName OR |%userName\"},
              {\"name\": \"mytemplate\",\"template\": \"%cm:content\"}]


**Note: Spell checking only works on Search Services (Solr 6) if you have already enabled suggestions.**

For **spell checking** you can use a query like this:
JSON
{
  \"query\": {
    \"query\": \"cm:title:alfrezco\"
  },
  \"spellcheck\": {\"query\": \"alfrezco\"}
}


If you are already specifying \"userQuery\" then the following may be easier
and produces the same result :
JSON
{
  \"query\": {
    \"query\": \"cm:title:alfrezco\",
    \"userQuery\": \"alfrezco\"
  },
  \"spellcheck\": {}
}


The spellcheck response includes a spellCheck context like this:
JSON
\"context\": {
  \"spellCheck\": {
    \"type\": \"searchInsteadFor\",
    \"suggestions\": [\"alfresco\"]
  }
},


To specify defaults, you  use a **defaults JSON body parameter**, for example:
JSON
\"defaults\": {
  \"textAttributes\": [
    \"cm:content\", \"cm:name\"
  ],
  \"defaultFTSOperator\": \"AND\",
  \"defaultFTSFieldOperator\": \"OR\",
  \"namespace\": \"cm\",
  \"defaultFieldName\": \"PATH\"
}


You can specify several filter queries using the **filterQueries JSON body parameter**, for example:
JSON
\"filterQueries\": [{\"query\": \"TYPE:'cm:folder'\"},{\"query\": \"cm:creator:mjackson\"}]


You can specify several facet queries using the **facetQueries JSON body parameter**, for example:
JSON
\"facetQueries\": [{\"query\": \"created:2016\",\"label\": \"CreatedThisYear\"}]

The response will contain a matching \"context\" section, the \"label\" will match the facet query.
JSON
\"context\": {
  \"facetQueries\": [
    {\"label\": \"CreatedThisYear\",\"count\": 3}
  ]
},


A complete query for facetting via the content.size field looks this:
JSON
{
  \"query\": {
    \"query\": \"presentation\",
    \"language\": \"afts\"
  },
    \"facetQueries\": [
        {\"query\": \"content.size:[0 TO 10240]\", \"label\": \"xtra small\"},
        {\"query\": \"content.size:[10240 TO 102400]\", \"label\": \"small\"},
        {\"query\": \"content.size:[102400 TO 1048576]\", \"label\": \"medium\"},
        {\"query\": \"content.size:[1048576 TO 16777216]\", \"label\": \"large\"},
        {\"query\": \"content.size:[16777216 TO 134217728]\", \"label\": \"xtra large\"},
        {\"query\": \"content.size:[134217728 TO MAX]\", \"label\": \"XX large\"}
  ],
    \"facetFields\": {\"facets\": [{\"field\": \"'content.size'\"}]}
}


The response will contain a matching \"context\" section, the \"label\" will match the facet query.
JSON
\"context\": {
  \"facetQueries\": [
    { \"label\": \"small\",\"count\": 2 },
    { \"label\": \"large\",\"count\": 0 },
    { \"label\": \"xtra small\",\"count\": 5 },
    { \"label\": \"xtra large\",\"count\": 56},
    { \"label\": \"medium\",\"count\": 4 },
    { \"label\": \"XX large\", \"count\": 1 }
  ]
},


You can specify several facet fields using the **facetFields JSON body parameter**, for example:
JSON
\"facetFields\": {\"facets\": [{\"field\": \"creator\", \"mincount\": 1}, {\"field\": \"modifier\", \"mincount\": 1}]}

The response will contain a matching \"context\" section, the \"label\" will match the facet field.
JSON
\"context\": {
   \"facetsFields\": [
     {  \"label\": \"creator\",
        \"buckets\": [
          { \"label\": \"System\", \"count\": 75 },
          { \"label\": \"mjackson\", \"count\": 5 }
        ]},
     {  \"label\": \"modifier\",
        \"buckets\": [
          { \"label\": \"System\", \"count\": 72 },
          { \"label\": \"mjackson\", \"count\": 5 },
          { \"label\": \"admin\", \"count\": 3 }
        ]}
   ]
},


Grouping facet queries that go together can be done by specifying the group label in the fact queries as follow:
JSON
    {
        \"query\": {
            \"query\": \"presentation\"
        },
        \"facetQueries\": [
            {\"query\": \"content.size:[0 TO 102400]\", \"label\": \"small\", \"group\":\"foo\"},
            {\"query\": \"content.size:[102400 TO 1048576]\", \"label\": \"medium\",\"group\":\"foo\"},
            {\"query\": \"content.size:[1048576 TO 16777216]\", \"label\": \"large\",\"group\":\"foo\"}
        ]
    }

The above query returns the results a faceted field grouped under the label foo:
JSON
{
    \"context\": {\"facetsFields\": [{
        \"label\": \"foo\",
        \"buckets\": [
            {
                \"count\": 109,
                \"label\": \"small\",
                \"filterQuery\": \"content.size:[0 TO 102400]\"
            },
            {
                \"count\": 0,
                \"label\": \"large\",
                \"filterQuery\": \"content.size:[1048576 TO 16777216]\"
            },
            {
                \"count\": 0,
                \"label\": \"medium\",
                \"filterQuery\": \"content.size:[102400 TO 1048576]\"
            }
        ]
    }]
}

Range Faceting is supported by the **ranges JSON body parameter**, for example:
JSON
    {
        \"query\": {
            \"query\": \"presentation\"
        },
        \"ranges\": [
        {
            \"field\": \"content.size\",
             \"start\": \"0\",
             \"end\": \"100\",
             \"gap\": \"20\",
             \"hardend\": true
        },
        {
            \"field\": \"created\",
            \"start\": \"2015-09-29T10:45:15.729Z\",
            \"end\": \"2016-09-29T10:45:15.729Z\",
            \"gap\": \"+100DAY\"
        }]
    }

An example query for **search highlighting** could look like this:
JSON
{
  \"query\": {
    \"query\": \"description:workflow\",
    \"userQuery\":\"workflow\"
  },
  \"highlight\": {
    \"prefix\": \"¿\",
    \"postfix\": \"?\",
    \"mergeContiguous\": true,
    \"fields\": [
      {
        \"field\": \"cm:title\"
      },
      {
        \"field\": \"description\",
        \"prefix\": \"(\",
        \"postfix\": \")\"
      }

    ]
  }
}

The example above changes the highlighting prefix and postfix from the
 default <em> for all fields to ¿? and just for the \"description\" field to ().
 The highlight information is added in each node entry response; here is
 an example partial response:

\"entry\": {
        \"createdAt\": \"2016-10-12T15:24:31.202+0000\",
        \"isFolder\": true,
        \"search\": {
          \"score\": 1,
          \"highlight\": [
            {
              \"field\": \"cm:title\",
              \"snippets\": [
                \"Customized ¿Workflow? Process Definitions\"
              ]
            },
            {
              \"field\": \"description\",
              \"snippets\": [
                \"Customized (Workflow) Process Definitions\"
              ]
            }
          ]
      },



### Example
```javascript
import SearchApi from 'SearchApi';
import { AlfrescoApi } from '@alfresco/js-api';

this.alfrescoApi = new AlfrescoApi();
this.alfrescoApi.setConfig({
    hostEcm: 'http://127.0.0.1:8080'
});

let searchApi = new SearchApi(this.alfrescoApi);


searchApi.search(queryBody).then((data) => {
  console.log('API called successfully. Returned data: ' + data);
}, function(error) {
  console.error(error);
});

```

### Parameters

Name | Type | Description  | Notes
------------- | ------------- | ------------- | -------------
 **queryBody** | [**SearchRequest**](SearchRequest.md)| Generic query API
 | 

### Return type

[**ResultSetPaging**](ResultSetPaging.md)