Механизм поиска Грааля - PullRequest
0 голосов
/ 17 июня 2011

Для моего веб-сайта мне нужно создать механизм поиска, в котором некоторые поля ввода будут такими: Страна, Город, Между датами (с полем года или без него), Ключевые слова и т. Д. И т. Д.

Моя проблема в том, что пользователь должен решить, что он хочет искать. Например, если они хотят ввести только дату, или дату и город, или город и ключевое слово ... и т. Д. Я действительно не знаю, как это сделать, я имею в виду, я знаю, как искать одну вещь за раз, но я Я не уверен, как это сделать все в одном.

a) Нужно ли мне что-то вроде этого: (if-else, if-else) и чем написать код для каждой комбинации, или есть более простой способ сделать это?

b) Кстати, мой механизм поиска сделан следующим образом (я никогда раньше не делал механизм поиска, поэтому я не знаю, будет ли это лучший подход, оценил бы здесь некоторые комментарии и предложения):

  class book{
    String a
    String b
    ...
    Date z

    String allAttributesTogether() {
    a + b + c + ... + z
    }

    }

затем в моем контроллере я делаю двойное вычисление и сопоставляю введенные слова для поиска и результата allAttributesTogether ().

Спасибо заранее, VA

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Когда вы говорите «поиск», мне приходят в голову поисковики. Но я думаю, что вы спрашиваете о запросе к базе данных, верно?

Если вы говорите о поисковых механизмах, поисковые системы - отличный инструмент. Вы можете взглянуть на Lucene, Compass и ElasticSearch (ES), чтобы назвать несколько. Компас и ES основаны на люцене, но намного выше в уровне абстракции (проще в использовании). Я использую ElasticSearch с большим удовлетворением.

Если вы говорите о запросах к базе данных, то вы можете просто динамически построить HQL-запрос. Метод ниже должен быть в контроллере, так как он использует атрибут params. Это не проверено хорошо?

List allAttributesTogether() {
    def query = " select book from Book book "
    def queryParams = [:]
    def needsAnd = false

    if(params.a || params.b || params.z ){
       query += " where "
    }
    if(params.a){
       query += " book.a = :a "
       queryParams['a'] = params.a
       needsAnd = true
    }
    if(params.b){
       if(needsAnd) query += " and "
       query += " book.b = :b "
       queryParams['b'] = params.b
       needsAnd = true
    }
    if(params.a){
       if(needsAnd) query += " and "
       query += " book.z = :z "
       queryParams['z'] = params.z
    }

    return Book.executeQuery(query, queryParams)

}

Существует также альтернатива использования Criteria builder . Вы также можете использовать «если», чтобы добавить предложения к своим предложениям Criteria.

0 голосов
/ 18 июня 2011

Проверьте плагин панели фильтров.

...