empId:员工id, salary 表示薪资, deptName:部门, address:地址
POST /testboost/_bulk
{"index":{"_id": 1}}
{"empId" : "111","name" : "员工1","age" : 20,"sex" : "男","mobile" : "19000001111","salary":1333,"deptName" : "技术部","address" : "湖北省武汉市洪山区光谷大厦"}
{"index":{"_id": 2}}
{"empId" : "222","name" : "员工2","age" : 25,"sex" : "男","mobile" : "19000002222","salary":15963,"deptName" : "销售部","address" : "湖北省武汉市江汉路"}
{"index":{"_id": 3}}
{ "empId" : "333","name" : "员工3","age" : 30,"sex" : "男","mobile" : "19000003333","salary":20000,"deptName" : "技术部","address" : "湖北省武汉市经济开发区"}
{"index":{"_id": 4}}
{"empId" : "444","name" : "员工4","age" : 20,"sex" : "女","mobile" : "19000004444","salary":5600,"deptName" : "销售部","address" : "湖北省武汉市沌口开发区"}
{"index":{"_id": 5}}
{ "empId" : "555","name" : "员工5","age" : 20,"sex" : "男","mobile" : "19000005555","salary":9665,"deptName" : "测试部","address" : "湖北省武汉市东湖隧道"}
{"index":{"_id": 6}}
{"empId" : "666","name" : "员工6","age" : 30,"sex" : "女","mobile" : "19000006666","salary":30000,"deptName" : "技术部","address" : "湖北省武汉市江汉路"}
{"index":{"_id": 7}}
{"empId" : "777","name" : "员工7","age" : 60,"sex" : "女","mobile" : "19000007777","salary":52130,"deptName" : "测试部","address" : "湖北省黄冈市边城区"}
{"index":{"_id": 8}}
{"empId" : "888","name" : "员工8","age" : 19,"sex" : "女","mobile" : "19000008888","salary":60000,"deptName" : "技术部","address" : "湖北省武汉市江汉大学"}
{"index":{"_id": 9}}
{"empId" : "999","name" : "员工9","age" : 40,"sex" : "男","mobile" : "19000009999","salary":23000,"deptName" : "销售部","address" : "河南省郑州市郑州大学"}
{"index":{"_id": 10}}
{"empId" : "101010","name" : "张湖北","age" : 35,"sex" : "男","mobile" : "19000001010","salary":18000,"deptName" : "测试部","address" : "湖北省武汉市东湖高新"}
{"index":{"_id": 11}}
{"empId" : "111111","name" : "王河南","age" : 61,"sex" : "男","mobile" : "19000001011","salary":10000,"deptName" : "销售部","address" : "河南省开封市河南大学"}
{"index":{"_id": 12}}
{"empId" : "121212","name" : "张大学","age" : 26,"sex" : "女","mobile" : "19000001012","salary":1321,"deptName" : "测试部","address" : "河南省开封市河南大学"}
{"index":{"_id": 13}}
{"empId" : "131313","name" : "李江汉","age" : 36,"sex" : "男","mobile" : "19000001013","salary":1125,"deptName" : "销售部","address" : "河南省郑州市二七区"}
{"index":{"_id": 14}}
{"empId" : "141414","name" : "王技术","age" : 45,"sex" : "女","mobile" : "19000001014","salary":6222,"deptName" : "测试部","address" : "河南省郑州市金水区"}
{"index":{"_id": 15}}
{"empId" : "151515","name" : "张测试","age" : 18,"sex" : "男","mobile" : "19000001015","salary":20000,"deptName" : "技术部","address" : "河南省郑州高新开发区"}
Match就是匹配, 切分关键字,输入 湖北省, 切分 湖/北/省
//查询地址 中包含湖北省
get /testboost/_search
{
"query":{
"match": {
"address": "湖北省"
}
}
}
如果我想查 “湖北省” 不要 查 省的 结果中不带 河南省的 那么就要 用到 match_phrase 把查询条件当作 短语来查找了
//把湖北省当作 短语不分词 模糊查询 ,比如 湖北省xxx ,湖北省 都查出来
get /testboost/_search
{
"query":{
"match_phrase": {
"address": "湖北省"
}
}
}
可以看到 查询结果都是 湖北的 ,是没 河南省信息的, 包含湖北省的才会查出来
按照官方文档 term应该是不分词就查询的, 所以我们 直接把 整个地址 当作查询 就行
//term不分词, 直接查 整个地址是 湖北省武汉市经济开发区 的,结果查不出来,为什么?
get /testboost/_search
{
"query":{
"term": {
"address": "湖北省武汉市经济开发区"
}
}
}
可以看到 是没有数据的,为什么 , 明明我的数据 中有 地址是 “湖北省武汉市经济开发区” 的数据的?
!!! 使用term去查询,其实是拿查询条件和被分词的索引关键字一一匹配,
我们的address是个text类型的字段,被分词器分词了,并且 湖北省武汉市经济技术开发区 就被 分成了 一个个字的 分词 , 需要你在构建索引的时候 插入mapping 指定 ,确保字段是no analyzed的。 建索引的时候要注意
既然这样, term根据 索引去查询, 我的索引又是单个字的, 我试试单个字查询有没有问题, 搜"区" 是没问题的
我想搜 地址必须湖北省,性别男 并且 部门是技术部 或者 销售部 操作 就是 A && B && ( C || D) 这种查询应该如何查
地址 must操作, 技术部或者测试部 should操作
注意 此时 Must 条件和 Should 是同等级别的 ,
# 执行错误示范 这个是 address=湖北省 and sex=男 or 部门=技术部/销售部, 会把 测试部的人拉出来, 说明should 不生效
# 此时 must 和 should 是同等级别的
get /testboost/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"address": "湖北省"
}
},
{
"match": {
"sex": "男"
}
}
],
"should": [
{
"match_phrase": {
"deptName": "销售部"
}
},
{
"match_phrase": {
"deptName": "技术部"
}
}
]
}
}
}
错误的查询结果 , 为什么should 不生效呢? 为什么把 测试部们查了出来, 明明should 写了 只查满足 部门=销售部或技术部的,但是结果把测试部查了出来
所以 应该怎么写?结论就是 应该把 should 放到 Must中 试一试
湖北省 && 男生 && (技术部 || 销售部) ? 如何实现
get /testboost/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"address": "湖北省"
}
},
{
"match": {
"sex": "男"
}
},
//注意 查询 should 是在must 内部写的,should要用 bool结构
{
"bool": {
"should": [
{
"match_phrase": {
"deptName": "技术部"
}
},
{
"match_phrase": {
"deptName": "销售部"
}
}
]
}
}
]
}
}
}
看下结果, 只有 湖北省且 男且 部门是销售部或技术部 的才查出来, 结果正确
注意 此时 should是放在 must 内层的, 和 湖北省, 男 , 是同等级别 ,这就是区别
结果正常
湖北省 && 男生 && (技术部 || 销售部) ?filter如何实现 其实就是 先查出来 湖北省 && 男生的 所有部门的信息
然后过滤 filter 过滤出来 是技术部或者销售部的 信息
# 湖北省 && 男生 && (技术部 || 销售部) filter 先用 must 查 湖北省and男 结果,然后过滤 技术部或者销售部的人
get /testboost/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"address": "湖北省"
}
},
{
"match_phrase": {
"sex": "男"
}
}
],
"filter": [
{
"bool": {
"should": [
{
"match_phrase": {
"deptName": "技术部"
}
},
{
"match_phrase": {
"deptName": "销售部"
}
}
]
}
}
]
}
}
}
看下结果, 只有 湖北省且 男且 部门是销售部或技术部 的才查出来,通过filter 也是能够得出正确结果的
结果正常
至此 我们Match Match_phrase 及Term 使用和区别 也讲了, Must及should 组合并列使用的 如何正确查出结果 也讲了, 下一篇 我们将 如何排名