LIFTI custom query wildcard parser

CSharp · Console

/Program.cs

using System;
using Lifti;
using Lifti.Querying;
using Lifti.Querying.QueryParts;
using Lifti.Tokenization;
using System.Threading.Tasks;
using System.Collections.Generic;
					
public class Program
{
	public static async Task Main()
	{
		var index = new FullTextIndexBuilder<string>()
						.WithDefaultTokenization(o => o.CaseInsensitive())
						.WithQueryParser(new CustomWildcardQueryParser())
						.Build();

		index.BeginBatchChange();
		await index.AddAsync("QueryPart", "QueryPart");
		await index.AddAsync("ExactWordQueryPart", "ExactWordQueryPart");
		await index.AddAsync("FuzzyMatchQueryPart", "FuzzyMatchQueryPart");
		await index.AddAsync("FullTextIndex", "FullTextIndex");
		await index.AddAsync("IFullTextIndex", "IFullTextIndex");
		await index.CommitBatchChangeAsync();

		foreach (var item in index.Search("fti"))
		{
			Console.WriteLine(item.Key);
		}
	}
}

public class CustomWildcardQueryParser : IQueryParser
{
    public IQuery Parse(IIndexedFieldLookup fieldLookup, string queryText, ITokenizer tokenizer)
    {
        // Use the default tokenizer to normalize the text so it's the same as in the index
        queryText = tokenizer.Normalize(queryText);

        var queryFragments = new List<WildcardQueryFragment>();

        // Add the leading multi-character match
        queryFragments.Add(WildcardQueryFragment.MultiCharacter);

        // Add each character in the query text, with a trailing multi-character match
        foreach (var letter in queryText)
        {
            queryFragments.Add(WildcardQueryFragment.CreateText(letter.ToString()));
            queryFragments.Add(WildcardQueryFragment.MultiCharacter);
        }

        // Compose the final query
        return new Query(new WildcardQueryPart(queryFragments));
    }
}
;