sf_resultsmodel

This Bundle contains the API for starting a search and for storing and accessing the search results.

This documentation refers to the programmatic usage of the components in this bundle is aimed at software developers. It is not relevant for the sole configuration of apps.

Searching

To set the search term programmatically and trigger a search, set the property searchTerm on the Query component.

this.query.searchTerm = "wasser";

Defining additional search criteria

To narrow a search you can specify certain values for single fields that each result item must have.

In the following example we search for items whose publisher is "con terra GmbH":

this.query.addCriterion("publisher", "con terra GmbH");

Accessing the search results

You can access the search results through the property results of the ResultsModel component.

Requesting results in chunks (paging)

It is inefficient and slow to always load all results of large result sets. Therefore, by default, only 20 results are loaded in one server request. To load the next 20 results (i.e. the next page) call the method fetchResultsWithoutFacetInfo() of the ResultsFetcher component. The additional results are then added to the end of the array in the results property of the ResultsModel component.

You can configure the page size, that means the number of results per page, in your app.json file as such:

{
  "bundles": {
    "sf_resultsmodel": {
      "ResultsModel": {
        "pageSize": 30
      }
    }
  }
}

Search field configuration

The smart.finder search works on three different fields of its Solr core. This depends on whether a simple, phrase or wildcard search is being performed, because for each search scenario is an own field defined.

If you want to provide your own fields, you can configure on which field the searches should be executed. This can be done with the properties defaultSearchFieldName, wildcardSearchFieldName and phraseSearchFieldName as follows:

"sf_resultsmodel": {
    "Query": {
        "defaultSearchFieldName": "full_text",
        "phraseSearchFieldName": "full_text_p",
        "wildcardSearchFieldName": "full_text_w"
    }
}

Requesting a single item by ID

Use the DetailItemFetcher component's fetch(id) to request a single item by its ID. The result is written to the DetailItemModel component.

Facets configuration

Facets are attributes that can be filtered by their values. In smart.finder the facets are displayed in expansion panels where each facet represents an attribute that can be filtered.

The facets to display are configured on the DocumentStore component of the sf_store bundle. Additionally, you can specify which facets and values to show based on the user's permissions or hide facets completely.

The configuration component InitialFacetsPropertiesConfig

Facet properties and displayed values are configured on the InitialFacetsPropertiesConfig component with the facets and the defaultValues properties. defaultValues holds a single object. This object contains the configuration properties that apply to all facets. Individual settings for facets can be specified using the facets property.

facets is an array of objects where each object holds the configuration for a certain facet. Settings made here override the settings in defaultValues.

In the following example all facets will be expanded, except for the type facet:

{
  "sf_resultsmodel": {
    "InitialFacetsPropertiesConfig": {
      "defaultValues": {
        "panelExpanded": true
      },
      "facets": [
        {
          "name": "type",
          "panelExpanded": false
        }
      ]
    }
  }
}

The single configuration objects for the facets must have a name property to identify the facet to configure. Additional properties are:

requiredPermissions

The following values are valid:

At runtime the configuration values are applied to the corresponding properties in the FacetsModel component. The objects held by the FacetsModel are reactive which means you can change their values at runtime and changes are reflected in the UI immediately.

valueRestrictions

To limit the values displayed for a facet to certain user permissions define the valueRestrictions property. Here's an example:

{
    "InitialFacetsPropertiesConfig": {
        "facets": [
            {
                "name": "owner_facet",
                "valueRestrictions": [
                    {
                        "ifHasPermissions": [
                            "ADMIN"
                        ],
                        "allowedValues": "*"
                    },
                    {
                        "elseIfHasPermissions": [
                            "GROUP_ADMIN"
                        ],
                        "allowedValues": [
                            "${userGroup}"
                        ]
                    },
                    {
                        "allowedValues": [
                            "a",
                            "b"
                        ]
                    }
                ]
            }
        ]
    }
}

valueRestrictions is an array of objects where each object contains a condition relating the user's permissions, and a list of the allowed facet values that the user in possession of these permissions will see in the facets.

The first object in the array will apply when the user has the "ADMIN" permission, i.e. the user is allowed to see all values ("allowedValues": "*").

If the user does not have the "ADMIN" permission but the "GROUP_ADMIN" permission the second object applies which means the user can only see the value which equals the user's user group. ${userGroup} is a variable which is replaced with the name of the user group at runtime. Possible variables are ${userGroup} and ${userName}.

The third object applies when the user has neither the "ADMIN" permission, nor the "GROUP_ADMIN" permission. That user can only see the values "a" and "b" of the "owner_facet".

Translating facet values

For translating single values in facets to the current application language, specify the sf_resultsmodel.facet-value-translations key in the bundle.js files in the nls folder of your app. It must be an object where each key is the name of a facet. For each facet specify an object with the values to translate on the left, and the translations on the right-hand side.

Example from the file myapp/nls/de/bundle.js:

 {
    "sf_resultsmodel": {
        "facet-value-translations": {
            "visibility_facet": {
                "private": "User",
                "protected": "User group",
                "public": "Public"
            }
        }
    }
}