这篇主要介绍:java
- Search API
- URI Search详解
- Request Body与Query DSL
- Query String & Simple Query String查询
elasticsearch的搜索API可分为两大类python
- URI Search
- 在URL中使用查询参数
- Request Body Search
- 使用Elasticsearch提供的,基于JSON格式的更加完备的Query domain Specific Language(DSL)
语法 | 范围 |
---|---|
/_search | 集群上全部的索引 |
/index1/_search | index1 |
/index1,index2/_search | index1和index2 |
/index*/_search | 以index开头的索引 |
例子:golang
curl -XGET "http://192.168.74.112:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie" -H 'Content-Type:application/json' -d'
{
"query":{
"match_all":{}
}
}'
# 支持GET POST
# kibana_sample_data_ecommerce是须要操做的索引名
# _search表示执行搜索
# q用来表示查询内容,搜索叫作Eddie的客户
# query表示查询
# match_all表示返回全部的文档
复制代码
搜索查询结果以下:web
在elasticsearch中,提供了不少查询和相关的参数改善搜索的Precision和Recall算法
顾名思义,URI search就是经过URI进行查询shell
经过URI query实现搜索json
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
zhibash
- q 指定查询语句,使用 Query String Syntax
- df 默认字段,不指定时候,会对全部字段进行查询
- Sort 排序 ,能够指定 from 和 size 用于分页
- Profile 能够查看查询如何执行的
# 指定字段查询,加profile查看查询如何执行的
GET /movies/_search?q=title:2012
{
"profile": "true"
}
# 查询结果profile中的部分信息,可看出查询类型是termQuery,参数是title:2012
{"query" : [
{
"type" : "TermQuery",
"description" : "title:2012"
}
]
}
复制代码
# 泛查询,针对_all,全部字段
GET /movies/_search?q=2012
{
"profile": "true"
}
# 查询结果profile中的部分信息,使用DisjunctionMaxQuery,对全部字段查询,性能较差
{"query" : [
{
"type" : "DisjunctionMaxQuery",
"description" : "(title.keyword:2012 | id.keyword:2012 | year:[2012 TO 2012] | genre:2012 | @version:2012 | @version.keyword:2012 | id:2012 | genre.keyword:2012 | title:2012)"
}
]
}
复制代码
# Term query
GET /movies/_search?q=title:Beautiful Mind
{
"profile": "true"
}
# Phrase query
GET /movies/_search?q=title:"Beautiful Mind"
{
"profile": "true"
}
复制代码
分组与引号app
# 分组
GET /movies/_search?q=title:(Beautiful Mind)
{
"profile": "true"
}
复制代码
AND
/OR
/NOT
或者 &&
/ ||
/ !
+
表示 must-
表示 must_not举例:less
[]
闭区间,{}
开区间
算数符号
# 范围查询,区间写法 / 数学写法
GET /movies/_search?q=year:>=1980
{
"profile": "true"
}
复制代码
通配符查询效率低,占用内存大,不建议使用。特别是放在前面限制
# 通配符查询,title有b的查询出来
GET /movies/_search?q=title:b*
{
"profile": "true"
}
复制代码
# 模糊匹配&近似度匹配
# 经过近似度匹配的查询方式,即使是输错了一个字母,beautiful有关title也能够查询出来
GET /movies/_search?q=title:beautifl~2
{
"profile": "true"
}
复制代码
GET /movies/_search?q=title:"Lord Rings"~2
{
"profile": "true"
}
复制代码
在elasticsearch中,一些高阶的使用方法只能经过Request Body Search实现
举例:
- 将查询语句经过 HTTP Request Body发送给Elasticsearch
- Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile": "true",
"query": {
"match_all": {}
}
}
复制代码
能够在request body中加入from和size达到一个分页的效果
POST /kibana_sample_data_ecommerce/_search
{
"from": 10,
"size": 20,
"query": {
"match_all": {}
}
}
复制代码
可在request请求中加入 sort
参数用于排序。
GET kibana_sample_data_ecommerce/_search
{
"sort": [
{
"order_date": "desc"
}
],
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}
复制代码
好比说文档很大,不少类型的字段并不须要,那就能够在request中加入 _source
对查询字段进行过滤,加上你须要查询的字段信息便可。
_source
没有存储,那就只返回匹配的文档的元数据_source
只支持使用通配符 _source["name*","desc*"]
GET kibana_sample_data_ecommerce/_search
{
"_source": ["order_date"],
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}
复制代码
脚本字段就是能够用elasticsearch的 painless
脚本去计算出一个结果出来
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'_hello'"
}
}
},
"query": {
"match_all": {}
}
}
复制代码
在URI search有Term Search和Phrase Search,那的request body search中,是经过 query match
的方式进行实现的
例子:
# last OR christmas,相似于Term查询,match中填写字段:限定值
POST /movies/_search
{
"query":{
"match":{
"title":"Last Christams"
}
}
}
# last AND christmas,相似于phrase查询,在operator中指定
GET /movies/_search
{
"query":{
"match":{
"title": {
"query":"Last Christams",
"operator":"AND"
}
}
}
}
复制代码
在phrase查询中,query中的词必须是按照顺序出现的,才会有命中结果,slop=1
表明query中间能够由1个其余的字符进去,进行模糊命中
GET /movies/_search
{
"query":{
"match_phrase":{
"title":{
"query":"one love",
"slop":1
}
}
}
}
复制代码

在URI中是能够使用query string的,那一样在DSL中也支持query String的使用
+
替代 AND
|
替代 OR
-
替代 NOT
# 插入用户1
PUT /users/_doc/1
{
"name":"Zhang San",
"about":"java,elasticsearch,product"
}
# 插入用户2
PUT /users/_doc/2
{
"name":"Li San",
"about":"python,golang"
}
复制代码
request body DSL中包含了不少很是高级强大的用法,更精彩的部分在接下来的提升文档中介绍。本篇主要是讲述了elasticsearch的search API,对URI search和Request Body DSL的操做,用法作了介绍。实操部分较多,还需多多练习
以为不错,请点个赞吧