get documents/_search
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"match": {
"name": {
"query": "我",
"boost": 3,
"operator": "and"
}
}
},
{
"multi_match": {
"query": "我",
"fields": [
"name",
"text"
],
"type": "cross_fields",
"boost": 2,
"operator": "and"
}
},
{
"match": {
"name": {
"query": "我",
"boost": 1.5,
"operator": "or"
}
}
},
{
"multi_match": {
"query": "我",
"fields": [
"name",
"text"
],
"type": "cross_fields",
"operator": "or"
}
}
]
}
},
"boost_mode": "sum",
"functions": [
{
"filter": {
"match": {
"type": "好"
}
},
"weight": 20
},
{
"filter": {
"match": {
"type": "坏"
}
},
"weight": 2
}
]
}
}
}
- 首先,整个查询被包裹在一个 function_score 查询中,这个查询允许通过各种函数来改变文档的得分。
- 在 function_score 查询的内部,有一个 query 子句,包含了一个布尔查询(bool query)。布尔查询是 Elasticsearch 中最灵活的查询类型之一,可以组合多个子查询,并通过 must、should、must_not 和 filter 来控制它们的关系。
- 在布尔查询的 should 子句中包含了四个子查询,它们被设计为根据不同的条件匹配文档:
- 第一个子查询是一个 match 查询,用于精确匹配字段 “name” 中包含 “我” 的文档,设置了较高的 boost(权重)。
- 第二个子查询是一个 multi_match 查询,使用 cross_fields 类型,同时匹配 “name” 和 “text” 字段中包含 “我” 的文档,同样设置了较高的 boost。
- 第三个子查询是一个 match 查询,使用了较低的 boost,并且使用了 or 运算符,表示匹配 “name” 字段中包含 “我” 的文档,但不强制要求所有查询项都匹配。
- 第四个子查询是一个 multi_match 查询,使用 cross_fields 类型和 or 运算符,允许匹配 “name” 和 “text” 字段中包含 “我” 的文档,但不要求所有查询项都匹配。
- 在 function_score 查询的另一个子句中,定义了两个函数,用于根据文档中 “type” 字段的值调整文档的得分:
- 第一个函数使用了一个 filter 来匹配 “type” 为 “好” 的文档,并为这些文档分配了较高的权重(20)。
- 第二个函数使用了一个 filter 来匹配 “type” 为 “坏” 的文档,并为这些文档分配了较低的权重(2)。
- 最后,在 function_score 查询中定义了 boost_mode 为 “sum”,表示函数得分会被相加到文档的基础得分上。