Implementing Search Functionality

1. Defining Search Fields

Example: Search query field

type Query {
  search(query: String!, types: [SearchType!], first: Int = 20): SearchConnection!
}
union SearchHit = User | Post | Product

2. Using Search Arguments

ArgumentUse
queryUser-entered text
typesRestrict result kinds
filterDomain filters (date range, tags)
first / afterPagination
BackendTool
Postgrestsvector + GIN index
MySQLMATCH ... AGAINST
ExternalElasticsearch, Meilisearch, Typesense, Algolia
MethodDetail
Trigrampg_trgm similarity
LevenshteinEdit distance
Search engineBuilt-in fuzziness param

5. Using Search Operators

OperatorExample
AND/ORgraphql AND apollo
Phrase"exact phrase"
Exclude-spam
Fieldtitle:graphql

6. Implementing Search Filters

input SearchFilter {
  types: [SearchType!]
  authorId: ID
  dateRange: DateFilter
  tags: [String!]
}

7. Implementing Search Sorting

SortUse
RELEVANCEDefault; from search engine score
RECENTBy createdAt DESC
POPULARBy interaction count

8. Highlighting Search Results

Example: Highlight field

type SearchHit {
  node: Post!
  score: Float!
  highlights: [Highlight!]!
}
type Highlight { field: String!, snippet: String! }

9. Implementing Search Pagination

ApproachDetail
CursorEncode score + tiebreaker id
search_after (ES)Native deep pagination
Hard capLimit max page (e.g. 1000 results)

10. Optimizing Search Performance

OptimizationDetail
Cache common queriesRedis, edge cache
Prefix index for autocompleteEdge n-grams
Async indexingOutbox + queue
Limit returned fieldsAvoid loading full docs