Grails для поиска - PullRequest
       3

Grails для поиска

1 голос
/ 02 апреля 2012

Я пытаюсь «промокнуть пальцы» с помощью грааля, и решил сделать сайт рецептов в качестве первого проекта. Я использую Grails 2.0.1 и использую mongoDB GORM для постоянства, которое работает нормально, и я использую static Searchable = true в моих моделях для поиска.

Делая простую утилиту поиска, мне удалось найти рецепты по имени, используя:

def recipes = Recipe.withCriteria
{
    ilike('name', params.name)
}

Рецепты можно найти по имени. У меня вопрос, как я могу искать имена ингредиентов, чтобы пометить их как результаты поиска (относительно моделей ниже)? Исходя из PHP и MySQL, это будет так же просто, как изменить запрос с помощью объединения или чего-то еще

мои модели следующие:

class Recipe 
{
    String name;
    String method;
    Date dateAdded;

    static hasMany = [ingredients:Ingredient];    
    static Searchable = true;
    static constraints = 
    {
        name(blank:false, maxSize: 255)
        method(blank:false)
    }

    static mapping = 
    {
        sort dateAdded: "desc"
    }
}

class Ingredient 
{
    String name;

    static hasMany = [recipes:Recipe];
    static belongsTo = [Recipe]
    static constraints = 
    {
        name blank:false;
    }

    String toString()
    {
        return name;
    }
}

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Это должно быть static searchable = true со строчными буквами "s" - см. http://grails.org/Searchable+Plugin+-+Mapping

Но плагин Searchable не работает с Mongo или другими хранилищами данных NoSQL. Это связано с тем, что он реализован с использованием событий Hibernate для прослушивания событий, соответствующих вставке, удалению и обновлению строк базы данных и обновлению индекса Lucene на основе этих изменений. Поскольку в миксе нет Hibernate, Searchable не знает о каких-либо изменениях.

1 голос
/ 02 апреля 2012

ваш .withCriteria поиск не имеет ничего общего с поисковым плагином - это просто обычный поиск SQL.

Попробуйте что-то вроде

def recipes = Recipe.withCriteria
{
    or {
        ilike('name', params.name)
        ingredients {
            ilike('name', params.name)
        }
    }
}

, чтобы выполнить поиск в рецепте иНазвания ингредиентов.

см. http://grails.org/doc/2.0.x/guide/GORM.html#criteria для получения дополнительной помощи.

0 голосов
/ 15 ноября 2013

Searchable Plugin работает с mongodb, но вам нужно настроить и переиндексировать его вручную, так как по умолчанию используется hibernate.

  1. изменить ваши config.groovy mirrorchanges = false и bulkIndexOnStartup = false

  2. добавить атрибут mapwith для всех классов вашего домена, который подключается к mongodb.static mapWith = "mongo" static searchable = true

  3. переиндексирует вручную, вызывая reindex () из bootstrap.groovy, и каждый раз, когда ваш домен имеет события обновления.def domainList = DomainName.list () DomainName.reindex (domainList)

это полезная ссылка, на которую я ссылался, хотя я не реализовал часть rabbit mq, так как не делаюнужно в данный момент.Надеюсь это поможет.http://spring.io/blog/2011/08/29/rabbitmq-enabling-grails-full-text-search-on-cloud-foundry/

...