Описание RegEx (Divide et Impera) значительно помогло бы ограничить количество документов, необходимых для обработки.
Некоторые идеи в этом направлении:
- RegEx принимая длину (фиксированный, мин, макс)
- POSIX классов стиль символов (
[:alpha:]
, [:digit:]
, [:alnum:]
и т.д.)
- Дерево, подобное Структура документа (umm)
Реализация каждого из них добавит сложности (код и/или ручной ввод) для вставки, а также некоторые накладные расходы для описания searchterm
перед запросом.
Наличие взаимоисключающих типов в категории упрощает вещи, но как насчет между категориями?
300 категории @ 100-150 Regexps/категория =>30к до 45K Regexps
... некоторые, несомненно, будет точные дублироваться, если не большинство из них.
В этом подходе я попытаюсь свести к минимуму общее количество документов, которые будут храниться/запрашиваться в обратном стиле по сравнению с вашей первоначальной предлагаемой «схемой».
Примечание: включены только строки длины в этой демонстрации для сужению, это может прийти естественно для ручного ввода, как это может усилить визуальный контроль над RegEx
Рассмотрим rewiting в regexes
коллекции с документами следующим образом:
{
"max_length": NumberLong(2),
"min_length": NumberLong(2),
"regex": "^[0-9][2]$",
"types": [
"ONE/TYPE1",
"NINE/TYPE6"
]
},
{
"max_length": NumberLong(4),
"min_length": NumberLong(3),
"regex": "^2[4-9][2,3]$",
"types": [
"ONE/TYPE5",
"TWO/TYPE2",
"SIX/TYPE8"
]
},
{
"max_length": NumberLong(6),
"min_length": NumberLong(6),
"regex": "^39[0-9][4]$",
"types": [
"ONE/TYPE3",
"SIX/TYPE2"
]
},
{
"max_length": NumberLong(3),
"min_length": NumberLong(3),
"regex": "^[a-z][3]$",
"types": [
"ONE/TYPE2"
]
}
.. каждый уникальный RegEx, как его собственный документ, имеющий категории он принадлежит (расширяемый нескольким типам в каждой категории)
Демо-код Aggregation:
function() {
match=null;
query='abc';
db.regexes.aggregate(
{$match: {
max_length: {$gte: query.length},
min_length: {$lte: query.length},
types: /^ONE\//
}
},
{$project: {
regex: 1,
types: 1,
_id:0
}
}
).result.some(function(re){
if (query.match(new RegExp(re.regex))) return match=re.types;
});
return match;
}
Вернуться к 'abc'
запроса:
[
"ONE/TYPE2"
]
это будет работать только против этих двух документов:
{
"regex": "^2[4-9][2,3]$",
"types": [
"ONE/TYPE5",
"TWO/TYPE2",
"SIX/TYPE8"
]
},
{
"regex": "^[a-z][3]$",
"types": [
"ONE/TYPE2"
]
}
сужена по длине 3
и имеющий категорию ONE
.
Может быть сужен еще больше за счет реализации POSIX
дескрипторы (легко проверить против searchterm
но должны ввести 2 Regexps в БД)
Как много моделей или типов вы думаете, вы будете иметь: 10, 100, 1000, Больше? –
В среднем я бы сказал около 100 - 150 для каждой категории. – Dan
, но вам нужно только проверить одну категорию на входную строку? –