准备工作
为帖子增加标题字段1
2
3
4
5
6
7
8
9
10
11POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"title" : "this is java and elasticsearch blog"} }
{ "update": { "_id": "2"} }
{ "doc" : {"title" : "this is java blog"} }
{ "update": { "_id": "3"} }
{ "doc" : {"title" : "this is elasticsearch blog"} }
{ "update": { "_id": "4"} }
{ "doc" : {"title" : "this is java, elasticsearch, hadoop blog"} }
{ "update": { "_id": "5"} }
{ "doc" : {"title" : "this is spark blog"} }
需求一
搜索标题中包含java 或 elasticsearch的帖子1
2
3
4
5
6
7
8GET /forum/article/_search
{
"query": {
"match": {
"title": "java elasticsearch"
}
}
}
就是只要标题中有java,elasticsearch其中的一个就可以作为返回结果,这个就和之前我们说的term query不一样了, term query是exact value,而这里的搜索是full text
match query是负责全文检索的,当然如果要检索的field是not_analyzed不分词的,那么他的作用就和term query是一样的
需求二
搜索标题中包含 java 和 elasticsearch的帖子1
2
3
4
5
6
7
8
9
10
11GET /forum/article/_search
{
"query": {
"match": {
"title":{
"query": "java elasticsearch",
"operator": "and"
}
}
}
}
搜索结果精准度控制的第一步:灵活使用and关键字,如果希望所有的搜索关键字都要匹配,那么就用and,可以实现单纯match query无法实现的效果
需求三
搜索包含java,elasticsearch,spark,hadoop,4个关键字中,至少3个的帖子1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16GET forum/article/_search
{
"query": {
"match": {
"title":{
"query": "java elasticsearch spark hadoop",
"minimum_should_match":"75%"
}
}
}
}
```
搜索结果精准度控制第二步:指定一些关键字中至少匹配到其中多少个关键字才能作为返回结果
#### bool组合搜索
GET forum/article/_search
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“title”: “java”
}
}
],
“must_not”: [
{
“match”: {
“title”: “spark”
}
}
],
“should”: [
{
“match”: {
“title”: “hadoop”
}
},
{
“match”: {
“title”: “elasticsearch”
}
}
]
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17看一下上面这个搜索请求, 就是搜索必须包含java,必须不包含spark,可以包含hadoop或elasticsearch的数据
#### bool组合多个搜索条件,计算relevance score的规则
**must和should搜索对应的分数,加起来,除以must和should的总数**
在上面这个查询中:
排名第一:java,同时包含should中所有的关键字,hadoop,elasticsearch
排名第二:java,同时包含should中的elasticsearch
排名第三:java,不包含should中的任何关键字
should是会影响相关度分数的
must是确保说,谁必须有这个关键字,同时会根据这个must的条件去计算出document对这个搜索条件的relevance score
在满足must的基础之上,should中的条件,不匹配也可以,但是如果匹配的更多,那么document的relevance score就会更高
#### 用bool组合查询实现需求三
搜索包含java,elasticsearch,spark,hadoop,4个关键字中,至少3个的帖子
GET /forum/article/_search
{
“query”: {
“bool”: {
“should”: [
{
“match”: {
“title”: “java”
}
},
{
“match”: {
“title”: “elasticsearch”
}
},
{
“match”: {
“title”: “spark”
}
},
{
“match”: {
“title”: “hadoop”
}
}
],
“minimum_number_should_match”: 3
}
}
}`
默认情况下should是可以不匹配任何一个的,但是如果没有must的话 should中必须匹配一个才可以,但是也可以通过我们上面请求用到的minimum_number_should_match 来控制必须满足几个才能作为返回结果
总结
全文见检索的时候,进行多个值的检索,可以用match query 也可以空should
搜过结果精准度控制: 用 and operator 或 minimum_number_should_match