繁体   English   中英

grails searchable插件查询

[英]grails searchable plugin query

我的Grails应用程序使用可搜索的插件,该插件基于Compass和Lucene构建,以提供搜索功能。 我有两个可搜索的课程,比如作者和书。 我已将这些类映射到搜索索引,因此只能搜索某些字段。

要在两个类中执行搜索,我只需调用

def results = searchableService.search(query)

同时在两个类中进行搜索的一个很好的功能是, results对象包括有关包含的结果数,可用结果数,分页详细信息等的元数据。

我最近在Book类中添加了一个布尔approved标志,我从不希望未经批准的书籍出现在搜索结果中。 一种选择是将上面的调用替换为:

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

但是,我现在需要弄清楚如何结合两个结果的元数据,这可能是棘手的(特别是分页)。

有没有办法通过一个查询搜索Book和Author,但只返回已批准的书籍?

您是希望能够找到作者还是想要找到给定作者的书籍?

如果要查找具有给定作者的书籍,可以按以下方式配置域类:

class Author {
    String name
    ...

    static searchable = {
        root false
    }    
}

这将导致从searchableService.search(query) -result中排除作者,并且您将在索引中找到诸如$/Book/Author/name类的字段名称。 (使用luke检查索引: http//code.google.com/p/luke/ )。

您可以通过在Book-class中配置更好的prefix来更改这些字段的名称:

class Book {
    String name
    Author author
    ...

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

这会将索引中字段的名称更改为bookauthor

如果您现在使用searchableService.search(query)进行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 ,这可能对您result.total

我已经创建了一个测试应用程序并找到了以下解决方案。 也许它有帮助......

如果approved的属性仅具有状态01 ,则以下查询将起作用:

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

如果你不使用QueryParser而是使用BooleanQueryBuilder,我想这可以用更好的方式重新表述。

顺便说一句:如果你添加一个类似的方法

String getType() { "Book" }

String getType() { "Author" }

对于您的域,您甚至可以将搜索配置为像这样执行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM