Grails для поиска плагин

В моем приложении Grails у меня есть следующий класс домена, который индексируется с помощью плагина Searchable:

class Foo implements Serializable {

    BookletCategory bookletCategory
    Date lastUpdated
    static hasMany = [details: BookletRootDetail]

    static searchable = {
        bookletCategory component: true
        id name: 'bookletRootId'
        lastUpdated index: 'no'
    }
}

Когда я получаю экземпляры этого класса, свойство details всегда имеет значение null, даже если в базе данных есть экземпляры details. Мой вывод заключается в том, что поле подробностей не сохраняется в индексе Lucene. Я попытался добавить это поле в индекс, не делая его доступным для поиска, добавив следующее к доступному для поиска закрытию:

details index: 'no'

Однако кажется, что это справедливо только для простых свойств, таких как lastUpdated. Есть ли способ, которым я могу гарантировать, что это свойство заполняется, когда я получаю экземпляры Foo из индекса? В идеале я хотел бы сделать это, не делая детали для поиска в поле?

3 ответа

Ну, вы не можете получить объект, который сам по себе не доступен для поиска, вот как он работает, потому что вы не касаетесь БД с помощью плагина Searchable. Итак, у вас есть два варианта:

  1. Сделайте "детали" доступными для поиска (что явно не нужно).
  2. Refresh объекты. Проблема в том, что вы должны вызывать refresh() для каждого объекта списка, и это подразумевает запрос к БД, это неэффективно.

В настоящее время нет других решений этой проблемы.

Я не думаю, что вы можете сделать то, что вы пытаетесь сделать. Предполагая, что BookletRootDetail имеет предложение ownTo (то есть ссылку на родителя), вы можете индексировать идентификатор и выполнить второй поисковый запрос для получения сведений, соответствующих идентификатору Foo.

Вы должны убедиться, что BookletRootDetail доступен для поиска, а затем в Foo поместить его в качестве компонента для поиска.

Что-то вроде:

class Foo implements Serializable {

    BookletCategory bookletCategory
    Date lastUpdated
    static hasMany = [details: BookletRootDetail]

    static searchable = {
        bookletCategory component: true
        id name: 'bookletRootId'
        lastUpdated index: 'no'
        details component: true
    }
}

затем

class BookletRootDetail {
  static searchable = true
}

Вам не нужно, чтобы BookletRootDetail имел отношение отношение к Foo.

Другие вопросы по тегам