Найти похожие документы / записи в базе данных - PullRequest
0 голосов
/ 13 января 2019

так что у меня есть довольно большое количество записей, которые в настоящее время хранятся в mongodb, каждая выглядит примерно так:

{
    "_id" : ObjectId("5c38d267b87d0a05d8cd4dc2"),
    "tech" : "NodeJs",
    "packagename" : "package-name",
    "packageversion" : "0.0.1",
    "total_loc" : 474,
    "total_files" : 7,
    "tecloc" : {
        "JavaScript" : 316,
        "Markdown" : 116,
        "JSON" : 42
    }
}

То, что я хочу сделать, - это найти похожие записи данных, например, на основе записей, которые имеют (+/- 10%) количество total_loc или использовать некоторые из тех же технологий (tecloc).

Можно ли как-то сделать это с помощью запроса к mongodb или есть технология, которая лучше подходит для того, что я хочу сделать? Я в порядке с восстановлением данных и сохранением их, например, в упругом или некотором графе-дБ.

Спасибо :)

1 Ответ

0 голосов
/ 13 января 2019

Одной из возможностей решения этой проблемы является использование 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 и , оценка этого документа будет выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...