查询ES之细化需求实现多字段、范围过滤、加权和高亮

2024-03-20 1311阅读

温馨提示:这篇文章已超过369天没有更新,请注意相关的内容是否还可用!

多字段查询和过滤

一次从两个字段中查询同一个搜索词,比如从title和content中进行查询,另外指定active字段的值必须为true(一般代表该文档未被删除或隐藏):

GET /docwrite2/_search
{  
  "query": {  
    "bool": {  
      "must": [  
        {  
          "multi_match": {  
            "query": "跳板机",  
            "fields": [  
              "title",   //搜索字段1
              "content"  //搜索字段2
            ],  
            "analyzer": "ik_smart",  
            "type": "best_fields" //假设你想匹配最佳字段,可以根据需要选择其他类型
          }  
        }  
      ],  
      "filter": [  
        {  
          "term": {  
            "active": true  
          }  
        }  
      ]  
    }  
  }  
}

提高字段权重

只需略微修改一下,就可以提高title字段的权重,根据生产实际,我们认为标题的重要性显然是高于正文内容的,因此权重相对提高5倍。

GET /docwrite2/_search
{  
  "query": {  
    "bool": {  
      "must": [  
        {  
          "multi_match": {  
            "query": "跳板机",  
            "fields": [  
              "title^5",  // 提高title字段的权重,假设设置为5倍
              "content"   // content字段使用默认权重1
            ],  
            "analyzer": "ik_smart",  
            "type": "best_fields"
          }  
        }  
      ],  
      "filter": [  
        {  
          "term": {  
            "active": true  
          }  
        }  
      ]  
    }  
  }  
}

在上面的查询中,title^5表示title字段的权重被设置为5,这意味着title字段的匹配将对最终得分产生更大的影响。你可以根据需要调整这个值。content字段没有指定boost值,因此它将使用默认权重1。

请注意,boost值只是相对权重,而不是绝对得分。它用于在字段之间分配更多的“重要性”,但实际的得分还会受到文档内容、字段分析和查询类型等多种因素的影响。

best_fields类型会返回匹配最佳字段的文档,并考虑字段的权重。如果你想要所有匹配字段都对得分有所贡献,你可以使用cross_fields或most_fields等其他类型。

指定时间范围

上面的查询中的filter是一个数组,只需要往其中新增一个range条件即可:

{  
	"range": {  
            "updatetime": {  
              "gte": 1672531200000,  //开始时间戳,例如:2023-01-01T00:00:00Z的时间戳  
              "lte": 1675113599000   //结束时间戳,例如:2023-01-31T23:59:59Z的时间戳  
            }  
	}  
}  

更新指定的字段值

我需要把指定文档的一个值进行更新,执行如下命令将该文档的active值改为true:

POST /docwrite2/_update/change-this-id-6163dbf  
{  
  "script": {  
    "source": "ctx._source.active = params.newActive",  
    "params": {  
      "newActive": true  
    }  
  }  
}

高亮查询

对搜索到的关键词高亮展示对用户是很友好的,可以通过以下方法实现:

GET /docwrite2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "的",
            "fields": [
              "title^5",
              "content"
            ],
            "analyzer": "ik_smart",
            "type": "best_fields"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "active": true
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "content": {
        "fragment_size": 100,
        "number_of_fragments": 3,
        "pre_tags": [
          ""
        ],
        "post_tags": [
          ""
        ]
      }
    }
  },
    "_source": {
    "excludes": ["content"]
  }
}

上述查询中的高亮逻辑主要是其中的highlight属性控制:

查询ES之细化需求实现多字段、范围过滤、加权和高亮

Elasticsearch的响应将包含一个highlight字段,其中包含了被高亮的文本片段。这个返回结果需要前端逻辑处理和渲染才能展示高亮的效果。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]