八、ElasticSerach搜索

8.1、批量导入数据

ES提供了Bulk的API 来进行批量操作。

数据结构类型,以换行区分

// 必须有一个索引叫book 
{"index": {"_index": "book", "_type": "_doc", "_id": 1}}
{"name": "权力的游戏"}
{"index": {"_index": "book", "_type": "_doc", "_id": 2}}
{"name": "疯狂的石头"}
// 结尾必须有换行

请求

curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @name 
// name就是文件的路径和名字

测试查询

{
	"query":{
		"match_all":{} 
	},
	"from": 0, 
	"size": 100
}

8.2、trem多种查询

单词级别查询

1、这些查询通常⽤于结构化的数据,比如:number、date、keyword等,而不是对text。

2、也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上

准备索引,进行批量导入,数据在player中

{
 	"mappings":{
 		"properties":{
 			"birthDay":{
 				"type":"date"
 			},
 			"birthDayStr": {
 				"type":"keyword"
 			},
 			"age":{
 				"type":"integer"
 			},
 			"code": {
 				"type":"text"
 			},
 			"country":{
 				"type":"text"
 			},
 			"display_affiliation":{
 				"type":"text"
 			},
 			"display_name": {
 				"type":"text"
 			},
 			"draft": {
 				"type":"long"
 			},
 			"height_value":{
 				"type":"float"
 			},
 			"jersey_no": {
 				"type":"text"
 			},
 			"play_year":{
 				"type":"long"
 			},
 			"player_id": {
 				"type":"keyword"
 			},
 			"position":{
 				"type":"text"
 			},
 			"school_type": {
 				"type":"text"
 			},
 			"team_conference": {
 				"type":"keyword"
 			},
 			"team_name": {
 				"type":"keyword"
 			},
 			"weight": {
 				"type":"text"
 			}
 		}
 	}
}
8.2.1、term query精准匹配查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{   
  	"query": {
    	"term": {
      		"jerse_no": 322
    	}
  	},
  	"from": 0,
  	"size": 100
}

响应

JAVA怎么实现搜索框_后端

