Per-Property Search Configuration
Configure search behaviours, field types, analysers, vector search, storage settings, sub-fields, and per-profile overrides on each model property via the SearchProjectionConfig.
Each property in the central model has a projections.search object of type SearchProjectionConfig. This projection controls every aspect of how the property maps to the search index: whether it is included, what behaviours it has, which analyser processes it, and how it is stored. All fields are optional; the included flag gates visibility in search views and index generation.
Inclusion
The included: boolean field is the gateway to all search configuration. When set to false or omitted, the property does not appear in search views and is excluded from index generation. Set included: true to opt a property into the search index.
Core Search Behaviours
Five core behaviours control how a field participates in search operations. These are stored in the searchBehaviours array.
| Behaviour | Description |
|---|---|
| searchable | The field is included in full-text search queries |
| filterable | The field supports filter expressions (exact match, range) |
| sortable | The field is available for sorting results |
| facetable | The field is available for faceted navigation and counts |
| retrievable | The field is returned in search results |
Extended Behaviours
Three additional behaviours are available as separate boolean flags outside the searchBehaviours array.
| Behaviour | Description |
|---|---|
| highlightable | The field supports search hit highlighting |
| aggregatable | The field is available for aggregation queries |
| scoringEnabled | The field is included in relevance scoring (set to false for index-only fields) |
Text Analysis
Text analysis settings control how text fields are tokenised and normalised during indexing and querying.
| Setting | Description |
|---|---|
| analyzer | Analyser used for both indexing and search (mutually exclusive with split analysers) |
| indexAnalyzer | Analyser used only at index time |
| searchAnalyzer | Analyser used only at search time |
| normalizer | Text normalisation for filterable and sortable fields |
| synonymMap | Synonym map name for query expansion (references a map defined in the profile) |
| language | Language code for language-specific analysers |
Field Naming
By default, field names in the search index are derived from the canonical property name, transformed by the active profile's naming convention. The fieldName override takes priority over the naming convention, allowing explicit control over the indexed field name.
Key Field
The key: boolean flag marks a property as the document key field. Each entity should have exactly one key field. Key fields should also be filterable; omitting the filterable behaviour triggers a validation warning (search-key-not-filterable).
Search Field Type Override
The searchFieldType property overrides the default type mapping from the search profile. NeoArc Studio supports 17 search field types across 6 categories.
| Category | Types |
|---|---|
| Text | text (full-text analysed), keyword (exact match, not analysed), completion (autocomplete/suggest) |
| Numeric | integer, long, float, double, half_float, scaled_float |
| Boolean and Date | boolean, date |
| Geo | geo_point, geo_shape |
| Structured | object, nested |
| Vector | dense_vector |
| Binary | binary |
Vector Search
Vector search configuration applies to properties with searchFieldType: 'dense_vector'.
| Setting | Description |
|---|---|
| dimensions | Number of dimensions in the embedding vector (required for dense_vector fields) |
| vectorSearchProfile | Engine-specific vector search algorithm profile name |
| similarityMetric | Distance function: cosine, dot_product, or l2_norm |
Storage and Performance
Storage settings control how field data is physically stored in the index.
| Setting | Type | Description |
|---|---|---|
| stored | boolean | Whether to store the original value separately for retrieval |
| docValues | boolean | Enable doc values for sorting and aggregation performance |
| indexEnabled | boolean | Whether to index this field (false = store-only, no search) |
| norms | boolean | Whether to store normalisation factors for relevance scoring |
| nullValue | string | Value to use in the index when the field is null |
| termVector | enum | Term vector storage: none, withPositions, withOffsets, or withPositionsAndOffsets |
Sub-Fields
Sub-fields enable multiple indexing strategies on the same source field. A common pattern is a text field with a .raw keyword sub-field for exact matching alongside full-text search.
interface SearchSubFieldConfig {
name: string; // Sub-field suffix (e.g., 'raw', 'keyword', 'english')
searchFieldType: SearchFieldType; // Sub-field search type
analyzer?: string; // Analyser for this sub-field
}
Per-Profile Overrides
When a single model targets multiple search engines, each property needs different analyser settings per engine. The profileOverrides object is keyed by search profile ID and provides engine-specific text analysis settings.
interface SearchProfileFieldOverrides {
analyzer?: string;
indexAnalyzer?: string;
searchAnalyzer?: string;
normalizer?: string;
synonymMap?: string;
language?: string;
}
Base text analysis fields (analyzer, indexAnalyzer, searchAnalyzer, normalizer, synonymMap, language) remain as fallbacks when no profile override exists for the active profile. The search view and graph property table search lens both prefer profile overrides over base values.
Boost and Scoring
The boost field sets a numeric weight for relevance scoring. Higher boost values increase the relative importance of matches on this field. Setting scoringEnabled: false excludes the field from scoring entirely. A validation rule (search-boost-without-scoring) flags properties that have a boost value but scoring disabled.
Nested Fields
The nested: boolean flag enables nested queries on structured fields. When using searchFieldType: 'nested', the nested flag should also be set to true; omitting it triggers a validation warning (search-nested-no-flag).
Validation Rules
NeoArc Studio enforces 8 search-specific validation rules on the model to catch configuration issues early.
| Rule | Severity | Description |
|---|---|---|
| search-duplicate-field-name | Error | Two fields project to the same search field name |
| search-analyzer-conflict | Warning | Both analyzer and indexAnalyzer/searchAnalyzer are set (mutually exclusive) |
| search-vector-missing-dimensions | Error | searchFieldType is dense_vector without dimensions specified |
| search-vector-missing-profile | Warning | Vector field without vectorSearchProfile |
| search-key-not-filterable | Warning | Key field should be filterable |
| search-nested-no-flag | Warning | searchFieldType is nested without nested: true |
| search-boost-without-scoring | Info | Boost set but scoringEnabled is false |
| search-geo-missing-type | Warning | Geo-related property without explicit search field type |
Complete Configuration Example
A fully configured search projection demonstrating key settings:
projections: {
search: {
included: true,
key: false,
searchBehaviours: ['searchable', 'filterable', 'retrievable'],
searchFieldType: 'text',
analyzer: 'english',
boost: 2.0,
highlightable: true,
scoringEnabled: true,
stored: true,
docValues: false,
subFields: [
{
name: 'raw',
searchFieldType: 'keyword',
analyzer: undefined
}
],
profileOverrides: {
'azure-profile-id': {
analyzer: 'en.microsoft',
synonymMap: 'product-synonyms'
},
'elastic-profile-id': {
analyzer: 'english',
synonymMap: 'product-synonyms-es'
}
}
}
}