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.
Import data using out of box connectors like CSV, SQL etc. Easily write new ones with the plugin model.
Out of box SDKs are available for many popular languages including C#, JavaScript and Typescript. Many more are on way.
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.
All aspects of the system can be configured using easy to understand and consistent REST API.
FlexSearch completely embraces Swagger where all the REST endpoints and DTOs are written in Swagger first. This allows easy integration with existing Swagger ecosystem.
REST is good but can be slow at times. Go super-fast with our binary end points.
Bend the querying system at your will
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.
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.
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.
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.
FlexSearch allows central management of search queries which means easier integration as the calling system does need updating when the query is tweaked.
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.
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.
Flexsearch is released under liberal Apache 2 license and uses all the latest and greatest features of Apache Luceneā¢.
Everything except the kitchen sink
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.
Break large indices into multiple smaller shards to scale for large amont of data.
Optimistic concurrency control ensures data is updated correctly when more than one request comes in for a single document.
Define search time and index analyzers for each field. Further control relevance using per field similarity.
Manage most common aspects of the engine using an easy to use web portal.
View the indexed data and fine tune your queries till you get the right results.
Allows easy integration with other enterprise logging and monitoring tools. All operation messages have unique Event code which allows easy filtering of events.
We are proud to be the first enterprise grade search engine targeting the rich .net eco system.
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')
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)
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')
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 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
}
}
]
}
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.
Matching records are grouped together and presented with the differences highlighted.
After inspection the user can submit notes, review or simply choose the master record among the duplicates