elasticsearch优化之多字段搜索multi_match查询

1 首先说下multi_match多字段匹配的三种类型,分别是best_fields(最佳字段) 、 most_fields(多数字段) 和 cross_fields(跨字段)
2 best_fields类型,multi_match默认的查询类型,可以省略不写,返回某一个字段匹配到最多关键字的文档,比如我搜索”李安生日“,下面有两个文档

GET /news/_search
{
  "query": {
	  "multi_match": {		
			"query": "李安生日",
			"fields": ["headline", "summary"],
			"type":    "best_fields",
		}
    }

doc1:
“headline”: “李安携新电影要与观众见面了”
“summary”: “特意安排在生日这天上映新电影”
doc2:
“headline” : “向李安同志学习”
“summary” : "李安同志的英雄事迹得到了弘扬”
应该返回doc1才是我们想要的结果,然而并不是,这个时候就需要兼顾到summary字段的匹配得分了,通过公式先看下:score=best_field.scoreboost+other_fieldsboost.score*tie_breaker,这样就得到了一个均衡的得分了。

GET /news/_search
{
  "query": {
	  "multi_match": {
			"query": "李安生日",
			"fields": ["headline", "summary"],
			"type": "best_fields",
			"tie_breaker": 0.3
		}
    }
}

tie_breaker是将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker参数将其它每个匹配的子句的分值乘以tie_breaker,以达到取得最佳匹配查询子句的_score
3 most_fields多数字段匹配成功的得分之和,字段匹配越多,得分越高,例如搜索“李安”,很显然文档doc2的匹配度高于文档doc1

GET /news/_search
{
  "query": {
	  "multi_match": {
			"query": "李安",
			"fields": ["headline", "summary"],
			 "type": "most_fields"
			 
		}
    }
}

4 cross_fields指的是一个唯一标识,跨域了多个字段,比如人的标识是名字,一个建筑的标识是地址,姓名跨域散落在多个field中,比如first_name和last_name,一个地址也可以散落在多个字段中,比如country,province,city中。

GET /area/_search
{
	"query": {
		"multi_match": {
			"query": "河南省郑州市",
			"fields": ["province", "city"],
			"type": "cross_fields",
			"operator": "and"
		}
	}
}

operator使用and,是要返回两者同时匹配成功的结果。

你可能感兴趣的:(ElasticSearch)