12. Хранение данных
Не специализированные, например поверх
реляционной БД
● Можно индексировать служебную
информацию
● Транзакции SQL
ⱠKey
Value
Version
LastModified
ETag
13. Индексация и Поиск
● Lucene / Lucene.NET
○ Apache License 2.0
○ Можно встраивать
○ Быстро работает, требует мало памяти
● Sphinx
○ GPLv2
○ Отдельный сервер
14. Индексация и Поиск
Lucene индексирует документы
{
“Field1” -> [“Value1”]
“Field2” -> [“Value2.1”,“Value2.2”]
}
15. Индексация и Поиск
Lucene поддерживает запросы вида:
*:* MatchAllDocsQuery
Field:Value TermQuery
Field:[A to B] TermRangeQuery
Field:[1 to 10] NumericRangeQuery
Field:Val* PrefixQuery
Field1:A -Field2:B BooleanQuery
и другие ...
16. Совмещаем индекс и хранилище
1. Серилизатор превращает объекты в коде
в бинарный вид
Serializer
Key → Value
17. Совмещаем индекс и хранилище
2. Конвертер делает из объектов в коде
документы Lucene
Serializer
Key → Value
Document
Converter
Lucene
18. Совмещаем индекс и хранилище
3. Общая прослойка синхронизирует
операции индексации и сохранения
Serializer
Key → Value
Document
Converter
Lucene
Repository
19. Совмещаем индекс и хранилище
Это становится похоже на БД.
Только не хватает яызка запросов :)
Serializer
Key → Value
Document
Converter
Lucene
Repository
21. Формирование запросов
C# позволяет писать в коде выражения
которые можно обрабатывать как деревья
Expression<Func<Args, Doc,
bool>> q =
((a, d) => !string.IsNullOrEmpty(d.
Value));
23. Формирование запросов
Пример запроса, который всегда возвращает
true
QueryExpressionVisitor
(Document d, Arguments a)
=>
true
(Document d, Arguments a)
=>
new MatchAllDocsQuery()