Building a Semantic Search Engine from Scratch

Building a Semantic Search Engine from Scratch

Smarter Search: Building a Semantic Search Engine from Scratch


1. Introduction: Why Google Isn’t Enough Anymore

Imagine this: You search Google for “best way to train a dog,” and instead of bombarding you with links to random dog training sites, the search engine understands exactly what you need. It pulls up results like:

  • “Step-by-step dog training guide for beginners”
  • “Top 10 commands every dog should learn”
  • “Common mistakes to avoid when training your dog”

That’s the magic of semantic search—it’s not just about matching words, it’s about understanding the meaning behind them. Semantic search takes a huge leap forward by focusing on context and intent, allowing search engines to provide results that are far more relevant to your actual needs.

1.1 From Keyword Matching to Context Understanding

Traditional search engines are like search-and-retrieve machines. You type in a query, and they look for exact matches—if your query contains the word “dog training,” they pull up any page that includes those words. Simple, right? But this approach falls short when queries become more nuanced or complex.

Take this example:

  • Traditional Keyword Search: You search for “apple,” and you’re likely to get results about both the tech giant Apple and the fruit. It's an exact match, but it doesn't capture your intent.
  • Semantic Search: Instead of relying on the exact word “apple,” semantic search understands your query in context. If you're asking about fruit, it will pull up pages that talk about apple varieties, recipes, and health benefits. If you're asking about technology, it will focus on products like the iPhone or MacBook.

This shift from exact keyword matching to contextual understanding makes a world of difference. Semantic search gets you closer to the information you really want, not just information that happens to have matching keywords.

1.2 The Core of Semantic Search: Vector Embeddings

So, how does semantic search understand context? Enter vector embeddings—the secret sauce that powers semantic search.

Let’s break it down:

  • What is a vector? In simple terms, a vector is a mathematical representation of something—in this case, text. When we talk about embedding text, we’re turning sentences or words into numerical vectors that machines can easily interpret and compare.
  • How does this help? Instead of just looking for exact words, a semantic search engine looks at the relationship between words. For instance, it can understand that the word “dog” is similar to “puppy,” and that “laptop” is closely related to “computer.”

Imagine going to a library and using a map that doesn’t just tell you the location of books by their titles but organizes them based on themes like technology, science, or history. You’re not limited to browsing only exact matches—you can explore based on what the books are about. That's essentially what vector embeddings do for text.

Real-Life Analogy: Restaurant Recommendations Here’s a simple way to think about it: Imagine you’re asking a friend for a restaurant recommendation. You don’t just say “restaurant” because that’s too vague. Instead, you provide context like “I’m in the mood for Italian food” or “I want a vegan restaurant close by.”

A semantic search engine works the same way. It takes your query and uses vector embeddings to understand not just the words but the context—whether you're asking about food, price, location, and more. It then returns results that align with your intent, not just the exact words you typed.

For example, if you search for "apple," the semantic search engine doesn’t get stuck trying to choose between fruit or tech products. It understands what you're looking for based on the surrounding context of your query. It’s like your search engine is learning to think like you.

image

2. Tools and Libraries You’ll Need

Building a semantic search engine sounds like a huge task, but with the right tools, it’s not only possible, it’s also a lot of fun! There are several powerful libraries that make building a semantic search engine from scratch both straightforward and efficient. Here's what you'll need:

2.1 The Tech Stack

Before we dive into the code, let’s talk about the essential components of the tech stack you’ll be using to create your semantic search engine:

  • Python: The go-to language for machine learning and NLP (Natural Language Processing). It’s beginner-friendly and has powerful libraries for building AI models.
  • Sentence-Transformers (or Hugging Face Transformers): These libraries provide pre-trained models for generating vector embeddings from text, making them crucial for understanding the meaning behind your queries.
  • FAISS or ScaNN: These are libraries used to index and retrieve similar vectors quickly, making search operations faster and more efficient.
  • Streamlit (optional): If you want to add a simple user interface (UI) to your semantic search engine, Streamlit is an excellent tool for creating web apps quickly.

Why these tools?

  • Python is widely supported and has rich libraries like NumPy, Pandas, and TensorFlow for AI tasks.
  • Sentence-Transformers makes it easy to convert text into vectors using models that have been trained on massive amounts of text data. You can start with pre-trained models or fine-tune them for specific tasks.
  • FAISS (Facebook AI Similarity Search) or ScaNN (Scalable Nearest Neighbor) are optimized libraries designed to handle large-scale similarity search, enabling the fast retrieval of similar text vectors from massive datasets.

