Elasticsearch查询

查询

Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

查询所有文档 - match_all

GET /_search
{
  "query": {
    "match_all": {}
  }
}

全文查询

全文查询是指对已经完成索引的文本字段进行查询,它会对查询词进行分析,然后去全文进行匹配。

词语匹配 - match

匹配查询接受文本/数字/日期,分析它们,并构造一个查询,它会将查询词分析后再去匹配。

GET /_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

短语匹配 - match_phrase

短语匹配会分析文本,并从分析文本中创建短语查询,不会将查询短语拆开。

GET /_search
{
  "query": {
    "match_phrase": {
      "FIELD": "PHRASE"
    }
  }
}

短语前缀匹配 - match_phrase_prefix

它与短语匹配的区别为它能匹配的方位更广,它可以命中到短语+其他内容的内容

GET /_search
{
  "query": {
    "match_phrase_prefix": {
      "FIELD": "PREFIX"
    }
  }
}

多字段匹配 - multi_match

它允许在多个字段上进行匹配,字段名允许通配符,还支持多种评分计算规则。是

GET /_search
{
  "query": {
    "multi_match": {
      "query": "",
      "fields": [],
      "type": "best_fields"
    }
  }
}

查询字符串查询 - query_string

一种使用查询解析器来解析其内容的查询,可以在多值上,设置查询条件之间的关系

GET /_search
{
  "query": {
    "query_string": {
      "default_field": "FIELD",
      "query": "this AND that OR thus",
      "fields": [],
      "default_operator": "OR"
    }
  }
}

简单字符串查询 - simple_query_string

类似于短语匹配,于字符串查询相比,它不会抛出异常,并丢弃查询无效的部分。

GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "",
      "fields": [],
      "default_operator": "OR"
    }
  }
}

精确级别查询

它是对索引后的倒排索引进行查询的,这些查询通常用于诸如数字、日期和枚举等结构化数据,而不是完整的文本字段。

单个精确 - term

术语查询会找到包含反向索引中指定的确切术语的文档,即它不会对查询词进行分析。

GET /_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

多查询条件 - terms

它可以使用多个查询条件,并且可以跨索引查找

GET /_search
{
  "query": {
    "terms": {
      "FIELD": [
        "VALUE1",
        "VALUE2"
      ]
    }
  }
}

范围查询 - range

范围搜索可用于数组、日期

GET /_search
{
  "query": {
   "range": {
     "FIELD": {
       "gte": 10,
       "lte": 20
     }
   }
  }
}

存在与否查询 - exists

返回在原始字段中至少有一个非空值的文档:其实可以使用_field_names字段来查找

GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}

术语前缀匹配 - prefix

与查询值前缀相同的术语都可以匹配

GET /_search
{
  "query": {
  "prefix": {
    "FIELD": {
      "value": ""
    }
  }
  }
}

通配符查询 - wildcard

查询的内容可以使用统配符

