跳过正文
  1. 文章/
  2. Java/
  3. 组件与中间件/
  4. ElasticSearch/

4、ES的查询

·1335 字·3 分钟· loading · loading · ·
Java 组件与中间件 ElasticSearch
GradyYoung
作者
GradyYoung
ElasticSearch - 点击查看当前系列文章
§ 4、ES的查询 「 当前文章 」

term查询
#

  • term query: 会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date
  • term:查询某个字段为该关键词的文档(它是相等关系而不是包含关系)
  • term是代表完全匹配,即不进行分词器分析,必须全值匹配。查询不会对查询的字段进行分词查询,会采用精确匹配
  • 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)

语法
#

如果字段类型为text,那么在插入的时候就会被分词,如果使用term查询的话,那么无法命中

GET /index_name/types_name/_search       
{
  "query": {
    "term": {
        "key": "value" 
      }
    }
}

match查询
#

知道分词器的存在,会对filed进行分词操作,然后再查询

无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。

如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串:

匹配(Match)查询属于全文(Fulltext)查询,不同于词条查询,ElasticSearch引擎在处理全文搜索时,首先分析(analyze)查询字符串,然后根据分词构建查询,最终返回查询结果。匹配查询共有三种类型,分别是布尔(boolean)、短语(phrase)和短语前缀(phrase_prefix),默认的匹配查询是布尔类型,这意味着,ElasticSearch引擎首先分析查询字符串,根据分析器对其进行分词。

match_all
#

查询所有文档

语法
#

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

match精确匹配
#

如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个 not_analyzed(version:5) ,keyword(7)字符串字段,那么它将会精确匹配给定的值

语法
#

查询结果是所有年龄=18岁的

GET userinfo/_search
{
    "query":{
    	"match":{"age": 18}
    }
}

match分词匹配
#

match query: 知道分词器的存在,会对key的value进行分词操作,然后再查询

get /index_name/_search  
{
  "query":{
    "match": {
      "key": "value"  
    }
  }
}

multi_match
#

会对value进行分词,然后在key1和key2两个字段的value中进行匹配

GET index_name/_search
{
  "query":{
    "multi_match": {
      "query": "value",
      "fields":["key1","key2"]
    }
  }
}

match_phrase
#

短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变

GET index_name/_search
{
  "query":{
    "match_phrase":{"key": "value"}
  }
}

指定返回的字段
#

可以指定查询结果返回的字段,相当于MySQL中的select uid,uname from user

GET index_name/_search
{
  "_source":["key1","key2"],
}

排序查询
#

GET /index_name/_search
{
	"query":{
		"match_all":{
			
		}
    },
    "sort":{
        "key":{
        "order":"desc[降序]|asc[升序]"
        }
    }
}

复合查询
#

bool (布尔)过滤器。 这是个复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。 用户合并其他查询语句,比如一个bool语句,允许你在需要的时候组合其他语句,包括mustmust_notshouldfilter语句(多条件组合查询)

格式
#

一个 bool 过滤器由四部分组成

{
    "query":{
        "bool":{
            "must":[
            ],
            "should":[
            ],
            "must_not":[
            ],
            "filter":[
            ]
        }
    }
}
  • must
    • 所有的语句都 必须(must) 匹配,与 AND 等价。
  • must_not
    • 所有的语句都 不能(must not) 匹配,与 NOT 等价。
  • should
    • 至少有一个语句要匹配,与 OR 等价

使用举例
#

查询userinfo中年龄是18随,且姓名不是lucy的信息

GET /userinfo/_search
{
    "query": {
        "bool": {
            "must": [
            	{	
                    "match": {
                    	"age": "18"
                    }
                }
            ],
            "must_not": [
                { 
                    "match": { 
                    	"name": "lucy" 
                    } 
                }
            ]
        }
    }
}
ElasticSearch - 点击查看当前系列文章
§ 4、ES的查询 「 当前文章 」