2.2 Installing and Setting Up the Environment

Now that you know the essential tools, let’s set up your development environment. Here's how to get started:

  • Set up a Python environment: It’s recommended to create a virtual environment to avoid conflicts between different versions of libraries. You can do this by running:
    python -m venv semantic-search-env
    
  • Activate the environment:
    • On Windows: semantic-search-env\Scripts\activate
    • On Mac/Linux: source semantic-search-env/bin/activate
  • Install necessary libraries: After setting up the virtual environment, install the following libraries:
    pip install sentence-transformers faiss-cpu streamlit
    
    • sentence-transformers gives you access to the models that convert text into vectors.
    • faiss-cpu allows you to index and search vectors at scale.
    • streamlit is for building an interactive web interface (if you want to showcase your search engine).
  • Testing the Installation: Once the libraries are installed, it’s good practice to run a quick test to verify everything is working. For example:
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('all-MiniLM-L6-v2')
    sentences = ["I love programming", "Python is awesome"]
    embeddings = model.encode(sentences)
    print(embeddings)
    
    This code snippet will load a pre-trained model and generate embeddings for the sentences you provide.

By now, you’ve got all the tools installed and the environment set up. Now, let’s start building the actual search engine!


3. Building the Engine: Step-by-Step

Now that we’ve got the tools in place, it’s time to start building our semantic search engine. This part will walk you through the core steps of data collection, embedding the text, indexing it, and finally, querying the engine. By the end, you'll have a basic, yet powerful, semantic search system that can return highly relevant search results based on context, not just keywords.

3.1 Step 1: Data Collection and Preprocessing

The first step in building any search engine is gathering the data you want to search through. For a semantic search engine, this data could be anything from FAQs, knowledge bases, documents, articles, or even a product catalog.

Real-Life Example: Let’s say you want to build a search engine for a company’s knowledge base. You would first collect all the articles, troubleshooting guides, and FAQs from the company’s website.

Steps:

  • Data Collection: Start by scraping or manually gathering a list of documents that you want to make searchable.
  • Data Preprocessing: Clean the data. This involves:
    • Removing unnecessary characters or HTML tags.
    • Tokenizing the text (breaking it down into words or phrases).
    • Lowercasing and removing stop words like "the", "is", "and" that don’t add much meaning.

This step ensures that your data is clean and ready to be transformed into meaningful vectors.

3.2 Step 2: Embedding the Text

Once your data is ready, the next step is to convert the text into vectors using a pre-trained model. This is where the real magic happens—because vector embeddings turn the text into a mathematical format that captures its meaning.

You’ll use libraries like Sentence-Transformers to load pre-trained models and encode your data into embeddings.

Code Example: Here’s how you can embed the text using the SentenceTransformer library:

from sentence_transformers import SentenceTransformer

# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2')

# Example documents
documents = [
    "How to reset a password",
    "Best practices for troubleshooting a laptop",
    "What to do when your computer crashes"
]

# Convert the documents into embeddings
embeddings = model.encode(documents)

print(embeddings)

In this example, each document gets converted into a vector (a list of numbers) that represents the meaning of the text.

Why it’s Important: The real power of semantic search comes from the fact that vectors can capture relationships between words that aren’t obvious with keyword-based search. For example, the words "troubleshoot" and "debug" would be mapped closer together in the vector space, even though they aren’t exact matches.

3.3 Step 3: Indexing with FAISS

Once we have the embeddings, we need a way to quickly search through them. FAISS (Facebook AI Similarity Search) is a highly efficient library for this purpose. It allows you to index and search large volumes of vector data in real-time.

Code Example: Here's how you can use FAISS to index your embeddings:

import faiss
import numpy as np

# Convert embeddings to numpy array
embedding_matrix = np.array(embeddings).astype('float32')

# Create a FAISS index
index = faiss.IndexFlatL2(embedding_matrix.shape[1])  # L2 distance metric
index.add(embedding_matrix)

# Now the index is ready for searching

How It Works:

  • Indexing: You add the vector embeddings into the FAISS index. This index will allow the system to quickly retrieve similar vectors when you search.
  • Searching: When you query the search engine, you’ll embed the query in the same way and use the FAISS index to retrieve the most similar vectors.

