Grails 2.3.7 Rest API — поиск/запрос

Я использую Grails 2.3.7. Я представил свой контроллер как контроллер REST, перейдя через интерфейс контроллера restfull. Мой клиент — AngularJS. Мои операции CRUD работают нормально. Теперь у меня есть требование написать поисковый API для различных объектов, таких как поиск по имени и номеру учетной записи или поиск объекта клиента по электронной почте клиента.

Каким должен быть эффективный и лучший способ написать такой поисковый API? Я могу написать API для каждого критерия поиска, но ищу что-то общее, где критерий поиска можно опубликовать как JSON и применить к соответствующему объекту ресурса. Есть ли такой общий способ реализовать это?

Джей


person jd.tech20    schedule 31.03.2014    source источник
comment
Может быть интересно использовать плагин Elastic Search или плагин Elastic Search GORM.   -  person dmahapatro    schedule 31.03.2014


Ответы (2)


Для Grails 3.0.8+ вы можете попробовать этот grails-restsearch-plugin.

Он использует GORM по умолчанию (не нужно использовать SOLR, ES или другие поисковые системы) Добавляет REST и возможности поиска в проект, но вы можете игнорировать часть REST и использовать только поиск

person Daniel Ribeiro    schedule 14.10.2015

Я думаю, что проблема здесь в том, что поиск — довольно большое поле.

Если вам нужны настоящие функции поиска, вам обязательно следует обратиться к стороннему поисковому серверу, такому как solr или elasticsearch и соответствующие подключаемые модули Grails. Эти продукты создают отдельный индекс из ваших данных и предоставляют такие функции, как фасетный поиск, варианты правописания для ввода запроса, выделение результатов и многое другое (и они легко масштабируются).

Однако, поскольку вы упомянули, что не хотите использовать сторонние библиотеки, возможно, вы ищете что-то гораздо более простое.

Очень простое решение вашей проблемы может быть примерно таким:

class CustomerController extends RestfulController {

  ...

  def search(String property, String value) {
    respond Customer.createCriteria().list {
      like property, "%$value%"
    }
  }
}

При этом создается запрос критериев Gorm, который запрашивает Customer объектов с поле, которое соответствует условию, подобному SQL.

Вызов этого действия с URL-адресом, например

/customer/search?property=lastname&value=foo

вернет всех клиентов с lastname, который содержит foo.

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

def searchWithClass(String className, String property, String value) {
  def domainClass = grailsApplication.getDomainClass(className).clazz
  respond domainClass.createCriteria().list {
    like property, "%$value%"
  }
}

Теперь вы можете передать класс домена, который хотите запросить, используя параметр className:

.../searchWithClass?property=lastname&value=foo&className=foo.bar.Customer

Но имейте в виду некоторые вещи при использовании такого подхода:

  • производительность запросов SQL like может быть не самой лучшей (особенно если у вас очень большие текстовые поля)
  • Таким образом вы можете запрашивать только поля String. Для других типов данных, таких как числа или даты, вам нужно другое решение.
  • Обязательно проверьте и ограничьте параметры поиска. В противном случае можно запросить каждый класс домена в вашем приложении.
person micha    schedule 28.05.2014