Getting Started Feeding
To make data searchable the data must be preprocessed and indexed in the search index. To import the data into the QSC several feeding mechanisms are available.
- Bulk Feeding API
- Sitemap Crawling
In the following examples we will use
- tenant-code: demo
- feeding-code: products
Preconditions
- A feeding configuration is already configured in the QSC (TODO link to documentation for configuring a feeding)
Fullfeed
Sometimes it happens that update or delete events get lost. An update can be send again and the index is in sync. For a lost delete event, often the document is not available anymore in the source system. In this case it is not possible to trigger the delete again.
With a fullfeed it is possible to sync all data and remove not available documents.
- start the fullfeed
POST /api/v1/data/fullfeed/start/{tenantCode}/{feedingCode} - feed all documents via the bulk api
POST /api/v1/data/bulk/qsc/{tenantCode}/{feedingCode} - end the fullfeed -
POST /api/v1/data/fullfeed/end/{tenantCode}/{feedingCode} - cancel the fullfeed if the full feed fails -
POST /api/v1/data/fullfeed/cancel/{tenantCode}/{feedingCode}
Bulk Feeding API
With the bulk feeding API it is possible to send multiple documents in a batch.
- A good batch size to begin with is 100
- For small documents, the batch size can be increased to improve performance
- It is possible to mix update and delete events
- Documents are processed in the same order as they were sent to the API
- that means, if you send for example an update and a delete, the document will be deleted
Feeding types
qsc: to feed documents for searchreporting: to feed reporting data
Feed documents via Bulk Feeding API
In order to feed a batch of documents to the bulk feeding API you have to perform an HTTP POST
- URL
- Structure:
https://qsc.quasiris.de/api/v1/data/bulk/[feeding-type]/[tenant-code]/[feeding-code] - In our example:
https://qsc.quasiris.de/api/v1/data/bulk/qsc/demo/products
- Structure:
- Authentication (should be configured in
securityIdsof afeedingconfiguration)- api key authentication.
X-QSC-Token: your API token e.g.bbc20990-704f-45bb-9f56-e80bca8d0c86- The API is secured by an API Token which must be sent as a header value!
- basic authentication
- public authentication
- api key authentication.
- Headers:
Content-type:application/json
- Payload:
- The payload is a list of documents in JSON with the data structure described below
curl -X POST https://qsc-dev.quasiris.de/api/v1/data/bulk/qsc/demo/products -H "Content-Type: application/json" -H "X-QSC-Token: bbc20990-704f-45bb-9f56-e80bca8d0c89" -d '
[
{
"header": {
"id": "0815",
"action": "update"
},
"payload": {
"id": "0815",
"title": "bar"
}
}
]'
Data structure
A document in the bulk API consists of a header and a payload.
Header
The header contains a unique id, and an action to update or delete a document:
"id": unique identifier for the document"action": either"delete"or"update"
Header example: Update event
"header": {
"id" : "0815",
"action" : "update"
}
Header example: Delete event
"header": {
"id" : "0815",
"action" : "delete"
}
Payload
The data types for each field are configured in the Mapping tab of the feeding.value
data types:
- string
- list.string
- number
- long
- integer | int
- double
- boolean
- date (iso format - 2021-09-20T08:11:24.372Z)
- attributes
- categories
- categoryPath
- raw
The payload contains the data as a key value pairs:
- key: name of a field
- value: single value or multi value of the field
- single value: string, long, double, boolean
- multi value: an array of string, long, double or boolean
- json: a json array or json value
Payload example
single value examples:
"title"(string),"price"(double, number)"availability"(boolean)"jsonExample"(raw)"updatedAt"(date in iso format)
multi value examples
"keywords"(list.string)
"payload: {
"title" : "iphone 12",
"price" : 1295.99,
"availability" : true,
"updatedAt" : "2021-09-20T08:11:24.372Z",
"keywords" : [
"smartphone",
"telephone"
],
"jsonExample" : {
"foo" : "bar"
}
}
Categories (type: categories)
In the "categories" section multiple categories of a document can be specified.
- this section can be used by specifying
"categories"as key in the document payload- the value of this section is an array of categories in the specific structure described below
- a document can exists in multiple categories
Properties
- the
"categories"array contains elements with key"category"and an array as value- the array contains elements, representing the path from the root category, through the child categories up to the current leaf category
- each of these elements contain the following properties:
"id": unique identifier for the category"name": name of the category"level": depth of the category, described below
Levels
The category is referenced by traversing from the root category to the leaf category
- root category has
"level": 0 - branch categories have levels between 0 and the level of the leaf category
- leaf category is the child category with the highest level
Examples
Example: Categories array with one category
In the following example the product exists in one category:
"bathroom"->"showers"->"shower stalls"->"corner showers"
- The root category is
"bathroom" - The branch categories are
"showers"and"shower stalls" - The leaf category is
"corner showers"
"categories": [
{
"category": [
{
"id": "d5245409d00c4a969dd28eb3d183267b",
"name": "bathroom",
"level": 0
},
{
"id": "d6298a2bba6c478f8b1422fc81b0658c",
"name": "showers",
"level": 1
},
{
"id": "bb1eaed512284530a5b5c077a07a25eb",
"name": "shower stalls",
"level": 2
},
{
"id": "ccbf43b6ab634ffba7dcd62b50a6ee1a",
"name": "corner showers",
"level": 3
}
]
}
]
Example: Categories array two categories
In the following example the product exists in two categories
"bathroom"->"showers"->"shower stalls"->"corner showers""swimming pool"->"showers"
"categories": [
{
"category": [
{
"id": "d5245409d00c4a969dd28eb3d183267b",
"name": "bathroom",
"level": 0
},
{
"id": "d6298a2bba6c478f8b1422fc81b0658c",
"name": "showers",
"level": 1
},
{
"id": "bb1eaed512284530a5b5c077a07a25eb",
"name": "shower stalls",
"level": 2
},
{
"id": "ccbf43b6ab634ffba7dcd62b50a6ee1a",
"name": "corner showers",
"level": 3
}
]
},
{
"category": [
{
"id": "c0cd8883413c48318db1658e99f88a20",
"name": "swimming pool",
"level": 0
},
{
"id": "73c5633392734b59b7c6f93e1b595368",
"name": "showers",
"level": 1
}
]
}
]
Validation rules for categories
levelfor the same category must be unique- Single category only has (
id,name,level) fields idis aStringfield. It is not null, and it is not blanknameis aStringfield. It is not null, and it is not blanklevelis aLongnumeric field. It can be 0 or greater
Categories as Path (type: categoryPath)
The categories can be also übergeben as a path.categoryPath
{
"myCategory": "Bekleidung/Damen/Oberteile"
}
Attributes (type: attributes)
In the "attributes" section multiple dynamic attributes for a product are transmitted.
- this section can be used by specifying
"attributes"as key in the document payload- the value of this section is an array of attributes in the specific structure described below
- a document can have multiple attributes
Properties
Each attribute element in "attributes" can contain the following properties:
"id": a unique identifier of the attribute- if
"id"is missing, it is automatically generated from"name"
- if
"name": the name of the attribute that is used for displaying in the frontend"values": the list of values"min": the minimum value of a range"max": the maximum value of a range"unit": unit (eg. mm, cm, g, kg, ...)"dataType": string, double, long, boolean, date"position": The position of the attribute in the detail page
Examples
The following examples show some typical attribute use cases:
Example: "width" as double value range
{
"id": "width",
"name": "Width",
"min": 1,
"max": 99,
"unit": "cm",
"dataType": "double",
"position": 1
}
Example: "width" as single double value
{
"id": "width",
"name": "Width",
"values" : [
55
],
"unit": "cm",
"dataType": "double",
"position": 1
}
Example: "color" as string value
{
"id": "color",
"name": "color",
"values": [
"red"
],
"dataType": "string",
"position": 1
}
Example: "portable" as boolean value
{
"id": "portable",
"name": "portable",
"values": [
false
],
"dataType": "boolean",
"position": 1
}
Example: "validPeriod" as date value range
{
"id": "validPeriod",
"name": "valid Period",
"min": "2021-09-20T08:11:24.372Z",
"max": "2021-09-20T08:11:24.372Z",
"dataType": "date",
"position": 1
}
Example: Attributes array with two attributes
"attributes": [
{
"id": "contents",
"name": "Package Contents",
"values": [
"Manual",
"Power Cable",
"2x AA Batteries"
],
"dataType": "string"
},
{
"id": "01-dia",
"name": "Diameter",
"values": [
127
],
"dataType": "long",
"unit": "mm"
}
]
Validation Rules for Attributes
"id"can benullor a not blank unique string"name"can benullor a not blank string"dataType"can be"string","boolean","long","double"or"date"- For
"string"and"boolean"data types the"values"array is required - For
"long","double"and"date"data types you can choose between simple values and range fields- You must not combine range values and an
"values"array in one attribute - To use simple values, use
"values"array - To use range fields, use
"min","max"properties"min"field value must be less or equals to"max"field value- e.g. for
"long"data type1<2 - e.g. for
"date"data type"2020-08-06"<"2020-08-07"
- You must not combine range values and an
- For
- If you specify the
"values"array, it must not be empty an array "position"field is optional- can be
null, or an integer value
- can be
Acceptable values for data types
Specified "dataType" | acceptable values in "values" |
|---|---|
"string" | any value in string format |
"boolean" | true, false and also "true", "false" in string format |
"long" | integer raw values (1, 2) or integer values in string format ("1", "2") |
"double" | are float or integer raw values (1.4, 2) or the same type of values in string format ("1.4", "2") |
"date" | dates in string format |
Supported formats for "date" dataType
"2020-08-06""2007-12-03T10:15:30.00Z""2020-08-06T22:18:26+0000""2020-08-06T22:18:26.528+0000""2020-08-06T22:18:26.528+00:00"
Example: Bulk Feeding API Usage
In the following example a document with "id" "0815" is updated, by sending a list containing just this document to the Bulk Feeding API.
The updated document contains the fields "id", "title", "attributes" and "categories":
curl -X POST https://qsc-dev.quasiris.de/api/v1/data/bulk/qsc/demo/products -H "Content-Type: application/json" -H "X-QSC-Token: bbc20990-704f-45bb-9f56-e80bca8d0c89" -d '
[
{
"header": {
"id": "0815",
"action": "update"
},
"payload": {
"id": "0815",
"title": "bar",
"attributes": [
{
"id": "farbe",
"name": "Farbe",
"values": [
"weiß"
],
"dataType": "string"
},
{
"id": "breite",
"name": "Breite",
"values": [
120
],
"dataType": "long",
"unit": "mm"
},
{
"id": "hoehe",
"name": "Höehe",
"min": 50,
"max": 100,
"dataType": "double",
"unit": "cm"
}
],
"categories": [
{
"category": [
{
"id": "d5245409d00c4a969dd28eb3d183267b",
"name": "example products",
"level": 0
},
{
"id": "d6298a2bba6c478f8b1422fc81b0658c",
"name": "foo",
"level": 1
}
]
}
]
}
}
]'