When content is created and updated in iCM it is indexed in iCM's SOLR search engine. iCM maintains two SOLR instances, one for searching in iCM, and one for the website. Each instance has several categories of item, known as collections.
Collection | Description | Available |
---|---|---|
Article | The articles in iCM | Site and iCM |
Media | Items in the iCM media library and (optionally) the media file components | Site and iCM |
Message | Replies to forum threads | Site and iCM |
Metadata | Metadata values in iCM | Site and iCM |
Object | iCM objects | Site and iCM |
PublishedEndpoint | Published End Points | iCM only |
PublishedForm | Published Forms | iCM only |
SiteUser | Website users | Site and iCM |
WIPEndpoint | Work in progress End points | iCM only |
WIPForm | Work in progress forms | iCM only |
Workflow | Workflow process instance and task data. Use the Process Instance Search Indexing API to query this data | Site only |
Indexed Content
The content of each item in a collection is stored in fields defined in SOLR's schema.xml. The schema is part of the default iCM installation and editing it is not supported. The standard fields are:
<field name="keyid" type="string" indexed="true" stored="true" required="true" />
<field name="groupkey" type="string" indexed="true" stored="true" required="false" />
<field name="nkeyid" type="tint" indexed="true" stored="true" required="true" />
<field name="keytype" type="string" indexed="true" stored="true" required="true" />
<field name="id" type="string" indexed="true" stored="true" required="false" />
<field name="custom1" type="commaDelimLowerCase" indexed="true" stored="true" />
<field name="custom2" type="commaDelimLowerCase" indexed="true" stored="true" />
<field name="custom3" type="commaDelimLowerCase" indexed="true" stored="true" required="false" />
<field name="metadata" type="commaDelimLowerCase" indexed="true" stored="true" />
<field name="parentdata" type="commaDelimLowerCase" indexed="true" stored="true" />
<field name="title" type="text" indexed="true" stored="true" omitNorms="false" />
<field name="summary" type="text" indexed="true" stored="true" omitNorms="false" />
<field name="body" type="text" indexed="true" stored="false" />
<field name="keywords" type="textKeywords" indexed="true" stored="false" />
<field name="url" type="objectRawText" indexed="true" stored="true" />
<field name="spell" type="textSpell" indexed="true" stored="false" multiValued="true" />
<field name="creationdate" type="tdate" indexed="true" stored="true" required="false" />
<field name="modificationdate" type="tdate" indexed="true" stored="true" required="false" />
<field name="displaystartdate" type="tdate" indexed="true" stored="true" required="false" />
<field name="displayenddate" type="tdate" indexed="true" stored="true" required="false" />
<field name="securitydata" type="string" indexed="true" stored="true" required="false" />
The spell field collects values from other fields to create an index which can be used for spellchecking.
<copyField source="title" dest="spell" />
<copyField source="summary" dest="spell" />
<copyField source="body" dest="spell" />
<copyField source="keywords" dest="spell" />
There are also a set of dynamic fields, generally used to store iCM object data (whether article extras, object properties, form fields, user profile information etc). They are dynamic because any number of fields could be present:
<dynamicField name="OBJECT_TEXT_*" type="objectText" indexed="true" stored="false" />
<dynamicField name="OBJECT_RAWC_*" type="objectRawText" indexed="true" stored="false" />
<dynamicField name="OBJECT_C_*" type="textKeywords" indexed="true" stored="true" />
<dynamicField name="OBJECT_I_*" type="tint" indexed="true" stored="true" />
<dynamicField name="OBJECT_N_*" type="tdouble" indexed="true" stored="true" />
<dynamicField name="OBJECT_DT_*" type="tdate" indexed="true" stored="true" />
<dynamicField name="OBJECT_SF_*" type="searchField" indexed="true" stored="true" />
<dynamicField name="OBJECT_LL_*" type="latlong" indexed="true" stored="true" />
<dynamicField name="OBJECT_CODE_*" type="textCode" indexed="true" stored="false" />
<dynamicField name="OBJECT_ASSETLIST_*" type="commaDelimLowerCase" indexed="true" stored="true" />
<dynamicField name="OBJECT_ASSET_*" type="tint" indexed="true" stored="true" />
<dynamicField name="OBJECT_FILE_*" type="objectRawText" indexed="false" stored="false" />
<dynamicField name="ignored_*" type="ignored" multiValued="true" />
<dynamicField name="attr_*" type="ignored" indexed="true" stored="true" multiValued="true" />
<dynamicField name="random*" type="random" indexed="true" stored="false" />
Indexed vs Stored
Fields in the schema have indexed and stored properties.
For example, an article stores its articleid, articleheading, articleintrotext, articletext, ArticleLinkText, ArticleSummary, ExtraData, MetaDataNames and FriendlyURL in the body field. The body field has
The following sections detail the content, fields and values indexed and stored for each collection.
Article
Standard Fields
Field | Stored | Description |
---|---|---|
keyid | true | The article ID as a string |
groupkey | true | Article+keyid, eg Article123 |
nkeyid | true | The article ID as an integer |
keytype | true | The type of item - ie Article |
id | true | Combined keytype and keyid |
custom1 | true | The article parentdata, see below |
custom2 | true | The article metadata, see below |
custom3 | true | The ID of the template this article is using |
metadata | true | The IDs of any metadata values related to this article. String of comma separated values. |
parentdata | true | The current article ID and ancestor IDs in the article tree, back to 0. Hidden articles (Display:Off or with display date properties outside of the current date) don't appear. String of comma separated values |
title | true | The article heading |
summary | true | The article introductory and body text. This will be replaced by the article summary text if there is any. The summary has a maximum length of 997 characters |
body | false | The articleid, articleheading, articleintrotext, articletext, ArticleLinkText, ArticleSummary, ExtraData, MetaDataNames and FriendlyURL |
keywords | false | Any "boosted keywords" added to an article using the "Search" tab |
url | true | The friendly URL |
spell | false | The combined title, summary, body and keyword fields |
creationdate | true | The article creation date |
modificationdate | true | The article last modified date |
displaystartdate | true | The article display start date |
displayenddate | true | The article display end date |
securitydata | true | A list of codes that indicate which users have access to this article |
Dynamic Fields
Articles always include the
"OBJECT_RAWC__title": {
"parentsubsite home page": 1,
"another home": 1,
"file upload": 1,
"javasite home page": 1
},
"OBJECT_C__title": {
"file": 1,
"upload": 1,
"another": 1,
"javasite": 1,
"page": 2,
"home": 3,
"parentsubsite": 1
}
Remaining dynamic fields are used to index and store values entered via the article extras. The field type used by each field on the extra form determines the dynamic field used to store its value. Names are built from the dynamic type prefix and the name of the field in the form designer. For example, here's an article with two fields on its extra form, a text field called "SOMETEXTFIELD" and a location picker field called "LOCATIONEXTRAS"
"OBJECT_C_SOMETEXTFIELD": "some text",
"OBJECT_C__title": "My Best Article",
"OBJECT_LL_LOCATIONEXTRAS": "51.4930534589,-0.1301716614"
Media
The media collection holds two distinct, but linked, types of item. The first are the media items themselves, created and managed in iCM. The second are the actual physical media files associated with an item (a media item's components). Files are only indexed if a media type definition has the "Index files" checkbox checked. This means that every media item will have an entry, but not all items will have indexed files (nor should they). Some items may have several indexed files. Media items and their component files are linked by matching groupkeys.
Standard Fields - Media Items
Field | Stored | Description |
---|---|---|
keyid | true | The media ID as a string |
groupkey | true | Media+keyid, eg Media123 |
nkeyid | true | The media ID as an integer |
keytype | true | The type of item - ie Media |
id | true | Combined keytype and keyid |
custom1 | true | The media parentdata, see below |
custom2 | true | The group the media item is in, followed by the ID of its type |
custom3 | true | Not used |
metadata | true | The IDs of any metadata values related to this item. String of comma separated values. |
parentdata | true | The ID of the group and ancestor groups this item is in, back to 0. String of comma separated values |
title | true | The title of the media item |
summary | true | Keywords, title, description and metadata values. |
body | false | The mediaid, keywords, title, description and MetaData |
keywords | false | Not used (the "keywords" added to a media item are stored in the summary and body fields) |
url | true | Not used |
spell | false | Not used |
creationdate | true | The media item creation date |
modificationdate | true | The media item last modified date |
displaystartdate | true | The media item display start date |
displayenddate | true | The media item display end date |
securitydata | true | A list of codes that indicate which users have access to this article |
Dynamic Fields - Media Items
Media items only include the
Standard Fields - Indexed Files
Indexed files take many of their field values from the parent media item they are a component of.
Field | Stored | Description |
---|---|---|
keyid | true | The filepath |
groupkey | true | Media+ the ID of the media item this file is a component of, eg Media123. This creates the link between an indexed item and its components |
nkeyid | true | Always 0 |
keytype | true | The type of item - ie Media |
id | true | Combined keytype and keyid |
custom1 | true | Always "MediaFile" |
custom2 | true | The ID of the media item this file is a component of |
custom3 | true | The group the media item is in, followed by the ID of its type (ie the custom2 field of the parent media item) |
metadata | true | Not used |
parentdata | true | The ID of the group and ancestor groups this item is in, back to 0. String of comma separated values |
title | true | Not used |
summary | true | Not used |
body | false | Not used |
keywords | false | Not used |
url | true | The URL of this media item accessed via iCM's mediaaccess.cfm eg http://timssite/enterprise/icm/mediaaccess.cfm?file=/image/p/c/528927-country-pub-warwickshire.jpeg |
spell | false | Not used |
creationdate | true | The media parent item's creation date |
modificationdate | true | The media parent item's last modified date |
displaystartdate | true | The media parent item's display start date |
displayenddate | true | The media parent item's display end date |
securitydata | true | Not used (the parent item is secured, not the individual files) |
Dynamic Fields - Indexed Files
Media files only include the
Message
Standard Fields
Field | Stored | Description |
---|---|---|
keyid | true | The message ID as a string |
groupkey | true | Message+keyid, eg Message123 |
nkeyid | true | The message ID as an integer |
keytype | true | The type of item - ie Message |
id | true | Combined keytype and keyid |
custom1 | true | The parent thread ID |
custom2 | true | The parent forum ID |
custom3 | true | Not used |
metadata | true | Not used |
parentdata | true | The ID of the group and ancestor groups this message is in, back to 0. String of comma separated values |
title | true | The message subject |
summary | true | Who the message is "from" followed by the message body |
body | false | The MessageID, Subject, UserName and Body |
keywords | false | Not used |
url | true | Not used |
spell | false | Not used |
creationdate | true | The message creation date |
modificationdate | true | The message last modified date |
displaystartdate | true | Not used |
displayenddate | true | Not used |
securitydata | true | Not used |
Dynamic Fields
Messages include five dynamic fields.
"OBJECT_C__title": "The message subject",
"OBJECT_I_MESSAGEPARENT": 4,
"OBJECT_C_MESSAGEBODY": "The body of the message",
"OBJECT_C_MESSAGEUSERNAME": "username"
Metadata
Standard Fields
Field | Stored | Description |
---|---|---|
keyid | true | The metadata ID as a string |
groupkey | true | Metadata+keyid, eg Metadata123 |
nkeyid | true | The metadata ID as an integer |
keytype | true | The type of item - ie Metadata |
id | true | Combined keytype and keyid |
custom1 | true | The parentdata |
custom2 | true | The schema name and schema ID, comma separated |
custom3 | true | Not used |
metadata | true | Not used |
parentdata | true | The ID of the property, group and ancestor groups this value is in. String of comma separated values |
title | true | The metadata property and value, colon separated, eg "colour : red" |
summary | true | The metadata value, description, local terms, schema name, schema ID and known terms |
body | false | As per the summary, plus the value ID |
keywords | false | Not used |
url | true | Not used |
spell | false | Not used |
creationdate | true | Not used |
modificationdate | true | Not used |
displaystartdate | true | Not used |
displayenddate | true | Not used |
securitydata | true | Not used |
Dynamic Fields
Messages only include the
Search Fields
When creating metadata groups and properties you can add a "Search Field" name. When metadata values from a group or property that has a search field is related to another iCM content item (an article for example), the values will be indexed as a dynamic "OBJECT_SF_*" field, using the name set in the group/property. See Understanding Metadata Properties and Values for an example.
This functionality is intended to be used for faceting. When searching against this field you can use a pipe (|) delimited set of values, which won't be split into tokens.
Object
The most common objects you search for will be those created by form submissions that include a "database save action". Fields you'd like to search on (ie the properties of the object) need to be set as searchable in your form design. If you form uses an external type definition, the settings in the external definition determine whether a field is searchable.
Standard Fields
Field | Stored | Description |
---|---|---|
keyid | true | The object ID as a string |
groupkey | true | Object+keyid, eg Object123 |
nkeyid | true | The object ID as an integer |
keytype | true | The type of item - ie Object |
id | true | Combined keytype and keyid |
custom1 | true | The object's type |
custom2 | true | "0" private types, "1" for public types |
custom3 | true | Not used |
metadata | true | Not used |
parentdata | true | Not used |
title | true | The type, date-time created and created by |
summary | true | The type and label |
body | false | The values from properties of the object set as searchable |
keywords | false | Not used |
url | true | The object's label |
spell | false | Not used |
creationdate | true | The object's creation date |
modificationdate | true | The object's last modified date |
displaystartdate | true | Not used |
displayenddate | true | Not used |
securitydata | true | Not used |
Dynamic Fields
The dynamic fields of an indexed object are those properties that have values and are set as searchable. This object, called PERSONNAME has two properties, LASTNAME and FIRSTNAME that are searchable and have values.
"OBJECT_C__icmTypeName": "PERSONNAME",
"OBJECT_C__icmCreatedBy": "UNKNOWN",
"OBJECT_C__icmPublicType": "1",
"OBJECT_C__title": "PERSONNAME,{ts '2017-05-16 12:22:01'},UNKNOWN",
"OBJECT_C_LASTNAME": "Gulliver",
"OBJECT_C_FIRSTNAME": "Tim",
"OBJECT_C__icmLastUpdatedBy": "UNKNOWN"
All objects also include the same five standard dynamic fields - the lowercase fields above.
Site User
Note that only site account users are fully indexed. The various login provider accounts associated with a site user are not. However, the login provider usernames linked to an account are indexed in the
Standard Fields
Field | Stored | Description |
---|---|---|
keyid | true | The user ID as a string |
groupkey | true | SiteUser+keyid, eg SiteUser123 |
nkeyid | true | The user ID as an integer |
keytype | true | The type of item - ie SiteUser |
id | true | Combined keytype and keyid |
custom1 | true | The ID of the userprofile object associated with this user's profile |
custom2 | true | A comma separated list of groups IDs this user is a member of (doesn't seem to return though) |
custom3 | true | Whether the user is disabled (1) or not (0) |
metadata | true | Not used |
parentdata | true | Not used |
title | true | The username |
summary | true | The description, or the OBJECT_C__searchableFields if the description is blank |
body | false | The values from properties of the userprofile object set as searchable |
keywords | false | Not used |
url | true | Not used |
spell | false | Not used |
creationdate | true | The site user creation date |
modificationdate | true | The site user last modified date. A user's last successful login will also update this field |
displaystartdate | true | Not used |
displayenddate | true | Not used |
securitydata | true | Not used |
Dynamic Fields
In a similar way to Objects, items in the SiteUser collection index any properties of a user's userprofile that have been set as searchable. The
For example, in the fields below
"OBJECT_C_FAMILYNAME": "Gulliver",
"OBJECT_C_DISPLAYNAME": "Tim Gulliver",
"OBJECT_C_PREFNAME": "Tim"
"OBJECT_C__icmCreatedBy": "ADMIN",
"OBJECT_C_EMAIL": "support@gossinteractive.com",
"OBJECT_C_GIVENNAMES": "Tim",
"OBJECT_C__title": "TIMG",
"OBJECT_C__icmLastUpdatedBy": "ADMIN",
"OBJECT_C___displayusername": "Tim"
"OBJECT_C___searchableFields": "Tim Gulliver support@gossinteractive.com"
"OBJECT_K___loginusernames": "G_112233445566778899",
"OBJECT_C___email": "support@gossinteractive.com",
"OBJECT_C___prefusername": "Prefname",
"OBJECT_DT___loginuserlastloggedin": "2023-03-09T14:05:33Z"