You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/Tests/Sleopok.Tests/Program.cs

194 lines
9.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<string, string>(s => string.Join(" ", lexProvider.ExtractUniqueLexTokens(s).Select(s => s.Token)));
var engine = new SleoEngine<BookDocumentSimple>(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<string, string>(s => string.Join(" ", lexProvider.ExtractUniqueLexTokens(s).Select(s => s.Token)));
var engine = new SleoEngine<BookDocument>(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}");
}
}
}
}

Powered by TurnKey Linux.