文档章节

Solr查询语言 JSON Request API

大明搜索
 大明搜索
发布于 2017/06/28 15:40
字数 1402
阅读 477
收藏 12
点赞 1
评论 0

一、背景与动机

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

$ 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参数名并不需要加于描述,看名字即可。
  1. query,等同于q
  2. filter,等同于fq,注意新版API是结构化的,并且是有类型的。因为我们并不需要向以前那么样拼一堆的fq,如今如只需要一个数组即可。
  3. offset,等同于start
  4. limit,等同于rows
  5. sort,还是sort
  6. 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博客

© 著作权归作者所有

共有 人打赏支持
大明搜索
粉丝 11
博文 6
码字总数 15125
作品 1
广州
高级程序员
Solr搜索引擎

1、solr的下载地址为http://pan.baidu.com/s/1kUAJYmF 2、solr的安装 solr下载完毕后解压开,使用前需要配置jdk1.8的环境变量 选中bin目录下的startup.bat启动就可以。 3、solr的使用 solr访...

0了凡0
2016/09/11
5
0
Apache Solr 5.2.1 发布,Java 全文搜索引擎

Apache Solr 5.2.1 发布,值得关注的更新如下: Fix javascript bug introduced by SOLR-7409 that breaks the dataimport screen in the admin UI Faceting on a numeric field with a uniq......

oschina
2015/06/16
2.9K
6
开发者都应该知道的开源搜索引擎

本文介绍若干款开源搜索引擎,他们具有不同的特性,总之都很强大。对于开发者来说,应该了解。 1、企业搜索解决方案 Constellio Constellio 是一个开源的搜索解决方案,适合企业级的搜索。基...

老枪
2011/06/01
2.9K
7
Apache Solr 5.4.1 发布,全文搜索服务器

Apache Solr 5.4.1 发布,更新如下: Bug Fixes (8) SOLR-8460: /analysis/field could throw exceptions for custom attributes. (David Smiley, Uwe Schindler) SOLR-8373: KerberosPlugin......

淡漠悠然
2016/01/22
2.3K
10
Solr4.0的tomcat部署及Solrj的简单使用

Solr简介 Solr是一个非常流行的,高性能的开源企业级搜索引擎平台,属于Apache Lucene项目。主要功能包括强大的全文检索、结果高亮、切面检索、动态聚类、数据库整合、富文本(例如Word,PDF...

beibugulf
2016/09/30
7
0
一步一步学solr:什么是solr?

简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出...

王爵nice
2014/07/22
0
0
全文检索引擎Solr系列——入门篇

Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境,jdk版本需要1.7...

引鸩怼孑
2016/04/25
63
0
Apache Lucene 和 Solr 7.1.0 发布,Java 搜索引擎

Lucene PMC 宣布发布了 Apache Lucene 7.1.0 和 Apache Solr 7.1.0 Lucene可从http://www.apache.org/dyn/closer.lua/lucene/java/7.1.0下载 Solr可从http://www.apache.org/dyn/closer.lua/......

周其
2017/10/18
1K
7
Apache Solr 5.4.0 发布,全文搜索服务器

Apache Solr 5.4.0 发布,现已提供下载: src="http://lucene.apache.org/solr/mirrors-solr-latest-redir.html" href="http://lucene.apache.org/solr/mirrors-solr-latest-redir.html">htt......

oschina
2015/12/15
2.2K
4
Apache Solr:基于Lucene的可扩展集群搜索服务器

Solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出...

长平狐
2013/01/06
206
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
19分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
27分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
49分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
42
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部