Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建
更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现
GET /_search
{
"query": {
"match_all": {}
}
}
全文查询是指对已经完成索引的文本字段进行查询,它会对查询词进行分析,然后去全文进行匹配。
匹配查询接受文本/数字/日期,分析它们,并构造一个查询,它会将查询词分析后再去匹配。
GET /_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
短语匹配会分析文本,并从分析文本中创建短语查询,不会将查询短语拆开。
GET /_search
{
"query": {
"match_phrase": {
"FIELD": "PHRASE"
}
}
}
它与短语匹配的区别为它能匹配的方位更广,它可以命中到短语+其他内容的内容
GET /_search
{
"query": {
"match_phrase_prefix": {
"FIELD": "PREFIX"
}
}
}
它允许在多个字段上进行匹配,字段名允许通配符,还支持多种评分计算规则。是
GET /_search
{
"query": {
"multi_match": {
"query": "",
"fields": [],
"type": "best_fields"
}
}
}
一种使用查询解析器来解析其内容的查询,可以在多值上,设置查询条件之间的关系
GET /_search
{
"query": {
"query_string": {
"default_field": "FIELD",
"query": "this AND that OR thus",
"fields": [],
"default_operator": "OR"
}
}
}
类似于短语匹配,于字符串查询相比,它不会抛出异常,并丢弃查询无效的部分。
GET /_search
{
"query": {
"simple_query_string": {
"query": "",
"fields": [],
"default_operator": "OR"
}
}
}
它是对索引后的倒排索引进行查询的,这些查询通常用于诸如数字、日期和枚举等结构化数据,而不是完整的文本字段。
术语查询会找到包含反向索引中指定的确切术语的文档,即它不会对查询词进行分析。
GET /_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
它可以使用多个查询条件,并且可以跨索引查找
GET /_search
{
"query": {
"terms": {
"FIELD": [
"VALUE1",
"VALUE2"
]
}
}
}
范围搜索可用于数组、日期
GET /_search
{
"query": {
"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}
}
}
返回在原始字段中至少有一个非空值的文档:其实可以使用_field_names字段来查找
GET /_search
{
"query": {
"exists" : { "field" : "user" }
}
}
与查询值前缀相同的术语都可以匹配
GET /_search
{
"query": {
"prefix": {
"FIELD": {
"value": ""
}
}
}
}
查询的内容可以使用统配符
GET /_search
{
"query": {
"wildcard": {
"FIELD": {
"value": "VALUE"
}
}
}
}
查询词可以使用正则
GET /_search
{
"query": {
"regexp": {
"FIELD": {
"value": "VALUE"
}
}
}
}
即相似词查询,其中fuzziness设置相似程度,prefix_length可以设置从什么地方开始使用模糊匹配
GET /_search
{
"query": {
"fuzzy": {
"field": {
"value": "",
"fuzziness": 0.5,
"prefix_length": 0
}
}
}
}
返回该类型下的所有数据
GET /_search
{
"query": {
"type" : {
"value" : "my_type"
}
}
}
返回指定id的文档
GET /_search
{
"query": {
"ids" : {
"type" : "my_type",
"values" : ["1", "4", "100"]
}
}
}
复合查询封装了其他符合或简单查询,可以组合它们的结果和分数,改变它们的行为。
它使查询返回的文档都有固定的分值,可以与没有分值得过滤器配合使用
GET /_search
{
"query": {
"constant_score": {
"filter": {
},
"boost": 1.2
}
}
}
将几个查询的返回用布尔结果拼接
GET /_search
{
"query": {
"bool": {
"should": [ #不一定要满足的条件 如果满足加入评分
{
"term": {}
}
],
"must": [ #下面放必须满足的查询条件
{
"match": {}
},
{
"term": {}
}
],
"must_not": [ #存放要排除的内容
{
"term": {}
}
]
}
}
}
相比较bool的分值是总数计算,dis_max是使用最佳字段匹配模式的
GET /_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [ #这里存放的搜索是使用or关联的
{
"term": {}
}
]
}
}
}
使用函数来重新计算查询文档的分值,需要有一个查询,和一个或多个函数
GET /_search
{
"query": {
"function_score": {
"query": {},
"functions": [
{}
]
}
}
}
相当于bool中的must和must_not,但不同的是此排除的内容是会加入到命中的,只是评分被降低了
GET /_search
{
"query": {
"boosting": {
"negative": { #需要排除或者说降低评分的内容
},
"positive": { #需要满足的查询
},
"negative_boost": 0.2 #降低的评分
}
}
}
指定索引的查询
GET /_search
{
"query": {
"indices": {
"indices": [
"INDEX1",
"INDEX2"
],
"query": {}
}
}
}
需要把个类型连接到一起进行查询
对嵌套对象使用,可以查询嵌套对象下面的内容
GET /_search
{
"query": {
"nested": {
"path": "nested", #嵌套对象,下面使用nested.field
"query": {}
}
}
}
将有相同子类的type连接到一起
GET /_search
{
"query": {
"has_child": {
"type": "child", #子类型为child的所以父类型参与搜索
"query": {}
}
}
}
有相同父类型的子类型参与搜索,父子关系通过元数据_parent属性指定
GET /_search
{
"query": {
"has_parent": {
"parent_type": "TYPE", #具有相同父类型的子类型参与搜索
"query": {}
}
}
}
在父类型下根据id搜索文档,其实相当于使用has_patent 然后对id进行查找,不过has_parent和has_child需要进行联接,消耗比较大。此查询性能高于前两个
GET /my_index/_search
{
"query": {
"parent_id" : {
"type" : "blog_tag",
"id" : "1"
}
}
}
用于地理类型的查询,字段类型为geo_point或geo_shape
将地里坐标划分成一个个网格,然后通过网格之间的关系进行匹配,可以是INTERSECTS(交叉),DISJOINT(不想交) ,WITHIN(在查询内), CONTAINS (包含查询)
通过两个点确定一个长方形边界框,来搜索在边界框中的点
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"location" : {
"top_left" : { #左上角坐标
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : { #右下角坐标
"lat" : 40.01,
"lon" : -71.12
}
}
}
}
}
}
}
返回两点距离在设定距离内的文档
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km", #设置距离
"location" : { 查询点
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
返回两点距离在范围内的数据
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance_range" : {
"from" : "200km", #最小距离
"to" : "400km", #最大距离
"location" : { #查询点
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
使用点确定一个多边形,返回图形内的数据
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_polygon" : {
"location" : {
"points" : [ #根据点确定多边形
{"lat" : 40, "lon" : -70},
{"lat" : 30, "lon" : -80},
{"lat" : 20, "lon" : -90}
]
}
}
}
}
}
}
查看相似的文档内容,像推荐系统就可以通过使用此查询查找相似的内容。也可以
传入文档进行比较。
GET /_search
{
"query": {
"more_like_this": {
"fields": [
"FIELD"
],
"like_text": "text like this one",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
在查询语句中使用脚本,一般用于过滤环境汇中。
GET /_search
{
"query": {
"bool" : {
"must" : {
"script" : {
"script" : {
"source": "doc['num1'].value > 1", #脚本语句
"lang": "painless"
}
}
}
}
}
}
官方API文档: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
官方中文指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html