Real-Life Example: If someone searches “troubleshooting my laptop,” the engine will convert this query into a vector, and then FAISS will compare it to the indexed vectors (documents) to find the most similar results, returning the most relevant articles.

3.4 Step 4: Querying the Engine

Finally, it’s time to test the engine. This step involves embedding the query the user enters, then using the FAISS index to find the most similar documents based on the cosine similarity between the query’s vector and the document vectors.

Code Example: Here’s how you can query the engine:

# Example query
query = "How do I fix a broken laptop screen?"

# Embed the query
query_embedding = model.encode([query])

# Search the FAISS index
D, I = index.search(np.array(query_embedding).astype('float32'), k=3)  # k=3 for top 3 results

# Display the top 3 results
for i in I[0]:
    print(documents[i])

In this case, the query “How do I fix a broken laptop screen?” is embedded and compared to the indexed documents to retrieve the most relevant results. D contains the distances (similarity scores), and I contains the indices of the closest matches.

Why It Works: The engine doesn’t just find documents with similar keywords—it looks for the documents that best match the meaning of the query. This is the power of semantic search—it helps you retrieve relevant information even when the exact keywords aren't present.

This section covered the essential steps to start building your own semantic search engine. Now, your engine can understand queries and return contextually relevant results, even if the exact words in the query don’t match the content of the documents.


4. Enhancing the Search Engine: Adding a User Interface

Now that you have your semantic search engine working, it's time to make it user-friendly. The best search engines aren’t just powerful—they’re easy to use. To make your engine accessible to everyone, you can create a simple web interface that allows users to interact with the system and get results in real-time.

In this section, we’ll show you how to add a basic UI using Streamlit—a Python library that makes building interactive web apps incredibly easy. The goal here is to make your semantic search engine more approachable and give users a pleasant experience while searching.

4.1 Why Use Streamlit?

Streamlit is a popular Python library that enables you to create data-driven web applications without needing any front-end skills. With just a few lines of code, you can transform your Python scripts into a fully functional web app.

Key Features of Streamlit:

  • No HTML or CSS required: You don’t need to know anything about web development—Streamlit handles the interface for you.
  • Real-time updates: It allows you to build apps that update in real time, perfect for interactive search engines.
  • Simple and fast: Streamlit is designed to make app creation as fast and simple as possible.

4.2 Step 1: Setting Up Streamlit

To get started with Streamlit, all you need to do is install the library (if you haven’t already) by running:

pip install streamlit

Once installed, you can quickly turn any Python script into a web app. Create a new file called app.py in your project directory. This file will contain the code for your app.

4.3 Step 2: Designing the UI

Let’s begin by building a simple interface that lets users input a query and see the results. The basic layout will include:

  • A text box for users to type in their search query.
  • A button to trigger the search.
  • A list that displays the search results.

Here’s a simple example of how you can build this in Streamlit:

import streamlit as st
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# Load the pre-trained model and FAISS index (assuming these are already created)
model = SentenceTransformer('all-MiniLM-L6-v2')
index = faiss.read_index('index_file')  # Load the saved FAISS index
documents = ["How to reset a password", "Best practices for troubleshooting a laptop", "What to do when your computer crashes"]  # Sample docs

# Streamlit UI
st.title('Semantic Search Engine')
query = st.text_input("Enter your query:")

if query:
    # Embed the query
    query_embedding = model.encode([query])

    # Search the FAISS index
    D, I = index.search(np.array(query_embedding).astype('float32'), k=3)  # k=3 for top 3 results

    st.write("### Search Results:")
    for i in I[0]:
        st.write(documents[i])  # Display the results

How It Works:

  • st.text_input(): This is where users enter their query.
  • st.write(): This displays the search results.
  • The query is embedded into a vector, and then FAISS retrieves the most similar documents based on cosine similarity.

4.4 Step 3: Running Your Streamlit App

To run the app, simply navigate to your project directory and execute:

streamlit run app.py

