A search index plugin for Workflow Core backed by Elasticsearch, enabling you to index your workflows and search against the data and state of them.
Install the NuGet package "WorkflowCore.Providers.Elasticsearch"
Using Nuget package console
PM> Install-Package WorkflowCore.Providers.Elasticsearch
Using .NET CLI
dotnet add package WorkflowCore.Providers.Elasticsearch
Use the .UseElasticsearch
extension method on IServiceCollection
when building your service provider
using Nest;
...
services.AddWorkflow(cfg =>
{
...
cfg.UseElasticsearch(new ConnectionSettings(new Uri("http://localhost:9200")), "index_name");
});
Inject the ISearchIndex
service into your code and use the Search
method.
Search(string terms, int skip, int take, params SearchFilter[] filters)
A whitespace separated string of search terms, an empty string will match everything. This will do a full text search on the following default fields
- Reference
- Description
- Status
- Workflow Definition
In addition you can search data within your own custom data object if it implements ISearchable
using WorkflowCore.Interfaces;
...
public class MyData : ISearchable
{
public string StrValue1 { get; set; }
public string StrValue2 { get; set; }
public IEnumerable<string> GetSearchTokens()
{
return new List<string>()
{
StrValue1,
StrValue2
};
}
}
Search all fields for "puppies"
searchIndex.Search("puppies", 0, 10);
Use skip
and take
to page your search results. Where skip
is the result number to start from and take
is the page size.
You can also supply a list of filters to apply to the search, these can be applied to both the standard fields as well as any field within your custom data objects.
There is no need to implement ISearchable
on your data object in order to use filters against it.
The following filter types are available
- ScalarFilter
- DateRangeFilter
- NumericRangeFilter
- StatusFilter
These exist in the WorkflowCore.Models.Search
namespace.
Filtering by reference
using WorkflowCore.Models.Search;
...
searchIndex.Search("", 0, 10, ScalarFilter.Equals(x => x.Reference, "My Reference"));
Filtering by workflows started after a date
searchIndex.Search("", 0, 10, DateRangeFilter.After(x => x.CreateTime, startDate));
Filtering by workflows completed within a period
searchIndex.Search("", 0, 10, DateRangeFilter.Between(x => x.CompleteTime, startDate, endDate));
Filtering by workflows in a state
searchIndex.Search("", 0, 10, StatusFilter.Equals(WorkflowStatus.Complete));
Filtering against your own custom data class
class MyData
{
public string Value1 { get; set; }
public int Value2 { get; set; }
}
searchIndex.Search("", 0, 10, ScalarFilter.Equals<MyData>(x => x.Value1, "blue moon"));
searchIndex.Search("", 0, 10, NumericRangeFilter.LessThan<MyData>(x => x.Value2, 5))