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. Итак, у вас есть два варианта:
- Сделайте "детали" доступными для поиска (что явно не нужно).
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.