不同于 SQL 语言,对 ElasticSearch 引擎发送的查询请求,有两种方式:第一种方式是使用 RESTful 风格的 API 请求对数据进行搜索或更新,这意味着,必须使用搜索 API 向 ElasticSearch 引擎发起搜索请求;第二种方式是使用 Qeury DSL,将查询语言封装成 JSON 结构,发送给 ElasticSearch 引擎。DSL 是领域专用语言(Domain-SpecificLanguage)的首字母缩写,是一种通用的大数据查询语言,用于实现海量数据的检索分析。
本系列是 ElasticSearch 的入门文章,用于介绍搜索 API 的使用方法,只求快速入门,想要深入了解,最好的文档永远是官方手册。
一,约定格式
在《ElasticSearch 查询》系列文章中,为了简化描述,突出重点,约定将 URL 字符串中 host:port/index/type 省略,
- curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
简写为只包含 "HTTP 动词 + 端点 + 查询参数" 的简写格式,如下:
- GET /_search?q=user:kimchy
将带有 POST 请求主体的查询,如下:
- curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }'
简写为只包含 "HTTP 动词 + 端点 + 请求主体 JSON" 的格式,如下:
- GET / _search - d {
- "query": {
- "term": {
- "user": "kimchy"
- }
- }
- }
二,查询端点(Endpoint)
查询端点允许 RESTful API 或客户端查询 ElasticSearch 引擎中存储的数据,通过 HTTP 动词定义操作,通过 URI 定位数据资源。
1,用于搜索数据的端点
查询 ElasticSearch 引擎,主要使用_search 和_query 端点,_search 端点允许执行搜索查询,返回查询结果。在_search 端点上,能够执行 RESTful API 查询和 Qeury DSL 查询,例如一下脚本:
- GET /_search?q=user:kimchy
- GET /_search -d
- {
- "query" : {
- "term" : { "user" : "kimchy" }
- }
- }
ElasticSearch 的所有查询请求都发送到_search 端点,对于_query 端点,只用于将查询的结果删除:
- DELETE /_query?q=user:kimchy
2,分析端点(_analyze)
分析端点_analyze,用于对查询参数进行分析,并返回分析的结果
- GET /_analyze?field=title -d
- ElasticSearch Sever
3,计数端点(_count)
在计数端点_count 上,执行查询,获取满足查询条件的文档数量
- GET /_count?q=user:jim
4,解释端点 (_explain)
用于验证指定的文档是否满足查询条件,格式是 index/type/_id/_explain,例如
- GET index/type/1/_explain?q=message:search
三,根据文档标识 ID 搜索单个文档
根据文档标识符搜索文档时,使用 "index/type/_id" 格式,如下,搜索文档标识为 13 的文档:
- GET /13
四,检查是否有文档满足查询条件
- GET /_search/exists?q=user:kimchy
五,URI 搜索
请求参数位于_search 端点之后,参数之间使用 & 分割,例如:
- GET / _search ? pretty & q = title: azure & explain = true & from = 1 & size = 10 & sort = title: asc & fields: user,
- title,
- content
1,pretty 参数
默认情况下,API 返回的 JSON 对象忽略换行符,在请求 (Request) 中加上 pretty 参数,强制 ElasticSearch 引擎在响应(Response)中加上换行符,使返回的结果集 JSON 可读。
2,查询条件(q)参数
查询条件(q)参数用于指定返回的文档必须匹配的查询条件,例如:q=title:azure,指定搜索 title 字段中包含 azure 关键字的文档;
可以设置一个字段包含多个关键字,关键字之间使用空格或逗号分隔,例如:q=title:(azure,aws,cloud),或 q=title:(azure aws cloud),指定搜索 title 字段中包含 azure,aws 或 cloud 的文档;只要 title 字段包含任意一个关键字,文档就满足查询条件;
q 参数可以指定搜素一个短语,短语使用双引号标识,例如:q=title:"azure vs aws",指定搜索 title 中包含短语 "azure vs aws" 的文档;
在查询条件中,也可以指定操作符:+ 或 -,操作符 + 用于指定返回的文档必须匹配查询条件;操作符 - 用于指定返回的文档不匹配查询条件;操作符之间以空格分隔,操作符是位于查询条件 = 号右侧,字段前面,例如 q=+title:azure -title:aws,指定搜索字段 title 中只能包含 azure,不能包含 aws;
3,默认操作符(default_operator)参数
在 API 中可以包含多个查询条件 q,默认条件下,多个查询条件之间的关系是或(or)关系,例如:q=title:azure&q=content:azure,指定搜索 title 字段中包含 azure 关键字,或者 content 字段中包含 azure 关键字的文档。
查询条件之间的逻辑关系由默认操作符(default_operator)参数指定,默认值是 or,该属性可以设置为 and 或 or;
对于查询:q=title:(azure,aws)&q=content:(azure,aws),表示搜索文档的字段 title 或 content,只要字段值中出现 azure 或 aws 关键字,就表示该文档匹配查询条件,作为查询结果返回。
4,投影字段(fields)参数
默认情况下,返回的每个文档都包括_index,_type,_id,_score 和_source 字段,投影参数 fields 用于指定返回的字段列表。在查询时,通过 fields 参数,指定一个以逗号分隔的字段列表,这些字段的 store 属性必须设置为 true,或存在于_source 字段中。默认情况下,fields 字段的参数值是_source。可以指定一个或多个字段,字段之间以逗号分隔:
5,排序(sort)参数
排序(sort)参数,用于对结果进行排序,使 ElasticSearch 按照指定的字段对结果进行排序,值是
/
- fieldName:asc
sort=field1:asc,field:desc
- fieldName:desc,默认是升序排序,可以有多个排序字段,排序字段之间以逗号分割,例如:
6,其他参数
六,查询请求
URI 搜索,实际上词条查询,可以转换为查询请求,查询请求的词条查询,如下:
- GET / _search - d {
- "from": 0,
- "size": 10,
- "sort": [{
- "post_date": {
- "order": "asc"
- }
- },
- {
- "name": "desc"
- }],
- "fields": ["name", "postDate", "age"],
- "query": {
- "term": {
- "user": "kimchy"
- }
- }
- }
1,查询条件
在查询条件结点 "query" 中,指定查询的类型是词条(Term),在词条中指定查询的条件,例如,只要 User 中包含 kimchy 关键字,就满足查询条件:
- "query": {
- "term": {
- "user": "kimchy"
- }
- }
2,排序
在排序结点 "sort" 中,指定排序的字段和排序的方向
- "sort": [{
- "post_date": {
- "order": "asc"
- }
- },
- {
- "name": "desc"
- }]
排序的方向:升序 asc,降序 desc,对于_score 字段,默认的排序方式是降序 desc,对于其他字段,默认的排序方向是 asc。
ElasticSearch 将排序值(Sort Value)返回到查询的结果中,通过 "sort" 数组,能够看到 ElasticSearch 是按照哪个数据值进行排序的。
当对字符串字段进行排序时,该字段最好不被分词(analyzed 或 tokenized),如果字符串字段被分词,那么 ElasticSearch 引擎将随机选取字段的一个分词(Term)进行排序,这可能不是你想要的排序值。
3,投影,选取返回的字段
投影字段(fields),用来限制返回的字段
4,窗口字段
窗口字段 from 和 size,用来限制返回的文档数量
参考文档:
来源: http://www.cnblogs.com/ljhdo/p/4486978.html