对es查询的索引的company,其有如下字段,下面是一个示例数据
"id": "1", //id
"name": "张三",//姓名
"sex": "男",//性别
"age": 49,//年龄
"birthday": "1970-01-01",//生日
"position": "董事长",//职位
"joinTime": "1990-01-01",//入职时间,日期格式
"modified": "1562167817000",//修改时间,毫秒
"created": "1562167817000" //创建时间,毫秒
下面的搜索都会将关系型数据库语句转换成es的搜索api以及参数。
主要是用post方式,用DSL(结构化查询)语句进行搜索。
一、查询
1、简单搜索
【sql】
select * from company
【ES】有两种方式
1、GET http://192.168.197.100:9200/company/_search
2、POST http://192.168.197.100:9200/company/_search
{
"query":{"match_all":{}}
}
2、精确匹配(不对查询文本进行分词)
【sql】
select * from company where name='张三'
【ES】
POST http://192.168.197.100:9200/company/_search
{
"query":{
"term":{"name.keyword":"张三"}
}
}
term是用于精确匹配的,类似于sql语句中的“=”,因为“name”字段用的是standard默认分词器,其会将“张三”分成“张”和“三”,并不会匹配姓名为“张三”的人,而name.keyword可以让其不会进行分词。
也可以是terms,这个可以用多个值去匹配一个字段,例如
【sql】
select * from company where name in ('张三','李四')
【ES】
POST http://192.168.197.100:9200/company/_search
{
"query": {
"terms": {
"name.keyword": ["张三", "李四"]
}
}
}
3、模糊匹配
【sql】
select * from company where name like '%张%'
【ES】
POST http://192.168.197.100:9200/company/_search
{
"query": {
"match": {
"name": "张"
}
}
}
上述查询会查出姓名中带有“张”字的文档
4、分页查询
【sql】
select * from company limit 0,10
【ES】
POST http://192.168.197.100:9200/company/_search
{
"from":0,
"size":10
}
【注意】from+size不能大于10000,也可以进行修改,但不建议这么操作,因为es主要分片模式,其会在每个分片都会执行一样的查询,然后再进行汇总排序,如果数据太大,会撑爆内存。例如每个分片都查询出10000条,总共5个分片,最后就会进行50000条数据的排序,最后再取值。
5、范围查询并进行排序
【sql】
select * from company where age>=10 and age<=50
【ES】
POST http://192.168.197.100:9200/company/_search
{
"query":{
"range":{
"age":{
"gte":10,
"lte":50
}
}
},
"sort":{
"age":{
"order":"desc"
}
}
}
范围查询是range,有四种参数
(1)gte:大于等于
(2)gt:大于
(3)lte:小于等于
(4)lt:小于
排序是sort,降序是desc,升序是asc,可以有多个排序字段
6、多字段匹配查询
【sql】
select * from company where sex like '%男%' or name like '%男%'
【ES】
POST http://192.168.197.100:9200/company/_search
{
"query":{
"multi_match":{
"query":"男",
"fields":["name","sex"]
}
}
}
7、bool查询(结构化查询)
结构化查询主要有三块,分别是must,should,must_not,filter
(1)must:里面的条件都是“并”关系,都匹配
(2)should:里面的条件都是“或”关系,有一个条件匹配就行
(3)must_not:里面的条件都是“并”关系,都不能匹配
(4)filter:过滤查询,不像其它查询需要计算_score相关性,它不进行此项计算,故比query查询快
例如:
条件:
年龄在10到50,性别是男
性别一定不能是女
id是1~8的或者职位带有“董”字的
【sql】
select * from company where (age>=10 and age=50 and sex="男")
and (sex!="女")
and (id in (1,2