Как выполнить поиск по динамическому полю и сначала отсортировать лучший результат соответствия в MongoDB

#mongodb #mongoose #mongodb-query #aggregation-framework #spring-data-mongodb

Вопрос:

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

 [
   {
      "cat_id":1,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_type":"A",
      "description":"Mens Upper Shirt"
   },
   {
      "cat_id":2,
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_type":"A",
      "description":"Shirt"
   },
   {
      "cat_id":3,
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat_type":"Women Top wear",
      "description":"cloths"
   },
   {
      "cat_id":4,
      "categoryCode":"categoryCode4",
      "categoryName":"categoryName4",
      "cat_type":"A",
      "description":"Women"
   }
]
 

если поиск=»Рубашка», то ответ будет:

 [
   {
      "cat_id":2,
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_type":"A",
      "description":"Shirt"
   },
   {
      "cat_id":1,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_type":"A",
      "description":"Mens Upper Shirt"
   }
]
 

если поиск=»Женская верхняя одежда», то ответ будет :

 [
   {
      "cat_id":3,
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat_type":"Women Top wear",
      "description":"cloths"
   },
   {
      "cat_id":4,
      "categoryCode":"categoryCode4",
      "categoryName":"categoryName4",
      "cat_type":"A",
      "description":"Women"
   }
]
 

при любом вводе, который вам нужно выполнить, он проверит, существует ли это значение во всех 5 атрибутах, если оно существует, затем вернет этот документ и отсортирует по наилучшему совпадению

Ответ №1:

Вы используете для этого неправильную базу данных, Mongo не является поисковой системой, и, следовательно, использование ее для этих целей всегда будет иметь свои пределы. Я рекомендую вам рассмотреть более подходящее решение, такое как elasticsearch или поиск по атласу монго.

Самая большая проблема с использованием Mongo для этого-ваше требование:

сортировка по лучшему совпадению

Что именно определяет наилучшее соответствие? в поисковых системах, которые я предлагаю, есть встроенный механизм подсчета очков для таких вещей. но если мы собираемся сделать это в Монго, вам придется самостоятельно определить логику, которая в основном равна построению всего метода подсчета очков для базы данных ( что непростая задача, если вы хотите, чтобы она была стабильной и успешной ).

Я не буду утруждать себя добавлением кода puesdo к этому, так как я не советую этого делать, но, как вы упомянули, вам в основном нужно выполнять поиск по регулярным выражениям. после того, как вы сопоставили документы, остаются только вычисления баллов на основе логики, которую вы хотите определить для сортировки «лучшего» соответствия.