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 BookDocument { public string Id { get; set; } [SleoIndex("title", 200.0f)] public string Title { get; set; } [SleoIndex("titlelm", 100.0f)] public string TitleLemmas { get; set; } [SleoIndex("author", 10.0f)] public string Author { get; set; } [SleoIndex("genre", 1.0f)] public string Genre { get; set; } } private static Dictionary _titles = new Dictionary { { "66056bc0481e83af64c55022", "Документ без названия" }, { "6605698d481e83af64c45ad7", "На развилке дорог. Часть 2"}, { "660581bc481e83af64cb8b4d", "Паниклав"}, { "66057aa2481e83af64c9bb11", "Князь. Война магов (сборник)"}, { "66057f75481e83af64cb04f7", "Антология севетского детектива-8. Компиляция. Книги 1-17"}, { "66057bd4481e83af64ca0779", "Вор черной масти"}, { "66057247481e83af64c76860", "Выбор"}, { "66056807481e83af64c3a64f", "Последняя лекция"}, { "66057f13481e83af64caed5d", "Оружие Круппа. История династии пушечных королей"}, { "66057a37481e83af64c9a14b", "Месть Черного Дракона"}, { "660588e8481e83af64cd2d3e", "Мгла над старыми могилами"}, { "66056e88481e83af64c64e81", "Кровь и железо"}, { "66057a8e481e83af64c9b673", "Маленькая страна"}, { "6605687d481e83af64c3e360", "Санкт-Петербург – история в преданиях и легендах"}, { "66057987481e83af64c9770c", "Контракт на рабство"}, { "66059052481e83af64cf5e31", "Агент космического сыска"}, { "660580f9481e83af64cb61c9", "Две жизни Алессы Коэн"}, { "66056807481e84af64c3a64f", "Последняя история"}, { "66057f13481e85af64caed5d", "История Китая"}, { "66057a37481e86af64c9a14b", "Время Черного Дракона"}, { "660588e8481e87af64cd2d3e", "Страна которой нет"}, }; static async Task Main(string[] args) { // TestCompression(); // await FillOneFieldIndex(); // await TestSearch(); await TestEngine(); } static async Task TestEngine() { var engine = new SleoEngine(@"H:\Test", b => b.Id); using (var builder = engine.CreateBuilder()) { builder.Write(new[] { new BookDocument{ Id = "01", Title = "Страж птица", }, new BookDocument{ Id = "02" }, new BookDocument{ Id = "03" }, new BookDocument{ Id = "04" }, }); } } static void TestCompression() { 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 FillOneFieldIndex() { var store = new DataStorage(@"H:\TEST"); using (var writer = store.GetWriter("title")) { foreach (var kv in _titles) { var tokens = WordTokenizer.Tokenize(kv.Value); foreach (var t in tokens) { await writer.Write(t, kv.Key); } } await writer.Complete(); } } static async Task TestSearch() { var store = new DataStorage(@"H:\TEST"); var docs = await store.GetDocuments("title", new string[] { "кровь", "страна", "железо", "история", "оружие" }, 1.0f, false); foreach (var kv in docs.OrderByDescending(kv => kv.Value)) { Console.WriteLine($"[{kv.Key}: {kv.Value}] {_titles[kv.Key]}"); } } } }