ES学习笔记 Elasticsearch基础学习(各种搜索条件语句)

  1. _search

只用一个查询字符串,你就可以在一个、多个或者 _all 索引库(indices)和一个、多个或者所有types中查询:
在请求体中传入from和size可以进行分页

GET /index/type1,type2/_search
{
     
  //from代表从第几条数据开始查询
  "from": 30,
  //size代表查询几条数据
  "size": 10
}
// 所以上面表示查询 30~40的数据
  1. 查询结构

所有记录的查询语句可以参考官方文档

{
     
	// 分页
	"from": 30,
	// 每页显示
	"size": 10
	"query" : {
     
	
		// 匹配满足
		"match" : {
     
			"tweet": "About Search" 
		}
		
		// 布尔查询
		// 注意,每个布尔条件下,每个检索条件都要用{
     }包住,即 {
     "match":{
      xxx:xxx}}这样的形式
	    "bool": {
     
	    
	    	// 文档 必须 匹配这些条件才能被包含进来。
	        "must": [
	        	{
     "match":   {
      "email": "business opportunity" }},
	        	
	        	// 满足在某个范围内
	        	{
     "range": {
     
			        "age": {
     
			            "gte":  20,
			            "lt":   30
			        }
			    }},
			    
			    // 满足一个确定值
	        	{
     "term": {
      "age":    26           }},
	        	{
     "term": {
      "class":    "三年一班"           }},
	        	
	        	// 相当于 tag in [ "search", "full_text", "nosql" ]
	        	{
     "terms": {
      "tag": [ "search", "full_text", "nosql" ] }},
	        	
	        	// 相当于 "title""body"中含有"full text search" 
        	   	{
     "multi_match": {
     
			        "query":    "full text search",
			        "fields":   [ "title", "body" ]
			    }}
	        ],
	        
	        // should 下的条件不需要全部满足,默认情况下只需要满足 should 下的一个条件即可,
	        "should": [
	            {
      "match":       {
      "starred": true }},
	            {
      "bool": {
     
	                "must":      {
      "match": {
      "folder": "inbox" }},
	                "must_not":  {
      "match": {
      "spam": true }}
	            }}
	        ],
	        
	        // 也可以通过 minimum_should_match 参数来改变需要满足的个数,满足的 should 条件越多,对应的文档的打分就越高,打分高的文档排序会靠前。
	        "minimum_should_match": 1
	        
	        // 文档 必须不 匹配这些条件才能被包含进来。
	        "must_not" : {
     
	        }
	        
	        // 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档
	        // 简答来说就是过滤文档,但不记录评分
	        "filter" : {
     
			}
	    }
	}
	
	// 排序,默认按照评分降序排序
    "sort": [
        {
      "date":   {
      "order": "desc" }},
        {
      "_score": {
      "order": "desc" }}
    ]
}

ps:must类似于sql的and,must_not类似于not,should类似于or

  1. 含有nested类型的字段需要查询

此时不能直接进行properties.name的形式进行查询,需要再包一层例如

GET /_search 
{
     
	"query" : {
     
		"bool" : {
     
			"filter" : {
     
				// 注意这里使用{
     }包起来了,key是0而不是nested
				{
     "nested" : {
     
					"path" : "properties",
					"query" : {
     
						// 注意这里也使用{
     }包起来了,key是0而不是term
						{
     "term" : {
     
							"properties.name" : "第一次"
						}}
					}
				}},
				// 注意这里使用{
     }包起来了,key是1而不是nested
				{
     "nested" : {
     
					"path" : "properties",
					"query" : {
     
						{
     "term" : {
     
							"properties.name" : "第二次"
						}}
					}
				}},
				// 注意这里使用{
     }包起来了,key是2而不是nested
				{
     "nested" : {
     
					"path" : "properties",
					"query" : {
     
						{
     "term" : {
     
							"properties.name" : "第三次"
						}}
					}
				}},
			}
		}
	}
}
  1. nested类型数据下,搜索结果的特殊情况
{
     
	"properties" : {
     
		// 此处的是字段名
		"properties" : {
     
			"type" : "nested",
			"properties" : {
     
				"name" : {
     "type" : "keyword"},
				"value" : {
     "type" : "keyword"},
			}
		}
	}
}

此时,如果有这样的数据

A产品属性

name value
个数 1
重量 2

B产品属性

name value
个数 2
重量 1

当筛选条件是

name = 个数
value = 1

结果两个产品都会出现,而不是只有A产品

这是因为对于nested下的数据,Elasticsearch 在存储多个值时会将值聚合,
类似于这样的结构

name = [个数,重量]
value = [1,2]

导致不管搜什么都是符合的

常用查询可以参考

你可能感兴趣的:(ES学习笔记,elasticsearch)