【1】创建es7 索引
put localhost:9200/pdi_cust , 注意 PUB_CUST_LABEL 字段分词了。 es7 不支持type ,所以 无需指定type。
{
"mappings" :{
"properties":{
"RCRD_ID":{
"type":"keyword"
}
, "BUSI_CODE":{
"type":"keyword"
}
, "STATE":{
"type":"keyword"
}
, "LOANS":{
"type":"nested"
, "properties" :{
"LOAN_NUM":{
"type":"keyword"
}
, "PUB_CUST_LABEL":{
"type":"text"
}
, "DATA_SRC":{
"type":"keyword"
}
, "CUST_NUM": {
"type":"keyword"
}
, "LOAN_BAL_SUM":{
"type":"double"
}
, "OVD_MONEY_SUM": {
"type": "double"
}
}
}
}
}
}
【2】插入索引文档: post localhost:9200/pdi_cust/_doc/tr_rd_01
{
"RCRD_ID":"tr_rd_01"
, "STATE":"PDOS"
, "BUSI_CODE":"pdi"
, "LOANS":[
{"CUST_NUM":"CUST_NUM_01", "DATA_SRC":"VALD", "LOAN_BAL_SUM":"1111", "LOAN_NUM":"LOAN_NUM_01", "OVD_MONEY_SUM":"1111", "PUB_CUST_LABEL":"张三 李四 王五"}
]
}
【3】查询索引所有文档
post localhost:9200/pdi_cust/_search
{}
// 查询es所有文档
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_score": 1.0,
"_source": {
"RCRD_ID": "tr_rd_01",
"STATE": "PDOS",
"BUSI_CODE": "pdi",
"LOANS": [
{
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1111",
"LOAN_NUM": "LOAN_NUM_01",
"OVD_MONEY_SUM": "1111",
"PUB_CUST_LABEL": "张三 李四 王五"
},
{
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "2222",
"LOAN_NUM": "LOAN_NUM_02",
"OVD_MONEY_SUM": "2222",
"PUB_CUST_LABEL": "张三2 李四2 王五2"
}
]
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_02",
"_score": 1.0,
"_source": {
"RCRD_ID": "tr_rd_02",
"STATE": "PDOS",
"BUSI_CODE": "pdi",
"LOANS": [
{
"CUST_NUM": "CUST_NUM_02",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1113",
"LOAN_NUM": "LOAN_NUM_3",
"OVD_MONEY_SUM": "1113",
"PUB_CUST_LABEL": "李四"
},
{
"CUST_NUM": "CUST_NUM_02",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1114",
"LOAN_NUM": "LOAN_NUM_4",
"OVD_MONEY_SUM": "1114",
"PUB_CUST_LABEL": "张三"
}
]
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_03",
"_score": 1.0,
"_source": {
"RCRD_ID": "tr_rd_03",
"STATE": "PDOS",
"BUSI_CODE": "pdi",
"LOANS": [
{
"CUST_NUM": "CUST_NUM_03",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1115",
"LOAN_NUM": "LOAN_NUM_5",
"OVD_MONEY_SUM": "1115",
"PUB_CUST_LABEL": "李四 王五"
},
{
"CUST_NUM": "CUST_NUM_03",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1116",
"LOAN_NUM": "LOAN_NUM_6",
"OVD_MONEY_SUM": "1116",
"PUB_CUST_LABEL": "张三"
}
]
}
}
]
}
}
【4】根据嵌套类型查询 (filter 与 must 是属于同一个级别的查询方式,都可以作为 query->bool 的属性)
【3】根据嵌套类型查询 (filter 与 must 是属于同一个级别的查询方式,都可以作为 query->bool 的属性)
3.1、filter: 不计算评分, 查询效率高;有缓存; (推荐)
+ term: 精确匹配;
+ match: 模糊匹配, 倒排索引;
3.2、must: 要计算评分,查询效率低;无缓存;
+term: 精确匹配 , 要评分;
+match:模糊匹配, 要评分;
【荔枝】
1、使用 filter+term实现精确匹配不计分查询;
// dsl
{
"_source":["RCRD_ID", "STATE", "BUSI_CODE"]
, "query":{
"bool":{
"filter":[
{
"term":{
"STATE":"PDOS"
}
}
, {
"nested":{
"path":"LOANS"
, "query":{
"bool":{
"filter":[
{
"term": {
"LOANS.LOAN_NUM": "LOAN_NUM_01"
}
}
]
}
}
, "inner_hits": {
}
}
}
]
}
}
}
// 查询结果
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_score": 0.0,
"_source": {
"RCRD_ID": "tr_rd_01",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1111",
"LOAN_NUM": "LOAN_NUM_01",
"OVD_MONEY_SUM": "1111",
"PUB_CUST_LABEL": "张三 李四 王五"
}
}
]
}
}
}
}
]
}
}
score 为0则表示没有计算得分;
2、使用filter+match 使用不计算得分,但模糊匹配;
// dsl
{
"_source":["RCRD_ID", "STATE", "BUSI_CODE"]
, "query":{
"bool":{
"filter":[
{
"match":{
"STATE":"PDOS"
}
}
, {
"nested":{
"path":"LOANS"
, "query":{
"bool":{
"filter":[
{
"match": {
"LOANS.PUB_CUST_LABEL": "张三 李四"
}
}
]
}
}
, "inner_hits": {
}
}
}
]
}
}
}
// 结果
{
"took": 35,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_score": 0.0,
"_source": {
"RCRD_ID": "tr_rd_01",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1111",
"LOAN_NUM": "LOAN_NUM_01",
"OVD_MONEY_SUM": "1111",
"PUB_CUST_LABEL": "张三 李四 王五"
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_nested": {
"field": "LOANS",
"offset": 1
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "2222",
"LOAN_NUM": "LOAN_NUM_02",
"OVD_MONEY_SUM": "2222",
"PUB_CUST_LABEL": "张三2 李四2 王五2"
}
}
]
}
}
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_02",
"_score": 0.0,
"_source": {
"RCRD_ID": "tr_rd_02",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_02",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_02",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1113",
"LOAN_NUM": "LOAN_NUM_3",
"OVD_MONEY_SUM": "1113",
"PUB_CUST_LABEL": "李四"
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_02",
"_nested": {
"field": "LOANS",
"offset": 1
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_02",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1114",
"LOAN_NUM": "LOAN_NUM_4",
"OVD_MONEY_SUM": "1114",
"PUB_CUST_LABEL": "张三"
}
}
]
}
}
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_03",
"_score": 0.0,
"_source": {
"RCRD_ID": "tr_rd_03",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_03",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_03",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1115",
"LOAN_NUM": "LOAN_NUM_5",
"OVD_MONEY_SUM": "1115",
"PUB_CUST_LABEL": "李四 王五"
}
},
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_03",
"_nested": {
"field": "LOANS",
"offset": 1
},
"_score": 0.0,
"_source": {
"CUST_NUM": "CUST_NUM_03",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1116",
"LOAN_NUM": "LOAN_NUM_6",
"OVD_MONEY_SUM": "1116",
"PUB_CUST_LABEL": "张三"
}
}
]
}
}
}
}
]
}
}
以上dsl,把 match 换位 term, 查询不到任何结果,因为 PUB_CUST_LABEL 是 text 类型,分词了,term是精确匹配;
3、使用 must+term, 实现计算得分并精确匹配(查询效率低于 filter+term),因为 must要计算匹配得分
// dsl
{
"_source":["RCRD_ID", "STATE", "BUSI_CODE"]
, "query":{
"bool":{
"must":[
{
"term":{
"STATE":"PDOS"
}
}
, {
"nested":{
"path":"LOANS"
, "query":{
"bool":{
"must":[
{
"term": {
"LOANS.LOAN_NUM": "LOAN_NUM_01"
}
}
]
}
}
, "inner_hits": {
}
}
}
]
}
}
}
// 结果
{
"took": 13,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6739764,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_score": 1.6739764,
"_source": {
"RCRD_ID": "tr_rd_01",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.5404451,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 1.5404451,
"_source": {
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1111",
"LOAN_NUM": "LOAN_NUM_01",
"OVD_MONEY_SUM": "1111",
"PUB_CUST_LABEL": "张三 李四 王五"
}
}
]
}
}
}
}
]
}
}
4、使用must+match实现计算得分且走倒排索引查询或模糊查询
// dsl
{
"_source":["RCRD_ID", "STATE", "BUSI_CODE"]
, "query":{
"bool":{
"must":[
{
"match":{
"STATE":"PDOS"
}
}
, {
"nested":{
"path":"LOANS"
, "query":{
"bool":{
"must":[
{
"match": {
"LOANS.LOAN_NUM": "LOAN_NUM_01"
}
}
]
}
}
, "inner_hits": {
}
}
}
]
}
}
}
//结果
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6739764,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_score": 1.6739764,
"_source": {
"RCRD_ID": "tr_rd_01",
"STATE": "PDOS",
"BUSI_CODE": "pdi"
},
"inner_hits": {
"LOANS": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.5404451,
"hits": [
{
"_index": "pdi_cust",
"_type": "_doc",
"_id": "tr_rd_01",
"_nested": {
"field": "LOANS",
"offset": 0
},
"_score": 1.5404451,
"_source": {
"CUST_NUM": "CUST_NUM_01",
"DATA_SRC": "VALD",
"LOAN_BAL_SUM": "1111",
"LOAN_NUM": "LOAN_NUM_01",
"OVD_MONEY_SUM": "1111",
"PUB_CUST_LABEL": "张三 李四 王五"
}
}
]
}
}
}
}
]
}
}
【小结】
1、对于 keyword类型的字段而言, 用 term 和 match 都是可以查询的;但对于 text 类型的分词字段而言,只能用match 才能够查询到结果;
2、根据嵌套类型查询 (filter 与 must 是属于同一个级别的查询方式,都可以作为 query->bool 的属性)
2.1、filter: 不计算评分, 查询效率高;有缓存; (推荐)
+ term: 精确匹配;
+ match: 模糊匹配, 倒排索引;
2.2、must: 要计算评分,查询效率低;无缓存;
+term: 精确匹配 , 要评分;
+match:模糊匹配, 要评分;