2012-01-10 52 views
6

我的Grails应用程序正在使用可搜索插件,该插件基于Compass和Lucene构建,以提供搜索功能。我有两个可搜索的类,比如Author和Book。我已将这些类映射到搜索索引,以便只搜索某些字段。grails可搜索插件查询

要执行在这两种类搜索我只需拨打

def results = searchableService.search(query) 

一个做跨两个班同时搜索的不错的功能,就是results对象包括关于结果的数量的元数据包括在内,数结果可用,分页详细信息等。

我最近为Book类添加了一个布尔值approved标志,我从不希望未经认可的书出现在搜索结果中。一种选择是,以取代上述与呼叫:

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

我很佩服你的坚持。上面的解决方案似乎工作,非常感谢! – 2012-01-30 16:05:30

+0

:-)希望捕捉赏金... – rdmueller 2012-01-31 09:01:19

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页结果 – 2012-01-13 00:31:34

+0

对不起,我想我错过了这里的东西。是不是这样,如果你有15本书的结果和17个作者的结果,你总是会有32个结果在一起 - > 4页(各有10个结果) – rdmueller 2012-01-13 05:57:05

+0

是的,但如果我有11本书的结果(2页)和11个作者的结果(2页),然后如果我结合了结果,我可以将它们合并到3页中。 – 2012-01-13 10:38:40