ES中的搜索分为两种:

  1. URL search:在URL中使用查询参数。
  2. Request body search:使用ES提供的,基于JSON格式的QSL(Query Domain Specific Language)。
语法范围
/_search集群上的所有索引
/index1/_searchindex1
/index1,index2/_searchindex1和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