Solr查询语言 JSON Request API

一、背景与动机

JSON Request API是由noggit作者(同时也Solr Committer Leader)在Solr.5.3带来新特性,意在改善Solr原来复杂且又丑陋查询语法。

注:JSON Request API与Solr API v2并不是一回来,JSON Request API是一种新型Solr Query DSL。API v2新版本查询API,是基于Restful API实现的。当然JSON Request API显然是基于JSON实现的咯。
不过Request API还是API v2都是Solr学习ElasticSearch靠近的表现。

以前想写简单查询其实也没有很复杂,就是写个q参数,然后指定一下rowssort嘛,但是对于用Solr来做统计相关工作的同学,还是觉得挺烦的。因为它
1. 冗长,没有结构,容易出错,难于校验和debug。f.facet_field_name.facet.range.start=5
2. 没有数据类型,整个世界都是String,缺乏结构,不便于编程
3. 对服务端而言,解释得也相当复杂。

总之,就是有一系列问题。所以在Solr5.3,Yonik小哥带来这个。当然,我们Solr的JSON解析器用的就是Noggit。

Noggit是非常牛比,非常最效,非常新颖的JSON解析器。她是流式JSON解释器,同时她还扩展JSON格式,使得她的结构更加简洁,优雅。想了解她更牛比之处请阅读noggit项目首页。

这就是JSON Request API出现的背景,当然动机就是针对这些痛点进行优化,一方面有利于推广Solr的搜索统计功能;二方面优化搜索解析效率、优化使用体验。

二、用法

在过去,我写Blog从不写用法一类的Blog。主要是这一类文章写的非常多,这次为什么要写呢,原因有二。一,Solr6.6正式推出这套API;二,貌似并没多少人关注她。这么好的特征,不能让她一直默默无闻。

虽然Noggit已经非常简洁好看,但是她在浏览器的地址栏里编辑还非常不好方便的。但我依然她觉得非常好,特别在她提供一系列非常好用的Facet Statistics & Aggregations Function。之前没有她的时候,我们要写这些查询,非常苦痛的,除了可能需要用到stats查询之外,还很有用可能需要用到非常用的Query Function。(这也可能就是Solr一直很搜索的原因吧。)

因此,非常有必要来推广她,不能让这个世界都是ElasticSearch

好了,回归正题,先看来几个Query。

Query #1. 直接POST

  • 原来写法 http://solr.daming.com/solr/daming/select?q=helloWorld
  • JSON Request API写法

    $ curl http://solr.daming.com/solr/daming -d '{
    query : "helloWorld"
    }'

    非常清淅,特别是熟悉ElasticSearch的同学们,可谓是ElasticSearch转向Solr的一条桥梁。

query #2. HttpGet Method

JSON Request API作为新版的query api,其实它也是相当成熟了的,功能也相当丰富,也基本兼容旧版API。当是HttpGet是需要一个参数来接收我们新版JSON Request内容的。通过Parameter json={}的方式来接收JSON Request API的查询语句,且新版API与旧版API完全兼容,即是可以一起来描述一个查询请求。

这种情况下,JSON Request API完全就是原来查询语法的一个扩展,即是多出一个叫json的新参数。

$ curl http://localhost:8983/solr/query -d 'json={query:"hero"}&fq=author:brandon'

Query #3 来看一个完整的示例

老实说,JSONS Request API定义真的是非常人性化、贴近自然语言。

{
  query : ":",
  filter : [
    "author:brandon",
    "genre_s:fantasy"
  ],
  offset : 0,
  limit : 5,
  fields : ["title","author"],  // we could also use the string form "title,author"
  sort : "sequence_i desc",

  facet : {  // the JSON Facet API is nicely integrated as well
    avg_price : "avg(price)",
    top_authors : {terms : author}
  }
}
  • 参数解释
    我以为新版本的API参数名并不需要加于描述,看名字即可。
  • query,等同于q
  • filter,等同于fq,注意新版API是结构化的,并且是有类型的。因为我们并不需要向以前那么样拼一堆的fq,如今如只需要一个数组即可。
  • offset,等同于start
  • limit,等同于rows
  • sort,还是sort
  • facet,新款Facet API,具体下篇再继续讨论。

跟旧版一样,并不需要一个请求里为所有参数进行赋值。同时所有参数都是可以缺省,当新旧版同语义的参数出现时,由旧版本参数值覆盖新版。
按Yonik的说法,JSON Request API属于二级查询,因为它由json=开始。那么即是上级会覆盖下级。

noggit json string完全支持扁平化,意思是说我们通过打点的方式把查询语句变得扁平化,然后拼在上级结构里。此时同样满足上级覆盖下级的基本规则。

三、后语

Solr拥有一套完整、非常强大且复杂的查询语法,所以如果JSON Request API只是这样就结束的话,那就一点都不Solr了。因此还下一篇,下篇我们来聊聊JSON Facet API,这是才我为什么一直想要来介绍一下JSON Request API的原因。
在基本查询部分,JSON Request API的确没什么优势,我也建议你继续旧语法。但如果你需要用Solr来做统计的话,尽管Solr的Sql让你很失望,但请相信我,JSON Facet API会让你耳目一新,然后爱上她的。

