使用阿里云试用Elasticsearch学习:function_score 语法例句

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
        }
      ]
    }
  }
}
  1. 首先,整个查询被包裹在一个 function_score 查询中,这个查询允许通过各种函数来改变文档的得分。
  2. 在 function_score 查询的内部,有一个 query 子句,包含了一个布尔查询(bool query)。布尔查询是 Elasticsearch 中最灵活的查询类型之一,可以组合多个子查询,并通过 must、should、must_not 和 filter 来控制它们的关系。
  3. 在布尔查询的 should 子句中包含了四个子查询,它们被设计为根据不同的条件匹配文档:
    • 第一个子查询是一个 match 查询,用于精确匹配字段 “name” 中包含 “我” 的文档,设置了较高的 boost(权重)。
    • 第二个子查询是一个 multi_match 查询,使用 cross_fields 类型,同时匹配 “name” 和 “text” 字段中包含 “我” 的文档,同样设置了较高的 boost。
    • 第三个子查询是一个 match 查询,使用了较低的 boost,并且使用了 or 运算符,表示匹配 “name” 字段中包含 “我” 的文档,但不强制要求所有查询项都匹配。
    • 第四个子查询是一个 multi_match 查询,使用 cross_fields 类型和 or 运算符,允许匹配 “name” 和 “text” 字段中包含 “我” 的文档,但不要求所有查询项都匹配。
  4. 在 function_score 查询的另一个子句中,定义了两个函数,用于根据文档中 “type” 字段的值调整文档的得分:
    • 第一个函数使用了一个 filter 来匹配 “type” 为 “好” 的文档,并为这些文档分配了较高的权重(20)。
    • 第二个函数使用了一个 filter 来匹配 “type” 为 “坏” 的文档,并为这些文档分配了较低的权重(2)。
  5. 最后,在 function_score 查询中定义了 boost_mode 为 “sum”,表示函数得分会被相加到文档的基础得分上。
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值