ElasticsearchOptions
ElasticsearchOptions
Configuration options for the ElasticsearchPlugin.
Signature
interface ElasticsearchOptions {
host?: string;
port?: number;
clientOptions?: ClientOptions;
indexPrefix?: string;
batchSize?: number;
searchConfig?: SearchConfig;
customProductMappings?: {
[fieldName: string]: CustomMapping<[Product, ProductVariant[], LanguageCode]>;
};
customProductVariantMappings?: {
[fieldName: string]: CustomMapping<[ProductVariant, LanguageCode]>;
};
}
Members
host
string
'http://localhost'
clientOptions.node
.
port
number
9200
clientOptions.node
.
clientOptions
ClientOptions
node
or nodes
option is specified, it will override the values provided in the host
and port
options.
indexPrefix
string
'vendure-'
batchSize
number
2000
searchConfig
SearchConfig
customProductMappings
{ [fieldName: string]: CustomMapping<[Product, ProductVariant[], LanguageCode]>; }
Custom mappings may be defined which will add the defined data to the
Elasticsearch index and expose that data via the SearchResult GraphQL type,
adding a new customMappings
field.
The graphQlType
property may be one of String
, Int
, Float
, Boolean
and
can be appended with a !
to indicate non-nullable fields.
This config option defines custom mappings which are accessible when the “groupByProduct”
input options is set to true
.
Example
customProductMappings: {
variantCount: {
graphQlType: 'Int!',
valueFn: (product, variants) => variants.length,
},
reviewRating: {
graphQlType: 'Float',
valueFn: product => (product.customFields as any).reviewRating,
},
}
Example
query SearchProducts($input: SearchInput!) {
search(input: $input) {
totalItems
items {
productId
productName
customMappings {
...on CustomProductMappings {
variantCount
reviewRating
}
}
}
}
}
customProductVariantMappings
{ [fieldName: string]: CustomMapping<[ProductVariant, LanguageCode]>; }
This config option defines custom mappings which are accessible when the “groupByProduct”
input options is set to false
.
Example
query SearchProducts($input: SearchInput!) {
search(input: $input) {
totalItems
items {
productId
productName
customMappings {
...on CustomProductVariantMappings {
weight
}
}
}
}
}
SearchConfig
Configuration options for the internal Elasticsearch query which is generated when performing a search.
Signature
interface SearchConfig {
facetValueMaxSize?: number;
multiMatchType?: 'best_fields' | 'most_fields' | 'cross_fields' | 'phrase' | 'phrase_prefix' | 'bool_prefix';
boostFields?: BoostFieldsConfig;
priceRangeBucketInterval?: number;
mapQuery?: (
query: any,
input: ElasticSearchInput,
searchConfig: DeepRequired<SearchConfig>,
channelId: ID,
enabledOnly: boolean,
) => any;
}
Members
facetValueMaxSize
number
50
multiMatchType
'best_fields' | 'most_fields' | 'cross_fields' | 'phrase' | 'phrase_prefix' | 'bool_prefix'
'best_fields'
boostFields
BoostFieldsConfig
priceRangeBucketInterval
number
The interval used to group search results into buckets according to price range. For example, setting this to
2000
will group into buckets every $20.00:
{
"data": {
"search": {
"totalItems": 32,
"priceRange": {
"buckets": [
{
"to": 2000,
"count": 21
},
{
"to": 4000,
"count": 7
},
{
"to": 6000,
"count": 3
},
{
"to": 12000,
"count": 1
}
]
}
}
}
}
mapQuery
( query: any, input: ElasticSearchInput, searchConfig: DeepRequired<SearchConfig>, channelId: ID, enabledOnly: boolean, ) => any
This config option allows the the modification of the whole (already built) search query. This allows for e.g. wildcard / fuzzy searches on the index.
Example
mapQuery: (query, input, searchConfig, channelId, enabledOnly){
if(query.bool.must){
delete query.bool.must;
}
query.bool.should = [
{
query_string: {
query: "*" + term + "*",
fields: [
`productName^${searchConfig.boostFields.productName}`,
`productVariantName^${searchConfig.boostFields.productVariantName}`,
]
}
},
{
multi_match: {
query: term,
type: searchConfig.multiMatchType,
fields: [
`description^${searchConfig.boostFields.description}`,
`sku^${searchConfig.boostFields.sku}`,
],
},
},
];
return query;
}
BoostFieldsConfig
Configuration for boosting the scores of given fields when performing a search against a term.
Boosting a field acts as a score multiplier for matches against that field.
Signature
interface BoostFieldsConfig {
productName?: number;
productVariantName?: number;
description?: number;
sku?: number;
}
Members
productName
number
1
productVariantName
number
1
description
number
1
sku
number
1