grails可搜索插件查询

grails可搜索插件查询,grails,groovy,lucene,searchable,compass-lucene,Grails,Groovy,Lucene,Searchable,Compass Lucene,我的Grails应用程序正在使用可搜索插件,该插件基于Compass和Lucene提供搜索功能。我有两个可搜索的类,比如Author和Book。我已将这些类映射到搜索索引,以便只能搜索某些字段 要在两个类之间执行搜索,我只需调用 def results = searchableService.search(query) 同时跨这两个类进行搜索的一个很好的特性是,results对象包含关于包含的结果数量、可用结果数量、分页详细信息等的元数据 我最近在Book类中添加了一个布尔approved标志

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

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

def results = searchableService.search(query)
同时跨这两个类进行搜索的一个很好的特性是,
results
对象包含关于包含的结果数量、可用结果数量、分页详细信息等的元数据

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

def bookResults = Book.search(query + " approved:1")
def authorResults = Author.search(query)
然而,我现在需要弄清楚如何为这两个结果组合元数据,这可能很棘手(尤其是分页)


有没有一种方法可以通过单个查询在图书和作者之间进行搜索,但只返回已批准的图书?

您希望能够找到作者,还是希望找到具有给定作者的图书

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

class Author {
    String name
    ...

    static searchable = {
        root false
    }    
}
这将导致将作者从
searchableService.search(query)
-result中排除,您将在索引中找到类似
$/Book/Author/name
的字段名。(使用luke检查索引:)

您可以通过在Book类中配置更好的
前缀来更改这些字段的名称:

class Book {
    String name
    Author author
    ...

    static searchable = {
        author component: [prefix: 'author']
    }    
}
这会将索引中字段的名称更改为
bookauthor

如果您现在使用
searchableService.search(query)
进行搜索,您将找到包含搜索词的书名或作者姓名的所有书籍。您甚至可以使用
authorname:xyz
语法将搜索限制到给定的作者


如果你真的想混合搜索结果,我只知道你已经提到的解决方案:将两个结果与你自己的代码混合,但我想很难以一种好的方式混合命中分数

更新您的回复:这是我的分页代码

.普惠制:


因此,如果您只是合并两次搜索的结果并添加
result.total
s,这可能对您有用。

我创建了一个测试应用程序,并得出以下解决方案。也许会有帮助

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

def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} -approved:0 -approved:1)"
)
我想如果不使用QueryParser,而是使用BooleanQueryBuilder,可以更好地对其进行重新格式化

顺便说一句:如果您添加了如下方法

String getType() { "Book" }

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

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

我希望能够通过单个查询找到书籍和作者,但决不在结果中包含未经批准的书籍。执行两个查询的问题是,很难将这两组元数据组合到一个集合中。例如,如果我有2页的图书结果和2页的作者结果,这并不一定意味着我总共有4页的结果对不起,我想我错过了一些东西。如果你有15本书的结果和17本作者的结果,你总是有32个结果->4页(每个10个结果)是的,但是如果我有11本书的结果(2页)和11本作者的结果(2页),然后,如果我将结果组合在一起,我可以将它们放在3页中。一个更好的例子是导航到下一页的结果,说明组合查询的困难。如果我执行单个查询,插件将生成URL以查看下一页/上一页的结果。如果我执行两个单独的查询,它将只生成用于查看每个子查询的下一页/上一页结果的URL。我不使用结果中的页面信息。我将结果大小与默认的grails分页一起使用,我欣赏您的持久性。上述解决方案似乎有效,非常感谢!
String getType() { "Book" }
String getType() { "Author" }
def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} AND type:Author)"
)