ES中的搜索分为两种:
- URL search:在URL中使用查询参数。
- Request body search:使用ES提供的,基于JSON格式的QSL(Query Domain Specific Language)。
| 语法 | 范围 |
|---|---|
/_search | 集群上的所有索引 |
/index1/_search | index1 |
/index1,index2/_search | index1和index2 |
/index*/_search | 以index开头的索引 |
- URL search使用q指定查询字符串,使用KV键值对指定查询的字段和值,如:
curl -xGET "http://elasticsearch:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie"- Request body search支持GET和POST方法,使用请求体编写查询内容,如:
curl -XGET "http://elasticsearch:9200/kibana_sample_data_ecommerce/_search" -H'Content-Type:application/json' -d'
{
"query": {
"match_all":{}
}
}
'衡量相关性
- Precision(查准率)- 尽可能返回较少的无关文档。(查询到的需要结果/全部返回的结果)
- Recall(查全率)- 尽量返回较多的相关文档。(查询到的需要的结果/所有应该返回的结果)
- Ranking - 是否能够按照相关性排序
URL search
通过url的查询参数实现查询。
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
"profile": true
}- q指定查询语句
- df默认字段,不指定会对所有字段进行查询。
- sort排序/from和size用于分页
- profile查看查询是如何执行的
Term Query
对于词项进行查询。给定一个短语,Beautiful Mind,那么查询的结果可以是包含Beautiful或者Mind的。 例如:
GET /movies/_search?q=title:Beautiful Mind
{
"profile": true
}查询的结果是title字段中包含Beautiful或者Mind的。
Phrase Query
将查询的字段内容使用双引号包裹。这样就要求查询的字段中必须包括Beautiful和Mind的,并且前后关系还要保持一致。例如
GET /movies/_search?q=title:"Beautiful Mind"
{
"profile": true
}布尔操作
进行逻辑运算,与或非。就像默认情况下出现的两个单词为OR。 例如:
- 逻辑与运算,两个关键词都包括
GET /movies/_search?q=title:(Beautiful AND Mind)
{
"profile": true
}- 逻辑非,包括一个不包括另一个
GET /movies/_search?q=title:(Beautiful NOT Mind)
{
"profile": true
}范围查询
可以使用[]表示闭区间,{}表示开区间。支持算数符号。
例如:
GET /movies/_search?q=year:>=1980
{
"profile": true
}通配符查询
ES是支持通配符查询的,例如
GET /movies/_search?q=title:b*
{
"profile": true
}模糊匹配和近似度匹配
单词粒度的模糊匹配:
// 可以匹配与beautifl编辑距离不超过1的单词的查询结果
GET /movies/_search?q=beautifl~1
{
"profile": true
}短语粒度的近似度匹配:
//短语之间的匹配距离不超过2的
GET /movies/_search?q="Lord Rings"~2
{
"profile": true
}Request body search
将查询语句通过HTTP的request body发送给ES。 不需要拼接URL。
支持source过滤,只查询想要的部分字段的信息,例如:
GET kibana_sample_data_ecommerce/_search
{
"_source": ["order_date","category.keyword"],
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}在_source中还支持通配符匹配。
脚本字段
使用脚本字段可以对查询的结果进行处理后再展示。
例如,将文档的日志拼接上_hello后作为新字段展示。
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value + '_hello'"
}
}
},
"query": {
"match_all": {}
}
}
使用查询表达式-Match
前面使用了match_all表示全部匹配,现在使用查询表达式进行匹配。使用示例如下:
- term query
GET /movies/_search
{
"query":{
"match": {
"title": {
"query": "Last Christmas",
"operator" : "and"
}
}
}
}- phrase query
GET /movies/_search
{
"query": {
"match_phrase": {
"title": {
"query": "one love",
"slop": 1
}
}
}
}
query string
示例:
POST user/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "query string"
}
}
}
POST user/_search
{
"query": {
"query_string": {
fields: ["name", "about"],
"query": "(one AND tow) OR (Java AND es)"
}
}
}Simple query string
与query string类似,但是会忽略错误的语法,只支持部分查询语法。不支持AND OR NOT。
不过可以通过default_operator字段来指定逻辑。
POST users/_search
{
"query": {
"simple_query_string": {
"query": "simple query string",
"fields": ["name"],
"default_operator": "AND"
}
}
}tags: ElasticSearch