8.2.2、exsit query在特定的字段中查找非空值的文档POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
    // 语义:查找team_name 不为空的数据
  	"query": {
    	"exists": {
      		"field": "team_name" 
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_02

8.2.3、prefix query 查找包含带有指定前缀term的文档POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
    // 语义:查找team_name 不为空的数据team_name必须为text类型
    // 使用前缀类型必须为keyword,不能为text
  	"query": {
    	"prefix": {
      		"team_name": "逗比组"
    	}
  	},
  	"from": 0,
 	"size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_02

8.2.4、wildcard query 支持通配符查询POST请求

*表示任意字符,?表示任意单个字符,类似SQL模糊查询

请求

http://localhost:9200/malamala/_search

请求体

{
	"query": {
	    "wildcard": {
	      	"team_name": "*"
	    }
  	},
  	"from": 0,
  	"size": 3
}

响应(响应内容和其他一致)

JAVA怎么实现搜索框_JAVA怎么实现搜索框_04

8.2.5、ids query 通过id批量查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"ids": {
      		"values": [1,2,3]
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应(响应内容和其他一致)

JAVA怎么实现搜索框_数据_05

8.3、范围查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
	// play_year为232-234之间的数据
  	"query": {
    	"range": {
      		"play_year":{   //play_year是Long类型 不要写成字符串
      			"gte": 232,
      			"lte" : 234
      		}
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应

JAVA怎么实现搜索框_java_06

8.4、布尔查询

type

description

must

必须出现在匹配文档中

filter

必须出现在文档中,但是不打分

must_not

不能出现在文档中

should

应该出现在文档中

8.4.1、must查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"bool": {     // 布尔查询
     		"must":[       //匹配查询方式
        		{
          			"match": {      // 全文搜索
            			"jerse_no": 322
          			}
        		}
        	]
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_07

8.4.2、filter查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"bool": {
      		"filter":[
        		{
          			"match": {
            			"jerse_no": 322
          			}
        		}
      		]
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应

JAVA怎么实现搜索框_java_08

8.4.3、should第一种查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
	// should应该但是不是必须
     "query": {
          "bool": {
               "filter": [
                    {
                         "match": {
                              "name": "超级逗比"
                         }
                    }
               ],
               "must_not": [
                    {
                         "term": {
                              "teamConferenceEn": {
                                   "value": "233"
                              }
                         }
                    }
               ],
               "should": [
                    {
                         "range": {
                              "play_year": {
                                   "gte": 232,
                                   "lte": 234
                              }
                         }
                    }
               ]
          }
     },
     "from": 0,
     "size": 3
}

响应

JAVA怎么实现搜索框_数据_09

8.4.4、should第二种查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
    // minimum_should_match=1最小匹配精度,至少有一个条件满足
  	"query": {
    	"bool": {
      		"filter":[
        		{
          			"match": {
            			"name": "超级逗比"
          			}
        		}
      		],
      		"must_not": [
        		{
          			"term": {
            			"teamConferenceEn": {
              				"value": 233
            			}
          			}
        		}
      		],
      		"should": [
        		{
          			"range": {
            			"play_year": {
              				"gte": 232,
              				"lte": 234
            			}
          			}
        		}
      		]
      		, "minimum_should_match": 1
    	}
  	},
  	"from": 0,
  	"size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_10

8.5、排序查询

8.5.1、第一种排序查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "match": {
               "team_name": "逗比组"
          }
     },
     "sort": [
          {
               "play_year": {
                    "order": "desc"
               }
          }
     ],
     "from": 0,
     "size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_10

8.5.2、第二种排序查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "match": {
               "team_name": "逗比组"
          }
     },
     "sort": [
          {
               "play_year": {
                    "order": "desc"
               }
          },
          {
               "heightValue": {
                    "order": "asc"
               }
          }
     ],
     "from": 0,
     "size": 3
}

响应

JAVA怎么实现搜索框_elasticsearch_10

8.6、聚合查询指标聚合

聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最⼤值、最⼩值、计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强⼤的聚合分析能力。

对⼀个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合。而关系型数据库中除了有聚合函数外,还可以对查询出的数据行分组group by,再在组上进行指标聚合。在ES中称为桶聚合。

8.6.1、max、min、sum、avg指标聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"term": {
      		"team_name": "逗比组"
    	}
  	},
  	"aggs": {           // aggs 代表使用聚合函数
    	"avgAge": {     // avgAge是自定义的,因为是查年年龄平均所以起名avgAge
      		"avg": {    // avg 平均
        		"field": "age"
      		}
    	}
  	}, 
	"from": 0,
    "size": 3
}

响应(因为没有数据)

JAVA怎么实现搜索框_JAVA怎么实现搜索框_13

8.6.2、_count指标聚合查询(严格来说不属于聚合)POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "term": {
               "team_name": "逗比组"
          }
     }
}

响应(因为没有数据)

JAVA怎么实现搜索框_JAVA怎么实现搜索框_14

8.6.3、cardinality指标聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"term": {
      		"team_name": "逗比组"
    	}
  	},
  	"aggs": {
    	"countAge": {        // 自定义名字
      		"cardinality": {        // 去掉相同的只保留一个值
        		"field": "age"
      		}
    	}
  	},
  	"size": 0
}

响应

JAVA怎么实现搜索框_数据_15

8.6.4、status种指标聚合查询POST请求

stats统计count、max、min、avg、sum共5个值

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "term": {
               "team_name": "逗比组"
          }
     },
     "aggs": {
          "status": {
               "stats": {
                    "field": "age"
               }
          }
     },
     "size": 0
}

响应

JAVA怎么实现搜索框_JAVA怎么实现搜索框_16

