Skip to content
Go back

Building AI-Powered Search UI with Vector Embeddings

Building AI-Powered Search UI with Vector Embeddings

Introduction

Semantic search enhances user experience by returning conceptually relevant results. This guide builds a React UI that queries a vector database for embeddings.

Prerequisites

Step 1: Search API

Assumes an API endpoint /api/search that accepts { query } and returns [{ title, snippet }].

Step 2: Install Dependencies

npm install axios debounce

Step 3: Create Search Component

Create components/SemanticSearchUI.tsx:

'use client';

import { useState, useEffect } from 'react';
import axios from 'axios';
import debounce from 'lodash/debounce';

interface Result { title: string; snippet: string; }

export default function SemanticSearchUI() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState<Result[]>([]);
  const [loading, setLoading] = useState(false);

  const fetchResults = debounce(async (q: string) => {
    if (!q) {
      setResults([]);
      return;
    }
    setLoading(true);
    try {
      const res = await axios.post('/api/search', { query: q });
      setResults(res.data.results);
    } catch (error) {
      console.error('Search error:', error);
    } finally {
      setLoading(false);
    }
  }, 300);

  useEffect(() => {
    fetchResults(query);
  }, [query]);

  return (
    <div className="max-w-2xl mx-auto p-6">
      <input
        type="text"
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="Search..."
        className="w-full p-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 mb-4"
      />
      {loading && <div>Loading...</div>}
      <ul className="space-y-2">
        {results.map((r, idx) => (
          <li key={idx} className="border-b pb-2">
            <h3 className="font-semibold">{r.title}</h3>
            <p className="text-gray-600 text-sm">{r.snippet}</p>
          </li>
        ))}
      </ul>
    </div>
  );
}

Step 4: Use in App

In app/page.tsx:

import SemanticSearchUI from '@/components/SemanticSearchUI';

export default function Home() {
  return (
    <main className="min-h-screen bg-gray-50">
      <SemanticSearchUI />
    </main>
  );
}

Summary

This React search UI uses vector embeddings behind the scenes for semantic search, providing users with more relevant results based on meaning rather than keywords.


Share this post on:

Previous Post
Using PostGIS for Location-Based Features in PostgreSQL
Next Post
Comparing Vector Databases: Pinecone vs. Weaviate vs. Milvus