Одной из возможностей решения этой проблемы является использование Elasticsearch. Я не утверждаю, что это единственное решение, которое у вас есть.
На высоком уровне - вам нужно настроить Elasticsearch и проиндексировать ваши данные. Существуют различные возможности для достижения: монго-разъема , или Logstash и входного плагина JDBC , или даже просто выгрузки данных из MongoDB и помещения их вручную. Нет пределов для этой работы.
Первоначально я хотел бы предложить создать поле tecloc - многозначное поле, заменив {
на [
и добавив некоторые другие поля для строки кода, например:
{
"tech": "NodeJs",
"packagename": "package-name",
"packageversion": "0.0.1",
"total_loc": 474,
"total_files": 7,
"tecloc": [
{
"name": "JavaScript",
"loc": 316
},
{
"name": "Markdown",
"loc": 116
},
{
"name": "JSON",
"loc": 42
}
]
}
Эта модель данных очень тривиальна и, очевидно, имеет некоторые ограничения, но вы уже можете начать с нее и посмотреть, насколько хорошо она подходит для других вариантов использования. Позже вы должны обнаружить вложенный тип как одну из возможностей для более точного воспроизведения ваших данных.
Относительно вашего точного сценария поиска - вы можете искать документы такого типа с запросом, подобным следующему:
{
"query": {
"bool": {
"should": [
{
"term": {
"tecloc.name.keyword": {
"value": "Java"
}
}
},
{
"term": {
"tecloc.name.keyword": {
"value": "Markdown"
}
}
}
],
"must": [
{"range": {
"total_loc": {
"gte": 426,
"lte": 521
}
}}
]
}
}
}
К сожалению, синтаксис с + -10% не поддерживается, поэтому его следует рассчитывать на клиенте.
С другой стороны, я указал, что мы ищем документы, которые должны иметь Java или Markdown, которые также возвращают пример документа. В этом случае, если у меня будет документ с уценкой Java и , оценка этого документа будет выше.