using System.Threading.Tasks;
public static async Task Main()
var index = await CreateAndPopulateTestIndex();
var results = index.Search("item ~> ((1 ~ 2) | (6 & 7))", QueryExecutionOptions.IncludeExecutionPlan);
var executionPlan = results.GetExecutionPlan();
var rootNode = executionPlan.Root;
void PrintNodeDetails(QueryExecutionPlanNode node, string indent = "")
Console.Write($"{indent}#{node.ExecutionOrder} ");
if (node.Kind == QueryExecutionPlanNodeKind.QueryPart)
Console.Write($"Searching: {node.Text}");
Console.Write($"{node.Kind} {node.Text}");
Console.WriteLine($" - Docs: {node.ResultingDocumentCount}, Timing: {node.InclusiveTiming.TotalMilliseconds}ms ({node.ExclusiveTiming.TotalMilliseconds}ms exc.)");
if (node.Children is var (left, right))
PrintNodeDetails(left, indent + " ");
PrintNodeDetails(right, indent + " ");
PrintNodeDetails(rootNode);
private static async Task<FullTextIndex<int>> CreateAndPopulateTestIndex()
var index = new FullTextIndexBuilder<int>()
index.BeginBatchChange();
for (var i = 0; i < 20; i++)
await index.AddAsync(i, $"item {i} {i + 1} {i + 2}");
await index.CommitBatchChangeAsync();