using Iveonik.Stemmers; using ZeroLevel; using ZeroLevel.Services.FileSystem; using ZeroLevel.Services.Semantic; using ZeroLevel.Services.Serialization; using ZeroLevel.Sleopok.Engine; using ZeroLevel.Sleopok.Engine.Models; using ZeroLevel.Sleopok.Engine.Services; using ZeroLevel.Sleopok.Engine.Services.Storage; namespace Sleopok.Tests { internal class Program { public sealed class BookDocumentSimple { public string Id { get; set; } [SleoIndex("title", 10.0f, avaliableForExactMatch: true)] public string Title { get; set; } [SleoIndex("author", 10.0f, avaliableForExactMatch: true)] public string Author { get; set; } } public sealed class BookDocument { public string Id { get; set; } [SleoIndex("title", 10.0f, avaliableForExactMatch: true)] public string Title { get; set; } [SleoIndex("stemms", 2.0f)] public string Stemms { get; set; } [SleoIndex("author", 10.0f, avaliableForExactMatch: true)] public string Author { get; set; } } static async Task Main(string[] args) { //TestCompression(); // await TestSearch(); // await TestEngine(); await TestEngineReadWrite(); } static async Task TestEngineReadWrite() { ILexProvider lexProvider = new LexProvider(new RussianStemmer()); var tempFolder = Path.Combine(Configuration.BaseDirectory, "SleoTestStorage"); FSUtils.CleanAndTestFolder(tempFolder); var lex = new Func(s => string.Join(" ", lexProvider.ExtractUniqueLexTokens(s).Select(s => s.Token))); var engine = new SleoEngine(tempFolder, b => b.Id); using (var builder = engine.CreateBuilder()) { await builder.Write(new[] { //new BookDocument { Id = "01", Title = "Юность Пушкина", Author = "Егорова Елена", Stemms = lex("Юность Пушкина") }, new BookDocumentSimple { Id = "01", Title = "Стихи Не Для Дам", Author = "Пушкин Александр Сергеевич" }, new BookDocumentSimple { Id = "02", Title = "Светлинен стих", Author = "Азимов Айзък" }, }); } var reader = engine.CreateReader(); var result = await reader.Search(new[] { "стихи", "пушкина" }, false); foreach (var pair in result) { Console.WriteLine($"[{pair.Key}]: {pair.Value}"); } //await foreach (var fieldRecords in reader.GetAll()) //{ // Console.WriteLine(fieldRecords.Field); //} } static async Task TestEngine() { ILexProvider lexProvider = new LexProvider(new RussianStemmer()); var tempFolder = Path.Combine(Configuration.BaseDirectory, "SleoTestStorage"); FSUtils.CleanAndTestFolder(tempFolder); var lex = new Func(s => string.Join(" ", lexProvider.ExtractUniqueLexTokens(s).Select(s => s.Token))); var engine = new SleoEngine(tempFolder, b => b.Id); using (var builder = engine.CreateBuilder()) { await builder.Write(new[] { new BookDocument{ Id = "01", Title = "Юность Пушкина", Author = "Егорова Елена", Stemms = lex("Юность Пушкина") }, new BookDocument{ Id = "02", Title = "Детство Александра Пушкина", Author = "Егорова Елена Николаевна", Stemms = lex("Детство Александра Пушкина") }, new BookDocument{ Id = "03", Title = "Избранные стихи", Author = "Александра Пушкина", Stemms = lex("Избранные стихи") }, new BookDocument{ Id = "04", Title = "Анализ стихотворений Александра Сергеевича Пушкина", Author = "Ланцов Михаил", Stemms = lex("Анализ стихотворений Александра Сергеевича Пушкина") }, new BookDocument{ Id = "05", Title = "Море обаяния", Author = "Искандер Фазиль", Stemms = lex("Море обаяния") }, new BookDocument{ Id = "06", Title = "«Какаду»", Author = "Клысь Рышард", Stemms = lex("«Какаду»") }, new BookDocument{ Id = "07", Title = "Ряд случайных чисел [СИ]", Author = "Павлова Елена Евгеньевна", Stemms = lex("Ряд случайных чисел [СИ]") }, new BookDocument{ Id = "08", Title = "Последняя любовь. Плен и свобода", Author = "Мятная Витамина", Stemms = lex("Последняя любовь. Плен и свобода") }, new BookDocument{ Id = "09", Title = "Золотой ус. Лучшие рецепты исцеления", Author = "Альменов Чингиз", Stemms = lex("Золотой ус. Лучшие рецепты исцеления") }, new BookDocument{ Id = "10", Title = "Пушки смотрят на восток", Author = "Ефимова Марина Михайловна", Stemms = lex("Пушки смотрят на восто") }, new BookDocument{ Id = "11", Title = "Чингиз Хан, становление", Author = "Пушной Виталий", Stemms = lex("Чингиз Хан, становление") }, }); } var reader = engine.CreateReader(); var result = await reader.Search(new[] { "Елена", "Евгеньевна" }, false); foreach (var pair in result) { Console.WriteLine($"[{pair.Key}]: {pair.Value}"); } } static void TestCompression() { var one_zip = Compressor.Compress(new[] { "02" } ); var one_unzip = Compressor.DecompressToDocuments(one_zip); var strings = new string[] { string.Empty, "doc1", "doc2", "", " ", "\r\n", "last", "doc3", "doc4", "doc5", "doc6", "doc7", "doc8", "doc9", "doc10", }; var clearbytes = MessageSerializer.SerializeCompatible(strings).Length; var compressed = Compressor.Compress(strings); Console.WriteLine($"{compressed.Length} / {clearbytes} bytes"); var decomressed = Compressor.DecompressToDocuments(compressed); int index = 0; foreach (var s in decomressed) { if (!(string.IsNullOrEmpty(s) && string.IsNullOrEmpty(strings[index])) && 0 != string.CompareOrdinal(strings[index], s)) { Console.WriteLine($"Got {s}. Expected {strings[index]}"); } index++; } } static async Task TestSearch() { var tempFolder = Path.Combine(Configuration.BaseDirectory, "SleoTestStorage"); FSUtils.CleanAndTestFolder(tempFolder); var store = new DataStorage(tempFolder); using (var writer = store.GetWriter("author")) { await writer.Write("Козлов Игорь", "1"); await writer.Write("Ермакова Светлана Евгеньевна", "2"); await writer.Write("Муркок Майкл Лаумер Кейт Пик Мервин Ле Гуин Урсула Дилэни Сэмюэль Баллард Джеймс Грэм Эллисон Харлан Диксон Гордон Нивен Ларри Корнблат Сирил М Вульф Джин Лейбер Фриц Ройтер", "3"); await writer.Write("Коллектив Авторов", "4"); await writer.Write("Боннэр Елена Георгиевна", "5"); await writer.Write("Звёздкина Анна ", "6"); await writer.Complete(); } using (var writer = store.GetWriter("title")) { await writer.Write("Подкова на счастье", "1"); await writer.Write("Среднеазиатская овчарка", "2"); await writer.Write("Багряная игра. Сборник англо-американской фантастики", "3"); await writer.Write("Управление проектами. Фундаментальный курс", "4"); await writer.Write("Постскриптум: Книга о горьковской ссылке", "5"); await writer.Write("Фарватер", "6"); await writer.Complete(); } var docs = await store.GetDocuments("title", new string[] { "Подкова на счастье" }, 1.0f, false); foreach (var kv in docs.OrderByDescending(kv => kv.Value)) { Console.WriteLine($"[ID] = {kv.Key}: {kv.Value}"); } } } }