7.搜索时控制精准度

主要知识点:

  • 1、全文检索的时候,进行多个值的检索,有两种做法,match queryshould
  • 2、控制搜索结果精准度:and operatorminimum_should_match

   

   

1、准备数据:为帖子数据增加标题字段

   

POST /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"} }

   

2、搜索标题中包含javaelasticsearchblog

这个查询条件就跟之前的那个term query不一样了。term queryexact value,这个查询条件是进行full text(全文检索)。match query就是负责进行全文检索的。当然,如果检索到的fieldnot_analyzed类型的,那么match query也相当于term query

   

GET /forum/article/_search

{

"query": {

"match": {

"title": "java elasticsearch"

}

}

}

   

3、搜索标题中包含javaelasticsearchblog

   

搜索结果精准控制的第一步:灵活使用and关键字,如果你是希望所有的搜索关键字都要匹配的,那么就用and,可以实现单纯match query无法实现的效果。

   

GET /forum/article/_search

{

"query": {

"match": {

"title": {

"query": "java elasticsearch",

"operator": "and"

         }

}

}

}

   

4、搜索包含javaelasticsearchsparkhadoop4个关键字中,至少3个的blog

   

控制搜索结果的精准度的第二步:指定一些关键字中,必须至少匹配其中的多少个关键字,才能作为结果返回

   

GET /forum/article/_search

{

"query": {

"match": {

"title": {

"query": "java elasticsearch spark hadoop",

"minimum_should_match": "75%"

}

}

}

}

   

5、用bool组合多个搜索条件,来搜索title

   

GET /forum/article/_search

{

"query": {

"bool": {

"must": { "match": { "title": "java" }},

"must_not": { "match": { "title": "spark" }},

"should": [

{ "match": { "title": "hadoop" }},

{ "match": { "title": "elasticsearch" }}

]

}

}

}

   

6bool组合多个搜索条件,如何计算relevance score

   

mustshould搜索对应的分数,加起来,除以mustshould的总数得到相关度分数

本例中

排名第一:java,同时包含should中所有的关键字,hadoopelasticsearch

排名第二:java,同时包含should中的elasticsearch

排名第三:java,不包含should中的任何关键字

由此should是可以影响相关度分数的,must是确保必须这个关键字,同时会根据这个must的条件去计算出document对这个搜索条件的relevance score在满足must的基础之上,should中的条件也可以不匹配,但是如果匹配的更多,那么documentrelevance score就会更高。

   

7、搜索javahadoopsparkelasticsearch,至少包含其中3个关键字(用bool实现)

   

默认情况下,should中的条件是可以一个都不匹配的,比如上面的搜索中,this is java blog,就没有匹配任何一个should条件。但是如果没有所在的查询语句中没有must语句的话,那么should必须至少匹配一个才可以。

也可以精准控制should的多个条件中,至少匹配几个才能作为结果返回

   

GET /forum/article/_search

{

"query": {

"bool": {

"should": [

{ "match": { "title": "java" }},

{ "match": { "title": "elasticsearch" }},

{ "match": { "title": "hadoop" }},

{ "match": { "title": "spark" }}

],

"minimum_should_match": 3

}

}

}

posted @ 2018-02-28 16:24  outback123  阅读(272)  评论(0编辑  收藏  举报