пятница, 27 марта 2015 г.

Dozebsbit 1.0 Release!

Напилил свой поисковый Java-кеш с блекджеком и low-latency. Дал ему чисто русское, православное имя - Dozensbit 
Если у вас много не структурированных данных, и надо очень быстро выполнять по ним поиск, то это то что вам надо.
Пример: Предположим у нас есть объекты с разным количеством атрибутов. По сути schema-less
User0 : {
  Name : John,
  Age : 32,
  City : [Berlin, Dresden],
}

User1 : {
  Name : Ann,
  Gender : female,
  City : NY,
  HasChildren: true
}
А еще нам надо выполнить вот такой поисковый запрос:
SEARCH User WHERE (City = NY OR City = Berlin) AND Gender = female
Всё это возможно.
Cache<string> cache = new IndexedCache<string>();

MultiValueMap attributes1 = new MultiValueMap();
attributes1.put("name", "john");
attributes1.put("age", "32");
attributes1.put("city", "berlin");
attributes1.put("city", "dresden");

cache.put("This is user #1", attributes1);

//А можно для лаконичности использовать Utils.toMap
cache.put("This is user #2", Utils.toMap("{name:ann,gender:female,city:ny}"));

cache.commit();

QueryBuilder builder = cache.createQuery();

QueryBuilder.Query query = builder
                .start("city", "ny")
                .or("city", "berlin")
                .and("gender", "female")
                .get();

List<string> result = cache.find(query);
Но и это еще не всё. Можно выполнять сложные выборки
QueryBuilder.Query query = cache.createQuery()
               .start(
                        cache.createQuery()
                                .start("city", "berlin")
                                .or("city", "moscow")
                                .get()
                ).and(
                        cache.createQuery()
                                .start("lang", "ru")
                                .or("lang", "en")
                                .get()
                )
                .get();

List<string> result = cache.find(query);
Всё это thread-safe и работает в многопоточной среде.
Выборка по миллиону объектов укладывается в 9 мс - в сложном случае, и 2 мс в простом.
Доступно на GitHub https://github.com/2anikulin/dozensbit/wiki
Там же более подробное описание и бенчмарк