GET /_search
{
  "query": {
    "wildcard": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

正则表达式查询 - regexp

查询词可以使用正则

GET /_search
{
  "query": {
    "regexp": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

模糊查询 - fuzzy

即相似词查询,其中fuzziness设置相似程度,prefix_length可以设置从什么地方开始使用模糊匹配

GET /_search
{
  "query": {
   "fuzzy": {
     "field": {
       "value": "",
       "fuzziness": 0.5,
       "prefix_length": 0
     }
   }
  }
}

类型搜索 - type

返回该类型下的所有数据

GET /_search
{
    "query": {
        "type" : {
            "value" : "my_type"
        }
    }
}

主键查询 - ids

返回指定id的文档

GET /_search
{
    "query": {
        "ids" : {
            "type" : "my_type",
            "values" : ["1", "4", "100"]
        }
    }
}

复合查询

复合查询封装了其他符合或简单查询,可以组合它们的结果和分数,改变它们的行为。

常量分数查询 - constant_score

它使查询返回的文档都有固定的分值,可以与没有分值得过滤器配合使用

GET /_search
{
  "query": {
    "constant_score": {
      "filter": {

      },
      "boost": 1.2
    }
  }
}

条件查询 - bool

将几个查询的返回用布尔结果拼接

GET /_search
{
  "query": {
    "bool": { 
      "should": [  #不一定要满足的条件 如果满足加入评分
        {
          "term": {}
        }
      ],
      "must": [  #下面放必须满足的查询条件
        {
          "match": {}
        },
        {
          "term": {}
        }
      ],
      "must_not": [ #存放要排除的内容
        {
          "term": {}
        }
      ]
    }
  }
}

最佳字段分值解析 - dis_max

相比较bool的分值是总数计算,dis_max是使用最佳字段匹配模式的

GET /_search
{
  "query": {
    "dis_max": {
      "tie_breaker": 0.7, 
      "boost": 1.2,
      "queries": [ #这里存放的搜索是使用or关联的
        {
          "term": {} 
        }
      ]
    }
  }
}

分值函数计算查询 - function_score

使用函数来重新计算查询文档的分值,需要有一个查询,和一个或多个函数

GET /_search
{
  "query": {
    "function_score": {
      "query": {},
      "functions": [
        {}
      ]
    }
  }
}

降低某些内容的评分 - boosting

相当于bool中的must和must_not,但不同的是此排除的内容是会加入到命中的,只是评分被降低了

GET /_search
{
  "query": {
    "boosting": {
      "negative": { # 需要排除或者说降低评分的内容

      },
      "positive": { # 需要满足的查询

      },
      "negative_boost": 0.2 #降低的评分
    }
  }
}

多索引查询 - indices

指定索引的查询

GET /_search
{
  "query": {
    "indices": {
      "indices": [
        "INDEX1",
        "INDEX2"
      ],
      "query": {}
    }
  }
}

连接查询

需要把个类型连接到一起进行查询

嵌套查询 - nested

对嵌套对象使用,可以查询嵌套对象下面的内容

GET /_search
{
  "query": {
    "nested": {
      "path": "nested", # 嵌套对象,下面使用nested.field
      "query": {}
    }
  }
}

子类连接查询 - has_child

将有相同子类的type连接到一起

GET /_search
{
  "query": {
    "has_child": {
      "type": "child", # 子类型为child的所以父类型参与搜索
      "query": {}
    }
  }
}

关联相同双亲 - has_parent

有相同父类型的子类型参与搜索,父子关系通过元数据_parent属性指定

GET /_search
{
  "query": {
    "has_parent": {
      "parent_type": "TYPE", #具有相同父类型的子类型参与搜索
      "query": {}
    }
  }
}

父类id搜索 - parent_id

在父类型下根据id搜索文档,其实相当于使用has_patent 然后对id进行查找,不过has_parent和has_child需要进行联接,消耗比较大。此查询性能高于前两个

GET /my_index/_search
{
    "query": {
        "parent_id" : {
            "type" : "blog_tag", 
            "id" : "1"
        }
    }
}

地理数据查询

用于地理类型的查询,字段类型为geo_point或geo_shape

地理形状查询 - geo_shape

将地里座标划分成一个个网格,然后通过网格之间的关系进行匹配,可以是INTERSECTS(交叉),DISJOINT(不想交) ,WITHIN(在查询内), CONTAINS (包含查询)

边界框搜索 - geo_bounding_box

通过两个点确定一个长方形边界框,来搜索在边界框中的点

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
                        }
                    }
                }
            }
        }
    }
}

距离搜索 - geo_distance

返回两点距离在设定距离内的文档

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "200km", #设置距离
                    "location" : { 查询点
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}

距离范围搜索 - geo_distance_range

返回两点距离在范围内的数据

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance_range" : {
                    "from" : "200km", #最小距离
                    "to" : "400km", #最大距离
                    "location" : { #查询点
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}

多边形查询 - geo_polygon

使用点确定一个多边形,返回图形内的数据

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "location" : {
                        "points" : [  #根据点确定多边形
                        {"lat" : 40, "lon" : -70},
                        {"lat" : 30, "lon" : -80},
                        {"lat" : 20, "lon" : -90}
                        ]
                    }
                }
            }
        }
    }
}

相似搜索 - more_like_this

查看相似的文档内容,像推荐系统就可以通过使用此查询查找相似的内容。也可以
传入文档进行比较。

GET /_search
{
  "query": {
    "more_like_this": {
      "fields": [
        "FIELD"
      ],
      "like_text": "text like this one",
      "min_term_freq": 1,
      "max_query_terms": 12
    }
  }
}

使用脚本查询 - script

在查询语句中使用脚本,一般用于过滤环境汇中。

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "script" : {
                    "script" : {
                        "source": "doc['num1'].value > 1", #脚本语句
                        "lang": "painless"
                     }
                }
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章