1

我正在使用elastic4s来查询弹性搜索,现在我需要缓存这个查询以供以后用于分页目的。

查询构建过程是一个繁重的计算,这就是为什么我需要它自己保存在一些本地缓存(即redis)中的最终查询,以便以后检索和使用。

我面临的问题是,如何以我以后可以反序列化和重用的方式序列化或转换为字符串这个查询。

目前这是我正在使用的方法:

存储:

var searchDefinition = search.in(s"$indexName/$docType").query2(buildQuery)
Cache.save(key, searchDefinition._builder.toString)

恢复

val cachedQuery = Cache.restore(key)
val searchDefinition = search.in(s"$indexName/$docType")
searchDefinition._builder.setQuery(cachedQuery)

问题是:

从缓存恢复后重建的查询被破坏。它的样子:

Query: {
    "from" : 0,
    "size" : 20,
    "query":{
        "query" : {
            "function_score" : {
            ...

注意双“查询”标签。

因此,由于文档中的内容不是很清楚,是否有人想解决它?

谢谢!

4

1 回答 1

0

终于发现问题了。查询返回

searchDefinition._builder.toString

返回以及密钥:

"query" : {
    ...
}

我可以通过手动删除额外的查询字符串然后调用来解决清理查询字符串的问题:

val cachedQuery = Cache.restore(key)
search.in(s"$indexName/$docType").rawQuery(cachedQuery)

像魅力一样工作!

于 2015-08-12T21:00:19.310 回答