8.6.5、extended status种指标聚合查询POST请求

Extended stats比stats多4个统计结果:平⽅和、⽅差、标准差、平均值加减两个标准差的区间

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "term": {
               "team_name": "逗比组"
          }
     },
     "aggs": {
          "extendedStatsAge": {
               "extended_stats": {
                    "field": "age"
               }
          }
     },
     "size": 0
}

响应(因为没有数据)

JAVA怎么实现搜索框_后端_17

8.7、聚合查询桶聚合

8.7.1、terms aggregation桶聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"query": {
    	"term": {
      		"team_name": "逗比组"
    	}
  	},
  	"aggs": {
    	"aggrAge": {
      		"terms": {          // 因为根据年龄做桶聚合所以使用terms
        		"field": "age",
        		"size": 3       // 指定显示桶数
      		}
    	}
  	},
  	"size": 0
}

响应

JAVA怎么实现搜索框_数据_18

8.7.2、order分组聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
     "query": {
          "term": {
               "team_name": "逗比组"
          }
     },
     "aggs": {
          "aggrAge": {
               "terms": {
                    "field": "age",
                    "size": 3,
                    "order": {
                         "_key": "desc"
                    }
               }
          }
     },
     "size": 0
}

响应

JAVA怎么实现搜索框_后端_19

8.7.3、range aggregation范围分组聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"aggs": {
    	"ageRange": {
      		"range": {
        		"field": "age",
        		"ranges": [
          			{
            			"to": 20,  // 小于等于 20
            			"key": "A" //别名 A
          			},
          			{
            			"from": 20, // 大于等于20
            			"to": 35, //  小于等于 35
            			"key": "B"  //别名 B
          			},
          			{
            			"from": 35, // 大于等于35 
            			"key": "C" //别名 C
          			}
        		]
      		}
    	}
  	}, 
  	"size": 0
}

响应

JAVA怎么实现搜索框_java_20

8.7.4、date rabge aggregation时间范围分组聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"aggs": {
    	"birthDayRange": {
      		"date_range": {   // 时间类型
        		"field": "birthDay",   // 生日,生日是时间类型
        		"format": "MM-yyy",   //时间格式,月份年份
        		"ranges": [
          			{
            			"from": "01-1989" // 小于1989年1月出生
          			},
          			{
            			"from": "01-1989", // 1989年1月到1999年1月
            			"to": "01-1999"
          			},
          			{
            			"from": "01-1999", // 1999年1月到2009年1月
            			"to": "01-2009"
          			},
          			{
            			"from": "01-2009"
          			}
        		]
      		}
    	}
  	}, 
  	"size": 0
}

响应

JAVA怎么实现搜索框_java_21

8.7.5、date histogram aggregation时间范围分组聚合查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
  	"aggs": {
    	"birthday_aggs": {
      		"date_histogram": {
        		"field": "birthDay",    //生日字段
        		"format": "yyyy",     // 时间格式
        		"calendar_interval": "year"    // 根据年
      		}
    	}
  	}, 
  	"size": 0
}

响应

JAVA怎么实现搜索框_elasticsearch_22

8.8、query_string查询

8.8.1、query_string AND OR单字段查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
    // 语义: 指定单个字段查询
  	"query": {
    	"query_string": {
      		"default_field": "team_name",
      		"query": "逗比组"    // 这里可以使用or或and也就是sql里的or和and
    	}
  	},
  	"size": 3
}

响应

JAVA怎么实现搜索框_数据_23

8.8.2、query_string AND OR多字段查询POST请求

请求

http://localhost:9200/malamala/_search

请求体

{
    // 语义:指定多个字段查询
  	"query": {
    	"query_string": {
      		"fields": [     // 指定多个字段
        		"display_name",
        		"team_name"
        	],
        	"query": "*"     // 查询条件
    	}
  	},
  	"size": 3
}

响应

JAVA怎么实现搜索框_后端_24