参考文章:
大神Yonik博客

时间: 2024-08-29 12:20:17

Solr查询语言 JSON Request API的相关文章

使用JSON作为API请求的有效负载时出现的各种常见问题

JVAX (JSON Verification and Conversion/Transformation) 系统可在云服务接收到传入请求之前对所有传入请求进行处理.JVAX 旨在处理使用 JSON 作为 API 请求的有效负载时出现的各种http://www.aliyun.com/zixun/aggregation/17253.html">常见问题. 本文提出了一种解决方案,该解决方案处理云服务与其用户需要进行 JavaScript Object Notation (JSON) 有效负载

如何设计一个作为基于JSON的API公开的整合流程

第 2 部分展示了如何构建一个整合流程(orchestration),该整合流程可调用 http://www.aliyun.com/zixun/aggregation/14536.html">Salesforce.com 公开的基于 JSON 的 REST API 来创建一个账户.第 3 部分展示如何设计一个作为基于 JSON 的 API 公开的整合流程. WebSphere Cast Iron(后面简称为 Cast Iron)被广泛用于遍及内部和外部应用程序的集成和迁移.过去,JSON

solr中dataimport的api

问题描述 现在solr已经配置好数据源,是一个单独的应用而我在另外个项目中怎么用代码是执行相当于solr管理工具上的dataimport中的fullimport操作求助各位大神指导下 解决方案

大明想跟你聊聊Solr6.x

来来来,坐下来,我们一起来聊聊Solr6.6.其实我关注Solr也有很长时间了,已经有小几年了吧.接下来, 我们来具体的聊一聊Solr几个变化或者变化趋势. 1. Hi Solr 其实想聊Solr,不提及ElasticSearch还是挺难的.提到ElasticSearch免不了要谈谈它的爸爸Elastic.CO. 如你所知,Solr出生很早,比ElasticSearch还要早一些.在Solr5.0之前, Solr一直很Solr,跟Lucene一脉相承.Solr原本就是Lucene一个子项目,连版

在WebSphere Cast Iron中使用JSON(二) 调用基于JSON的REST API

简介 WebSphere Cast Iron(以下简称 Cast Iron)被广泛用于整个内部和外部应用程序的集成和迁移.过去,大多数基于 SaaS 的应用程序都公开了 REST API,这些 API 用于处理 JSON 数据.然而,Cast Iron 主要处理 XML 和 XML 模式.为了支持有效的 REST API 调用,Cast Iron 引入了两个新活动来处理 JSON 数据. 您可以在调用 REST API (大部分是 SaaS 供应商公开的)的过程中使用 Read JSON 和 W

调用基于JSON的EST API来创建一个帐户

WebSphere Cast Iron(以下简称 Cast Iron)被广泛用于整个内部和外部应用程序的集成和迁移.过去,大多数基于 SaaS 的应用程序都公开了 REST API,这些 API 用于处理 JSON 数据.然而,Cast Iron 主要处理 XML 和 XML 模式.为了支持有效的 REST API 调用,Cast Iron 引入了两个新活动来处理 JSON 数据. 您可以在调用 REST API (大部分是 SaaS 供应商公开的)的过程中使用 Read JSON 和 Writ

在WebSphere Cast Iron中使用JSON(三) 设计基于JSON的REST API

简介 WebSphere Cast Iron(后面简称为 Cast Iron)被广泛用于遍及内部和外部应用程序的集成和迁移.过去,JSON  被普遍用作 REST API 的传输类型,因为与 XML 相比,它的格式是轻量级的. 在 Cast Iron 中,您可以创建和公开一个基于 JSON 的 API,这是一个以 JSON 格式接受请求并发送响应的整合流程.Cast Iron 使用了 XML 和XML 模式.Cast Iron 引入了两个用来处理 JSON 数据的新活动:Read JSON 和

[PHP] 为JSON数据的API返回空数组或者空对象

PHP 中,不管是 list 或者 dictionary 都使用一样的 ) 来定义. 在使用 JSON 作为 API 数据 Content-Type 的时候,会有这样一个问题: 如何返回一个空对象和一个空数组? 使用:json_encode([]) 得到JSON结果:[] 使用:json_encode(new stdClass) 得到JSON结果:{}

.ashx 利用post方式 将前端传过来的json数组解析后 通过 API接口 传入数据库

问题描述 .ashx 利用post方式 将前端传过来的json数组解析后 通过 API接口 传入数据库 如何做!!! .ashx 利用post方式 将前端传过来的json数组解析后 通过 API接口 传入数据库 接口刚接触,不明白求教技术大牛 解决方案 前端导入jquery,然后$.ajax发送,如果你要发送json字符串,需要用json.stringify转为字符串后再发送,ie7-不支持JSON对象,需要导入json2.js类库 var data = [{ a: 1, b: 2 }, { a