Cost Optimization
Since search indexes can contain a large number of items (one item per token per document), optimizing your DynamoDB usage can significantly reduce costs.
Use Short Field Names
Reduce storage costs and RCU/RRU consumption by using short names:
typescript
const dynamosearch = new DynamoSearch({
indexTableName: 'search-index',
fields: [
{ name: 'title', shortName: 't', analyzer },
{ name: 'description', shortName: 'd', analyzer },
],
keySchema: [{ name: 'id', type: 'HASH' }],
});Short names are used in the partition key:
- Without:
description;machine(19 bytes) - With:
d;machine(9 bytes)
Selective Indexing
Only index fields that need to be searchable:
typescript
// ❌ Index everything
const dynamosearch = new DynamoSearch({
fields: [
{ name: 'title', analyzer },
{ name: 'description', analyzer },
{ name: 'metadata', analyzer }, // Not searchable, wastes space
{ name: 'tags', analyzer },
{ name: 'internalNotes', analyzer }, // Not searchable, wastes space
],
});
// ✅ Index only searchable fields
const dynamosearch = new DynamoSearch({
fields: [
{ name: 'title', analyzer },
{ name: 'description', analyzer },
{ name: 'tags', analyzer },
],
});On-Demand vs Provisioned
On-Demand (default):
typescript
await dynamosearch.createIndexTable({
tableProperties: { BillingMode: 'PAY_PER_REQUEST' },
});- Pay per request
- Good for unpredictable workloads
- No capacity planning needed
Provisioned:
typescript
await dynamosearch.createIndexTable({
tableProperties: {
BillingMode: 'PROVISIONED',
ProvisionedThroughput: {
ReadCapacityUnits: 5,
WriteCapacityUnits: 5,
},
},
});- Lower cost for consistent workloads
- Requires capacity planning
- Can use auto-scaling
Monitor Consumed Capacity
Track capacity usage:
typescript
const results = await dynamosearch.search('query', {
fields: ['title', 'description'],
});
console.log('Capacity units consumed:', results.consumedCapacity.capacityUnits);
console.log('Table:', results.consumedCapacity.tableName);Search Fewer Fields
typescript
// More expensive
const results = await dynamosearch.search('query', {
fields: ['title', 'description', 'tags'],
});
// Less expensive
const results = await dynamosearch.search('query', {
fields: ['title'],
});