Flexible & Fast .net
Search Engine

Download FlexSearch
FlexSearch query test tool

Why FlexSearch?

Slowly learn your way up to being a search expert.

  • Get desired results without being a search expert
  • Configure through REST web services, portal or file editing
  • Simple to use and easy to setup.
  • Easy integration with other systems using SDKs
Get started now

Index Management UI

Create, edit and quickly populate indices.

In under 1 minute using the Index Management UI you can:

  • Create an index,
  • configure it,
  • populate it,
  • and search it as well !!

Customizability

Customize all aspects of the system

Advance text analysis

Define custom analyzers per field to tackle difficult data. Custom analyzers can be defined using a combination of built in Tokenizers and Filters. Have separate search and index time analyzers per field.

Connectors

Import data using out of box connectors like CSV, SQL etc. Easily write new ones with the plugin model.

SDKs

Out of box SDKs are available for many popular languages including C#, JavaScript and Typescript. Many more are on way.

Plugin model

Extendible plugin model which allows adding of new HTTP endpoints, connectors or completely new functionality. Background duplicate match is a totally standalone application build using the connector model.

REST API

All aspects of the system can be configured using easy to understand and consistent REST API.

Swagger Support

FlexSearch completely embraces Swagger where all the REST endpoints and DTOs are written in Swagger first. This allows easy integration with existing Swagger ecosystem.

Binary support for better throughput

REST is good but can be slow at times. Go super-fast with our binary end points.

Expressivity

Bend the querying system at your will

Powerful Search DSL

Exploit Lucene without being a search expert. Use advance search features with ease using our intuitive search DSL. Search functions are easy to understand and comes with switches to modify the behaviour. For example: AllOf, AnyOf etc.

Powerful duplicate detection DSL

The DSL is designed from ground up to be used as part of a configurable duplicate detection language. There is built in support to ignore a search condition if the relevant data is not present or to use a default value. These features gives the user a powerful base to build sophisticated duplicate detection criteria.

Duplicate detection Engine and UI to identify duplicates

FlexSearch comes with a build in duplicate detection UI which allows a user to visually setup duplicate detection jobs and later on investigate the returned duplicates.

Define custom search functions and switches

Due to the extensible nature it is easy to define new search functions to cater to specific cases. For example one may easily add `InLastXMinutes` function to date time field type. Such functions gives semantic meaning to a search query.

Predefined Queries to simplify integration

FlexSearch allows central management of search queries which means easier integration as the calling system does need updating when the query is tweaked.

F# based scripting support

F# is a terse and easy to use programming language. FlexSearch provides powerful scripting capabilities to fine tune query or data at various stages in the search and index pipeline. F# is a compiled language so no need to worry about script performance.

Control relevance through scripting

Search relevance can be tricky to get right. Due to the supported scripting model it is easy to filter out results or boost search terms or apply custom logic etc.

and did we mention it's open source and is written in F#.

Flexsearch is released under liberal Apache 2 license and uses all the latest and greatest features of Apache Lucene™.

And many more features...

Everything except the kitchen sink

Transaction log support

Write ahead transaction log ensures that data is never lost even in case of server failure. Any data received is first written to the log before indexing.

Sharding

Break large indices into multiple smaller shards to scale for large amont of data.

Concurrency Control

Optimistic concurrency control ensures data is updated correctly when more than one request comes in for a single document.

Per field similarity & analysis support

Define search time and index analyzers for each field. Further control relevance using per field similarity.

Web Portal

Manage most common aspects of the engine using an easy to use web portal.

Search Studio

View the indexed data and fine tune your queries till you get the right results.

Windows service & Event Log support

Allows easy integration with other enterprise logging and monitoring tools. All operation messages have unique Event code which allows easy filtering of events.

The only .net solution in the market

We are proud to be the first enterprise grade search engine targeting the rich .net eco system.

Search Examples

Searching is simple due to an expressive syntax which hides the implementation details from the user and allows writing Lucene queries without being a search expert.

Support for all general constructs like Paging, Count, DistinctBy, Filtering etc.

Use of single quote as a marker to help in producing cleaner json without escaping.

GET /indices/country/search?q={query} HTTP/1.1
allOf(countryName, 'United', 'Kingdom')

Control with query switches

Pass switches as part of queries to subtly modify the search criteria.

The first clause will not contribute to the final score as we have applied -noScore switch.

allOf(countryName, 'United', 'Kingdom', -noScore) AND anyOf(countryName, 'France', 'Germany')

phraseMatch is used for matching exact phrases but by using a -slop '2' switch, we can match tokens up to two word apart.

phraseMatch(governmentType, 'parliamentary democracy', -slop '2')

The adjacent query will match all phrases containing parliamentary democracy, parliamentary system and parliamentary constitutional.

phraseMatch(governmentType, 'parliamentary', 'democracy system constitutional', -multiphrase)

Pre-Defined Queries

Centrally manage queries using predefined queries thus enabling easy management and integration with other systems. Pass the name of the query along with the variables to execute the query.

GET /indices/country/search?q={query} HTTP/1.1
{
"PredefinedQuery": "searchCountryByName",
"Variables": { "countryName": "United Kingdom" }
}

Fine grained control over missing values in queries using matchAll, matchNone and useDefault.

The adjacent query will use a default value of France if no countryName variable is defined.

allOf(countryName, @countryName, -useDefault 'France')

API Examples

Creating Index

Creating a new index is simple using REST API. There are a lot of other parameters which can be defined like scripts, analyzers etc.

POST /indices HTTP/1.1
{
"IndexName": "contact",
"Fields": [
    {"FieldName": "firstname"},
    {"FieldName": "lastname"}
],
"Online": false
}

Creating Analyzer

Creating custom analysis chain is simple using the REST APIs. Design your own analyzer using any of the predefined tokenizers and filters.

The adjacent filter strips all non-numeric characters from the input.

GET /analyzers/striptonumbersanalyzer HTTP/1.1
{
"AnalyzerName": "striptonumbersanalyzer",
"Tokenizer": {
    "TokenizerName": "keywordtokenizer",
    "Parameters": {}
},
"Filters": [
    {
        "FilterName": "standardfilter",
        "Parameters": {}
    },
    {
        "FilterName": "patternreplacefilter",
        "Parameters":
        {
            "pattern": "[a-z$ ]",
            "replacementtext": null
        }
    }
    ]
}

Duplicate Detection Tool

Identify

The duplicate detection tool allows users to find duplicates in their indices.

It works by submitting a Predefined Query to search against each record in an index.

Compare

Matching records are grouped together and presented with the differences highlighted.

Review & Process

After inspection the user can submit notes, review or simply choose the master record among the duplicates

FlexSearch query test tool

Our Supporters