2010-09-27 3 views
1

Используя плагин Grails с возможностью поиска, у меня есть эти классы:Grails searchable: поиск определенного поля в объекте-члене?

class Person { 
static searchable = { 
    address component: true 
    } 
} 

и:

class Address { 
static searchable = { 
    root false 
} 
String country 
} 

я хочу сделать конкретный поиск для лиц из определенной страны. «страна: NL» не работает. «адрес: страна: NL» тоже не работает. Я не могу найти ничего о синтаксисе для этого. Есть идеи?

Я думаю, что мне нужно будет сделать некоторые умные индексирования или какой-нибудь другой трюк в доступном для поиска закрытии, но я просто не могу его найти.

ответ

3

Я создал основное приложение (Grails 1.3.5, Searchable 0.5.5.1) с двумя классами и поиск 'страны: NL' работает для меня. Вы не забыли вызвать index(), прежде чем пытаться выполнить поиск?

grails create-app search 
grains install-plugin searchable 

лицо:

class Person { 
    static searchable = { 
    address component: true 
    } 

    Address address 
} 

Адрес:

class Address { 
    static belongsTo = Person 
    static searchable = { 
    root false 
    } 
    String country 
} 

Bootstrap:

class BootStrap { 

    def init = { servletContext -> 

     def p1 = new Person(address:new Address(country:'NL')).save() 
     def p2 = new Person(address:new Address(country:'DE')).save() 
     def p3 = new Person(address:new Address(country:'NZ')).save() 

     Person.index() 

    } 

    def destroy = { 
    } 
} 

Затем я просмотрел к к/поиска и искали страны: NL и получил человек 1 вернулся.

Если вы хотите увидеть, что Searchable делает под одеялом в отношении полей/индексов и т.д. - Люк очень удобный инструмент (просто скачать исполняемый файл JAR): http://code.google.com/p/luke/

индексные файлы в

<user.home>/.grails/projects/<project name>/searchable-index/development/index 

веселит

Ли

+0

Ваш пример звучит так же, как, как я ожидал, что это сработает, но для меня это не так. (Упрощенные поисковые запросы работают, поэтому это не проблема.) Я дам Люку попытку выяснить, индексируется ли вообще.Я думаю, хорошо знать, что на самом деле это должно работать так, как я ожидал. Теперь, чтобы понять, почему он не работает для моего проекта. – mcv

0

Уродливое решение, которое работает: не полагайтесь на Searchable. На данный момент я сначала делаю Person.search(params.query, [max:99999]).results, а затем делаю простой .findВсе найти по стране и .sublist(), чтобы заставить пейджинг работать снова.

Жаль, что так трудно получить что-то настолько очевидное, что можно работать с поисковой системой.

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

Если у кого-то есть более красивые решения для меня, я бы хотел их услышать.

0

Я новичок в grails, но почему вы должны использовать поисковый плагин?

Что не так с простыми отношениями 1: 1 или 1: n?

package com.test 
class Person { 

     static constraints = { 
      name (nullable:false) 
      address (nullable:true) 
     } 

     String name 
     Address address 

     String toString() { 
      "name[" + name + "]. address[" + address + "]" 
     } 

     static mapping = { 
      address lazy:false 
     } 
    } 


    class Address { 

     static constraints = { 
      country (nullable:false) 
      town (nullable:false) 
     } 
     String country 
     String town 
     //Person person 

     static belongsTo = [person:Person] 
    // static belongsTo = Person 

     String toString(){ 
      "town[" + town + "], country[" + country + "]" 
     } 
    } 

     package com.test 

     import grails.test.* 

     class PersonIntegrationTestTests extends GrailsUnitTestCase { 
      protected void setUp() { 
       super.setUp() 
      } 

      protected void tearDown() { 
       super.tearDown() 
      } 

      void testSomething() { 
       def bill = new Person(name:'bill', address:new Address(town:'york', country:'UK')).save() 
       def fred = new Person(name:'fred', address:new Address(town:'leeds', country:'UK')).save() 
       def bjork = new Person(name:'helen', address:new Address(town:'helsinki', country:'finland')).save() 
       def gustav = new Person(name:'john', address:new Address(town:'helsinki', country:'finland')).save() 

       List ukAddresses = Address.findAllByCountry('UK') // find all by country 

       println "num addresses-" + ukAddresses.size() 

       for (int i in 0..<ukAddresses.size()) 
       { 
       println "found person:" + ukAddresses[i].person 
       } 

       assertNotNull "bill can not ne null", bill 
       assertTrue bill.validate() && !bill.hasErrors() 
       assertTrue fred.validate() && !fred.hasErrors() 
       assertTrue bjork.validate() && !bjork.hasErrors() 
       assertTrue gustav.validate() && !gustav.hasErrors() 

       assertEquals 2, ukAddresses.size() 
      } 
     } 
Смежные вопросы