Я думаю, что проблема здесь в том, что поиск — довольно большое поле.
Если вам нужны настоящие функции поиска, вам обязательно следует обратиться к стороннему поисковому серверу, такому как 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