愚者求师之过,智者从师之长。

统计图书clcs字段中'建筑科学'出现的次数

Elasticsearch | 作者 CharlesX | 发布于2017年12月22日 | 阅读数:1632

需要解决的问题:

1. 当搜索内容为`工程`时,统计出`books`表中`clcs`字段为不同值的个数是多少
2. 当搜索内容为`工程`时,查找出`books`表中`clcs`字段值为`建筑科学`的文档


针对问题1我的语句如下,
```
GET /engineer/books/_search
{
"size":0,
"query":{
"multi_match": {
"query": "工程",
"fields": ["summary","isbn","series","keywords","bindingFormat","standardNo","editor","chiefEditor","publisher","name","clcs","sublibs"]
}
},
"aggs":{
"data":{
"terms": {
"field": "clcs.keyword"
}
}
}
}
```
搜索的结果如下:

WX20171222-095834.png




统计出的`clcs`字段为`建筑科学`的个数是139个
针对问题2我的解决方案是:
```
GET engineer/books/_search
{
"query":{
"bool":{
"should":{
"multi_match":{
"query":" 工程",
"fields": ["summary","isbn","series","keywords","bindingFormat","standardNo","editor","chiefEditor","publisher","name","clcs","sublibs"],
"type":"phrase"
}
},
"must":{
"match_phrase":{
"clcs":"建筑科学"
}
}

}
},
"_source":["name","isbn","clcs"]
}
```
结果为:




通过`total`字段可以看到,查询出来的文档个数为146,跟之前查询出来的139个相差了,这是为什么呢?


PS: `clcs`字段是一个数组,也就是说clcs字段存在下面的情况`['建筑科学','电工技术']`
1.png
已邀请:

strglee

赞同来自: CharlesX

原因在于,当must(必须匹配) should(至少匹配一条) 同时存在的话 这条查询就变成了 至少匹配must  "clcs":"建筑科学" ,而匹配 "建筑科学" 但不匹配 "工程" 的记录就会被包含进来,
如果要改成 ”工程“也必须配置 可以添加
"minimum_should_match": 1,
{
"query":{
"bool":{
"should":{
"multi_match":{
"query":" 工程",
"fields":[
"summary",
"isbn",
"series",
"keywords",
"bindingFormat",
"standardNo",
"editor",
"chiefEditor",
"publisher",
"name",
"clcs",
"sublibs"
],
"type":"phrase"
}
},
"minimum_should_match":1,
"must":{
"match_phrase":{
"clcs":"建筑科学"
}
}
}
},
"_source":[
"name",
"isbn",
"clcs"
]
}

要回复问题请先登录注册