This will launch a local server, and you’ll be able to open the app in your browser (typically at http://localhost:8501).

4.5 Step 4: Adding More Features (Optional)

Once you have the basic UI working, you can add more features to improve the user experience:

  • Loading indicators: Show a loading message while the search is being processed.
  • Pagination: If there are too many results, you can paginate them so the user can scroll through pages of results.
  • Highlighting matching terms: You can highlight the terms that matched in the search results to make them stand out.
  • Error handling: Add error messages in case something goes wrong (e.g., no results found or invalid input).

Here’s an example of adding a loading indicator:

with st.spinner('Searching...'):
    D, I = index.search(np.array(query_embedding).astype('float32'), k=3)

This will display a spinning wheel while the search is processing, improving the overall user experience.

4.6 Step 5: Deploying Your Application

Once you're happy with your search engine and its interface, you may want to share it with the world. Streamlit makes deployment easy, and there are several ways to host your app, including:

  • Streamlit Cloud: You can deploy your app for free on Streamlit’s cloud platform. Simply sign up for an account and upload your app to deploy it with minimal setup.
  • Heroku or AWS: If you prefer more control or need more scalability, you can deploy the app on platforms like Heroku or Amazon Web Services (AWS).

Real-Life Example: Enhancing User Experience Think about how search engines like Google present results. They don’t just list links—they show related topics, images, and even structured data (like reviews or ratings). As you progress, you can add similar enhancements to your semantic search engine, such as filtering results by category, sorting by relevance, or showing related articles.

By adding a user interface with Streamlit, you've now transformed your back-end semantic search engine into an interactive, user-friendly application that anyone can use.


5. Optimizing Performance for Large Datasets

As your semantic search engine grows and you start dealing with larger datasets, performance can become a critical issue. The power of semantic search comes from the ability to search for meaning, but this requires efficient handling of large volumes of data to ensure that the search remains fast and responsive.

In this section, we’ll cover strategies to optimize both the storage and searching processes so that your engine can scale without compromising speed or accuracy.

5.1 Efficient Vector Storage

When working with large datasets, storing the vectors efficiently is essential. By default, vector embeddings can take up a lot of memory, especially if you have millions of documents to process. There are a few techniques to handle this efficiently:

5.1.1 Use FAISS Indexes with Compression

FAISS not only supports efficient vector search but also offers several compression methods that reduce memory usage while still maintaining high performance.

  • Product Quantization (PQ): This method reduces the memory footprint by representing vectors with fewer bits. It’s especially useful for large datasets.
  • IVF (Inverted File): This approach organizes vectors into "buckets" and only searches within the relevant buckets, making the search process more efficient.

Example: Here’s how you can implement PQ in FAISS:

# Creating a FAISS index with Product Quantization
quantizer = faiss.IndexFlatL2(embedding_matrix.shape[1])  # FlatL2: L2 distance
index = faiss.IndexIVFPQ(quantizer, embedding_matrix.shape[1], 100, 8, 8)
index.train(embedding_matrix)  # Train on the dataset
index.add(embedding_matrix)  # Add vectors to the index

In this example, IndexIVFPQ enables Product Quantization, which is more efficient in terms of both storage and search speed.

5.1.2 Use Annoy (Approximate Nearest Neighbors)

For extremely large datasets, Annoy (Approximate Nearest Neighbors Oh Yeah) is a fast and memory-efficient library. It builds a tree structure that allows for faster querying and saves a lot of memory.

Annoy is an alternative to FAISS and can be especially useful when memory resources are limited.

Example for using Annoy:

from annoy import AnnoyIndex

# Create an Annoy index for 128-dimensional vectors
index = AnnoyIndex(128, 'angular')

# Add vectors to the index
for i, vector in enumerate(embeddings):
    index.add_item(i, vector)

# Build the index with 10 trees
index.build(10)
index.save('semantic_search.ann')

5.2 Improving Search Speed with Batch Queries

One of the most common performance bottlenecks in search engines is the time it takes to process queries. When dealing with a large number of queries (such as in a real-time application), it’s important to minimize the overhead of processing each one individually.

5.2.1 Batch Search Optimization

You can speed up your search by batching queries. Instead of embedding and searching for one query at a time, you can process multiple queries in parallel, significantly reducing the total search time.

For example, when using FAISS or Annoy, you can submit a batch of queries at once instead of one at a time. This will reduce the time spent on data transfer and improve performance.

Example: Here’s an example of batch processing with FAISS:

queries = ["How do I fix my laptop?", "What’s the best programming language?"]  # List of queries
query_embeddings = model.encode(queries)  # Embed all queries

# Search the FAISS index
D, I = index.search(np.array(query_embeddings).astype('float32'), k=3)  # k=3 for top 3 results

In this case, multiple queries are processed simultaneously, and FAISS performs the search for all of them in parallel.

5.3 Optimizing Querying with Approximate Search

Exact search algorithms can be computationally expensive, especially with large datasets. To solve this, you can use approximate nearest neighbor (ANN) search, which sacrifices a small amount of accuracy for significant gains in speed.

5.3.1 Approximate Search with FAISS or Annoy

Both FAISS and Annoy support approximate search by limiting the number of comparisons they make. This means that the search might not return the absolute closest match but will still return highly relevant results, much faster.

Here’s an example of approximate search using FAISS:

# FAISS index with an approximate search
index.nprobe = 10  # Set the number of probes to control the trade-off between speed and accuracy
D, I = index.search(np.array(query_embedding).astype('float32'), k=3)

In this case, the number of probes (nprobe) determines how many buckets FAISS will search through. A higher value increases the accuracy but also the time taken to perform the search.

Why Use Approximate Search? The performance improvement is huge, especially when working with large datasets. By tuning the parameters (e.g., nprobe in FAISS or the number of trees in Annoy), you can balance speed and accuracy based on your needs.

5.4 Load Balancing and Distributed Systems

As the size of your dataset grows, you may reach the limits of a single server’s capabilities. At this point, you may need to consider using a distributed system for handling the search load.

5.4.1 Sharding the Index

You can split the index into shards and distribute the shards across multiple servers. When a search query is made, it can be routed to the appropriate shard, which improves the response time.

5.4.2 Using a Load Balancer

A load balancer can help distribute incoming search queries across multiple servers, ensuring that no single server becomes a bottleneck. This setup is especially useful when you have multiple users accessing the search engine simultaneously.

Real-Life Example: Imagine you're building a search engine for an e-commerce platform with millions of products. As the dataset grows, you'll need to distribute the product data across several servers and balance the load between them to ensure users get results quickly, even under heavy traffic.

5.5 Caching Frequently Searched Queries

Caching is another effective technique to improve performance. By storing the results of frequently queried terms or phrases, you can reduce the load on your search engine and provide instant responses for popular queries.

Example: You can cache results using Redis or Memcached, which store frequently accessed data in memory for quick retrieval.

By following these optimization techniques, you can ensure that your semantic search engine remains fast, efficient, and scalable even as the volume of data grows. Whether it’s optimizing vector storage, improving search speed, or distributing the load across multiple servers, each of these strategies helps to provide a seamless user experience with fast, accurate search results.


6. Conclusion and Future Improvements

Building a semantic search engine from scratch can seem like a challenging task, but with the right tools and strategies, it’s entirely possible—and incredibly rewarding. In this blog, we’ve covered everything from setting up your initial semantic search engine using sentence embeddings and FAISS for fast and efficient searching, to adding a user-friendly interface using Streamlit. We've also explored optimization techniques for scaling your engine to handle larger datasets while maintaining performance.

6.1 Key Takeaways

  • Semantic Search Engine Basics: We’ve seen how embedding text into vector representations allows a search engine to understand and retrieve content based on meaning rather than keywords. This leads to far more accurate and contextually relevant search results.
  • FAISS and Annoy: These libraries provide powerful solutions for efficiently indexing and searching large datasets, while also offering methods for compression and approximate search, which can drastically improve performance.
  • Streamlit Interface: By integrating a simple web interface using Streamlit, we made the semantic search engine accessible and user-friendly, enabling real-time interactions with the engine.
  • Optimizing for Scale: We also discussed how to optimize your engine for larger datasets using techniques like batching, approximate search, and distributed systems. These methods ensure that the engine can handle millions of documents without sacrificing speed.

6.2 Looking Ahead: The Future of Semantic Search

While we’ve built a solid foundation for a semantic search engine, there’s always room for future improvements and new features. Here are some ideas for what could come next:

6.2.1 Incorporating Context-Aware Search

One area where semantic search can be further enhanced is in incorporating context. For instance, a search query could be influenced not only by the text itself but also by the user’s previous searches or preferences. This creates a more personalized and intuitive experience for the user.

6.2.2 Multilingual Support

Semantic search engines typically work well in a single language, but what about across multiple languages? Integrating multilingual embeddings and fine-tuning your search engine to handle multiple languages can open up opportunities for global scalability.

6.2.3 Integrating with Voice Assistants

Another exciting development would be integrating your search [image1]: data:image/png;base64,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