match匹配怎么当成布尔查询来使用
到现在为止,你可能已经意识到在一个布尔查询中多字段match
查询仅仅包裹了已经生成的term
查询。通过默认的or
操作符,每个term
查询都会像一个should
子句一样被添加,只要有一个子句匹配就可以了。下面的两个查询是等价的:
{
"match": { "title": "brown fox"}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
通过and
操作符,所有的term
查询会像must
子句一样被添加,因此所有的子句都必须匹配。下面的两个查询是等价的:
{
"match": {
"title": {
"query": "brown fox",
"operator": "and"
}
}
}
{
"bool": {
"must": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
如果minimum_should_match
参数被指定,match
查询就直接被转换成一个bool
查询,下面两个查询是等价的:
{
"match": {
"title": {
"query": "quick brown fox",
"minimum_should_match": "75%"
}
}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }},
{ "term": { "title": "quick" }}
],
"minimum_should_match": 2 <1>
}
}
<1>因为只有三个子句,所以 minimum_should_match
参数在match
查询中的值75%
就下舍到了2
。3个should
子句中至少有两个子句匹配。1>
当然,我们通常写这些查询类型的时候还是使用match
查询的,但是理解match
查询在内部是怎么工作的可以让你在任何你需要使用的时候更加得心应手。有些情况仅仅使用一个match
查询是不够的,比如给某些查询词更高的权重。这种情况我们会在下一节看个例子。