我正在使用elastic4s查询 flex 搜索,现在我需要缓存此查询,以便稍后用于分页。

查询构建过程是一个繁重的计算,这就是为什么我需要将其最终保存在本地缓存(即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" : {
            ...

注意双“查询”标签。

因此,由于在文档中不清楚,是否有人想解决该问题?

谢谢!

最佳答案

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

searchDefinition._builder.toString

还返回键:
"query" : {
    ...
}

我可以设法手动删除多余的查询字符串,然后调用来解决清理查询字符串的问题:
val cachedQuery = Cache.restore(key)
search.in(s"$indexName/$docType").rawQuery(cachedQuery)

像魅力一样工作!

关于scala - 如何序列化elastic4s查询以重用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31943172/

10-10 18:07
查看更多