VirtuosoFTS 1.0.10
dotnet add package VirtuosoFTS --version 1.0.10
NuGet\Install-Package VirtuosoFTS -Version 1.0.10
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="VirtuosoFTS" Version="1.0.10" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="VirtuosoFTS" Version="1.0.10" />
<PackageReference Include="VirtuosoFTS" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add VirtuosoFTS --version 1.0.10
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: VirtuosoFTS, 1.0.10"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package VirtuosoFTS@1.0.10
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=VirtuosoFTS&version=1.0.10
#tool nuget:?package=VirtuosoFTS&version=1.0.10
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Virtuoso.Search
A high-performance, embedded full-text search engine for .NET applications.
Features
- Blazing Fast: Optimized native core with BM25 ranking
- Near Real-Time (NRT): Immediate search availability after indexing
- Rich Query DSL: Fluent API for building complex queries
- Aggregations: Terms, Count, Min, Max, Stats, ScoreStats, Distinct
- Multiple Field Types: Text, Keyword, Numeric, DateTime, Boolean, JSON
- Thread-Safe: Safe for concurrent operations
- Dependency Injection: Built-in support for Microsoft.Extensions.DependencyInjection
Installation
dotnet add package Virtuoso.Search
Quick Start
1. Register Services
services.AddVirtuosoSearch(options =>
{
options.IndexPath = "data/search-index";
options.NrtReaderRefreshMs = 100;
});
2. Define Schema and Create Index
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
// Create index
var schema = new Dictionary<string, FieldDefinition>
{
["id"] = new("keyword", true),
["name"] = new("text", true),
["description"] = new("text", true),
["price"] = new("f64", true, false, true),
["category"] = new("keyword", true, true)
};
await searchService.CreateIndexAsync("products", schema);
3. Index Documents
var products = new[]
{
new { id = "1", name = "iPhone 15", description = "Latest Apple smartphone", price = 999.99, category = "Electronics" },
new { id = "2", name = "MacBook Pro", description = "Powerful laptop for professionals", price = 2499.99, category = "Electronics" }
};
await searchService.IndexDocumentsAsync("products", products);
4. Search
// Simple text search
var query = new QueryBuilder()
.Match("name", "iPhone")
.Build();
var results = await searchService.SearchAsync<Product>("products", query, limit: 10);
// Complex query with bool
var query = new QueryBuilder()
.Bool(b => b
.Must(q => q.Match("description", "laptop"))
.Filter(q => q.Term("category", "Electronics"))
.Filter(q => q.Range("price", gte: 1000, lte: 3000))
)
.Build();
Query Types
| Query Type | Description | Example |
|---|---|---|
Match |
Full-text search with analysis | .Match("title", "search query") |
MultiMatch |
Search across multiple fields | .MultiMatch(new[] {"title", "body"}, "query") |
Term |
Exact match (keyword fields) | .Term("status", "active") |
Phrase |
Exact phrase match | .Phrase("title", "hello world") |
Prefix |
Prefix matching | .Prefix("name", "app") |
Fuzzy |
Fuzzy matching with distance | .Fuzzy("name", "iphon", 1) |
Range |
Numeric/date range | .Range("price", gte: 10, lte: 100) |
Bool |
Combine queries | .Bool(b => b.Must(...).Should(...)) |
MatchAll |
Match all documents | .MatchAll() |
Aggregations
var aggs = new AggregationsBuilder()
.Terms("categories", "category", 10)
.Stats("price_stats", "price")
.Build();
var results = await searchService.SearchAsync<Product>("products", query, aggregations: aggs);
foreach (var bucket in results.Aggregations["categories"].Buckets)
{
Console.WriteLine($"{bucket.Key}: {bucket.Count}");
}
License
MIT License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net9.0
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Options (>= 8.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- System.Text.Json (>= 9.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.