2012-01-10 4 views
6

My Grails 앱은 검색 기능을 제공하기 위해 Compass 및 Lucene을 기반으로하는 검색 가능한 플러그인을 사용하고 있습니다. 검색 가능한 두 개의 클래스가 있는데 저자 및 도서입니다. 이러한 클래스를 검색 인덱스에 매핑하여 특정 필드 만 검색 할 수 있도록했습니다. grails 검색 가능한 플러그인 쿼리

는 수를 results 개체가 결과의 수에 대한 메타 데이터를 포함하고 있다는 것입니다, 나는 단순히 동시에 클래스에 걸쳐 검색을 수행의 좋은 기능의

def results = searchableService.search(query) 

하나를 호출 두 클래스에 대한 검색을 수행 할 포함하려면 결과, 매김 세부 정보 등

최근에 부울 approved 플래그를 Book 클래스에 추가 했으므로 승인되지 않은 책을 검색 결과에 표시하지 마십시오. 하나의 옵션은 위에서 전화를 대체하는 것입니다 : 그러나

def bookResults = Book.search(query + " approved:1") 
def authorResults = Author.search(query) 

, 지금 까다로운 (특히 매김) 될 가능성이 모두 결과에 대한 메타 데이터를 결합하는 방법을 알아낼 필요가있다.

도서 및 저자를 단일 쿼리로 검색 할 수 있지만 승인 된 서적 만 반환 할 수 있습니까?

답변

4

테스트 앱을 만들었고 다음 솔루션으로 왔습니다. 재산 approved은 상태 01이있는 경우 어쩌면

...하는 데 도움이, 다음 쿼리가 작동합니다 :

def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} -approved:0 -approved:1)" 
) 

을 당신이하지 않으면이가 더 나은 방법으로 공식화 될 수있다 생각 QueryParser하지만 BooleanQueryBuilder를 사용하십시오.

BTW : 당신은

String getType() { "Book" } 

도메인으로
String getType() { "Author" } 

같은 방법은, 당신도이

def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} AND type:Author)" 
) 
+0

나는 당신의 끈기에 감탄했습니다. 위의 솔루션이 작동하는 것 같습니다, 대단히 감사합니다! –

+0

:-) 현상금을 포착하기를 바랬습니다 ... – rdmueller

6

저자를 찾고 싶습니까? 또는 특정 저자와 함께 책을 찾고 싶습니까?

class Author { 
    String name 
    ... 

    static searchable = { 
     root false 
    }  
} 

이이 searchableService.search(query) -result에서 저자를 제외 발생합니다 그리고 당신은 확인할 수있는 것들 : 주어진 저자와 책을 찾으려면

, 당신은 다음과 같은 방법으로 도메인 클래스를 구성 할 수 있습니다 색인에 $/Book/Author/name과 같은 필드 이름이 있어야합니다. (루크를 사용하여 색인을 검사하십시오 : http://code.google.com/p/luke/).

당신은 당신의 책 수준에서 prefix 더 나은을 구성하여 해당 필드의 이름을 변경할 수 있습니다

class Book { 
    String name 
    Author author 
    ... 

    static searchable = { 
     author component: [prefix: 'author'] 
    }  
} 

이이 bookauthor에 인덱스의 필드 이름을 변경합니다.

searchableService.search(query)으로 검색하면 책 이름이나 작성자 이름에 검색어가 포함 된 모든 책을 찾을 수 있습니다. authorname:xyz 구문을 사용하여 지정된 작성자로 검색을 제한 할 수도 있습니다.


당신이 정말로 검색 결과를 혼합하려는 경우, 난 단지 당신이 이미 언급 한 솔루션을 알고 자신의 코드를 모두 결과를 혼합,하지만 난 그게에서 히트의 점수를 혼합 힘들 것 같아요 좋은 방법. 당신의 응답에

업데이트 : 여기에 ... 내 매김 코드의

.gsp :

<div class="pagination"> 
    <g:paginate total="${resultsTotal}" params="[q: params.q]"/> 
</div> 

컨트롤러 : 그래서

result = searchableService.search(params.q, params) 
[ 
    resultList: result.results, 
    resultsTotal: result.total 
] 

당신이 당신이 개 검색의 결과를 병합하는 경우 result.total을 추가하면이 방법을 사용할 수 있습니다.

+0

처럼 할 검색을 구성 할 수 있습니다 추가하는 경우 하나의 검색어로 책과 저자를 찾고 싶지만 승인되지 않은 b는 포함시키지 않으려합니다. 결과에 ooks. 2 개의 쿼리를 수행 할 때의 문제점은 2 세트의 메타 데이터를 단일 세트로 결합하는 것이 어렵다는 것입니다. 예를 들어 도서 결과가 2 페이지이고 작성자 결과가 2 페이지 인 경우 결과적으로 총 4 페이지의 결과가 있음을 의미하지 않습니다. –

+0

죄송합니다. 여기에 뭔가 빠뜨린 것 같습니다. 15 권의 책 검색 결과와 17 권의 저자 검색 결과가있는 경우, 결과는 항상 32 개가됩니다.> 4 페이지 (결과가 각각 10 개) – rdmueller

+0

예,하지만 11 권의 도서 검색 결과 (2 페이지)가있는 경우, 및 11 명의 작성자 결과 (2 페이지)를 사용하면 결과를 결합하면 3 페이지로 나눌 수 있습니다. –

관련 문제