Skip to content

andrewjsaid/autypo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

⚡ Autypo

Downloads Build License: MIT

Typo-tolerant, in-memory autocomplete for .NET

string[] recipes = [
        "Easy chicken broth soup base recipe",
        "Vegetable noodle soup (chicken optional)",
        "Chicken noodle soup (classic homemade recipe)",
        "Beef noodle soup recipe (Chinese Lanzhou style)"
    ];

var found = recipes.Search("Chicen So"); // 👈 user types this

Console.WriteLine(found.FirstOrDefault());

// → "Chicken noodle soup (classic homemade recipe)"

✨ Getting Started

✅ Just Search

Autypo works out-of-the-box using a LINQ-style Search extension method without any configuration. The sensible defaults can be overridden.

✅ Pre-Indexed Setup — In 5 Seconds

To make repeated queries against the same data, you'll want to index your collection ahead of time. This is how to get intelligent completions in such a case.

string[] movies = [
    "The Lord of the Rings: The Return of the King",
    "Star Wars: Return of the Jedi",
    "Batman Returns"
];

var index = movies.ToAutypoComplete();

IEnumerable<string> suggestions = index.Complete("retur of the");
// → "Star Wars: Return of the Jedi"
// + "The Lord of the Rings: The Return of the King"

suggestions = index.Complete("bamman rets");
// → "Batman Returns"

No tokenization setup. No fuzzy matching config. Just smart results.

✅ ASP.NET Core Setup with Background Indexing

For real-world apps, Autypo integrates seamlessly with ASP.NET Core and supports background indexing, multi-field search, and dependency-injected data sources.

using Autypo;
using Autypo.AspNetCore;
using Autypo.Configuration;

builder.Services.AddScoped<ProductsLoader>();

builder.Services.AddAutypoSearch<Product>(config => config
    .WithDataSource(serviceProvider => serviceProvider.GetRequiredService<ProductsLoader>())
    .WithBackgroundLoading(UninitializedBehavior.ReturnEmpty)

    .WithIndex(product => product.Name, index => index
        .WithAdditionalKeys(product => [product.Description]) // Index name + description
        .WithUnorderedTokenOrdering() // Order of words doesn't matter
        .WithPartialTokenMatching() // Partial queries still match
        // ... and many more configuration options!
    ));

Define a search endpoint using dependency-injected Autypo:

app.MapGet("/products/search", async (
    [FromQuery] string query,
    [FromServices] IAutypoSearch<Product> search) =>
{
    var results = await search.SearchAsync(query);
    return results.Select(r => r.Value);
});

Example Query:

GET /products/search?query=fngerprint usb recogn

Example Result:

[
 {
   "code": "A1067",
   "name": "Fingerprint USB",
   "description": "Secure USB flash drive with fingerprint encryption"
 },
]

📚 Table of Contents


📦 Installation

Autypo Autypo.AspNetCore

Autypo is available on NuGet.

For ASP.NET Core integration (includes the core engine):

dotnet add package Autypo.AspNetCore

For standalone or non-web scenarios (e.g., console apps, background jobs):

dotnet add package Autypo

💡 Features

Autypo gives you fast, typo-tolerant search with modern developer ergonomics — zero config to start, but extreme tuning if you need it.

🧠 Intelligent Matching

  • Typo-tolerant by default — fuzzy, partial, and out-of-order input
  • Token-level matching control (prefix, fuzziness)
  • Opt-in partial matching and out-of-order input
  • Built to rank “real world” input
  • Multi-index support with priority-based short-circuiting

🔧 Deeply Configurable

  • Index multiple fields (e.g. name + description)
  • Plug in custom scorers, filters, and match policies
  • Add tokenizers and analyzers (N-grams, stemming, etc)
  • Per-query tuning for fuzziness, partial match, max results

⚙️ Production-Ready

  • Blazing-fast in-memory autocomplete via IAutypoComplete
  • Full-featured, multi-index search engine via IAutypoSearch<T>
  • Eager, background, or lazy indexing — your choice
  • Refresh indexes at runtime with AutypoRefreshToken
  • Async-first, thread-safe, allocation-conscious

🌐 Framework-Friendly

  • ASP.NET Core integration with full DI support
  • Blazor Server–ready (ideal for typeahead inputs)
  • Fully .NET-native — no native bindings, no hosted servers

⚠️ Limitations

Autypo is intentionally designed for short-text and autocomplete scenarios — not full-text search.

  • Documents are limited to 64 tokens max (e.g., product names, commands, short descriptions)
  • In-memory indexing is fast and efficient, but may not suit massive corpora or multi-megabyte documents
  • Autypo is not intended for long-form text search — for that, consider other tools.

This tradeoff is deliberate: it keeps Autypo incredibly fast, predictable, and ideal for UX-critical search.


🎯 Perfect For

  • E-commerce product & SKU search
  • Admin panel filtering and form helpers
  • Smart command palettes
  • CLI "Did You Mean?" suggestions
  • Blazor autocomplete inputs
  • Live-search over reference data (countries, tags, part numbers)
  • Fuzzy full-text matching over short documents

📚 Learning Resources

📖 Guides

Guide Description
ASP.NET Core Integration End-to-end setup with dependency injection and hosted services
Indexing & Data Loading Data sources, refresh tokens
Search & Matching Customize fuzzy logic, token ordering and more
Text Analysis & Tokenization Configure tokenizers, transformers, and analyzers
Custom Scoring & Filtering Enrich matches with metadata and business logic

💻 Samples

Sample What it demonstrates
"Did You Mean?" Console Demo Interactive CLI Helper – Suggests valid commands with fuzzy matching
ASP.NET Core Search API Product Search – REST API with background indexing and multi-field matching
Blazor City Autocomplete Real-Time Search UI – Typeahead with typo tolerance and reindexing

📊 Benchmarks

For short-string autocomplete, Lucene is overkill — heavy setup, broad scope, and tuned for documents you don't have. Autypo matches its fuzzy quality on this workload with a single NuGet install and zero configuration.

Library Multi-Token Index Time Search Time Avg/Search
Autypo ✅ Yes 163 ms 3.34 s 1.33 ms
Lucene (Fuzzy) ✅ Yes 776 ms 2.91 s 1.16 ms
Lucene (Suggest) ❌ No 1.12 s 503 ms 0.20 ms
Levenshtypo* ❌ No 25 ms 312 ms 0.12 ms
FuzzyWuzzy ❌ No 1 ms 4m 49s 92.56 ms

* Levenshtypo is the fuzzy string search library that powers Autypo’s low-level approximate matching engine. It supports typo-tolerant single-token search using optimized Tries and Levenshtein Automata.

⚠️ See full benchmark repo and disclaimer →


📁 Project Structure

/src
  └── Autypo/                   # Core library
  └── Autypo.AspNetCore/        # ASP.NET Core integration
  └── Autypo.Benchmarks/        # Microbenchmarks
  └── Autypo.IntegrationTests/
  └── Autypo.UnitTests/
  └── Autypo.Aot/               # Ensures that Autypo works in AOT scenarios
  
/samples
  └── ApiSearchProducts/        # REST API example
  └── BlazorCities/             # Blazor Server autocomplete
  └── ConsoleDidYouMean/        # CLI demo

💬 Support and Feedback

🧠 Have a question?
💡 Got feedback?
🐛 Found a bug?

Open an issue or start a discussion. We'd love to hear from you.


⚖️ License

Autypo is released under the MIT License.


🙋‍♂️ What's in a Name?

Autocomplete + Typo-tolerance = Autypo.

Simple name, serious power.

Try it: dotnet add package Autypo