Logo
NeoArc Studio

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.

BehaviourDescription
searchableThe field is included in full-text search queries
filterableThe field supports filter expressions (exact match, range)
sortableThe field is available for sorting results
facetableThe field is available for faceted navigation and counts
retrievableThe field is returned in search results

Extended Behaviours

Three additional behaviours are available as separate boolean flags outside the searchBehaviours array.

BehaviourDescription
highlightableThe field supports search hit highlighting
aggregatableThe field is available for aggregation queries
scoringEnabledThe 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.

SettingDescription
analyzerAnalyser used for both indexing and search (mutually exclusive with split analysers)
indexAnalyzerAnalyser used only at index time
searchAnalyzerAnalyser used only at search time
normalizerText normalisation for filterable and sortable fields
synonymMapSynonym map name for query expansion (references a map defined in the profile)
languageLanguage 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.

CategoryTypes
Texttext (full-text analysed), keyword (exact match, not analysed), completion (autocomplete/suggest)
Numericinteger, long, float, double, half_float, scaled_float
Boolean and Dateboolean, date
Geogeo_point, geo_shape
Structuredobject, nested
Vectordense_vector
Binarybinary

Vector Search

Vector search configuration applies to properties with searchFieldType: 'dense_vector'.

SettingDescription
dimensionsNumber of dimensions in the embedding vector (required for dense_vector fields)
vectorSearchProfileEngine-specific vector search algorithm profile name
similarityMetricDistance function: cosine, dot_product, or l2_norm

Storage and Performance

Storage settings control how field data is physically stored in the index.

SettingTypeDescription
storedbooleanWhether to store the original value separately for retrieval
docValuesbooleanEnable doc values for sorting and aggregation performance
indexEnabledbooleanWhether to index this field (false = store-only, no search)
normsbooleanWhether to store normalisation factors for relevance scoring
nullValuestringValue to use in the index when the field is null
termVectorenumTerm 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.

RuleSeverityDescription
search-duplicate-field-nameErrorTwo fields project to the same search field name
search-analyzer-conflictWarningBoth analyzer and indexAnalyzer/searchAnalyzer are set (mutually exclusive)
search-vector-missing-dimensionsErrorsearchFieldType is dense_vector without dimensions specified
search-vector-missing-profileWarningVector field without vectorSearchProfile
search-key-not-filterableWarningKey field should be filterable
search-nested-no-flagWarningsearchFieldType is nested without nested: true
search-boost-without-scoringInfoBoost set but scoringEnabled is false
search-geo-missing-typeWarningGeo-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'
      }
    }
  }
}