引言
在Elasticsearch查询中,多字段、范围过滤、加权和高亮功能的结合使用,对于提升搜索的精准度和用户体验至关重要。
多字段查询能够覆盖更广泛的搜索范围,确保信息的全面性;范围过滤则能精确锁定目标数据,提高搜索效率;加权功能则可根据字段的重要性分配不同的权重,使搜索结果更符合用户期望;而高亮功能则能直观展示匹配项,增强搜索结果的可读性。
这些功能的综合运用,不仅有助于提升搜索的准确性和效率,更能为用户提供更友好的搜索体验。
多字段查询和过滤
多字段用于一个搜索词同时在多个字段中查找,这个功能的使用非常广泛,例如你在各种博客或App中直接开始搜索,那么返回的就是综合结果:包含文章、动态、用户、店铺、服务等等各种查询结果,这就是多字段的应用之一。
一次从两个字段中查询同一个搜索词,比如从title和content中进行查询,另外指定active字段的值必须为true(一般代表该文档未被删除或隐藏):
http
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倍。
http
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条件即可:
json
{
"range": {
"updatetime": {
"gte": 1672531200000, //开始时间戳,例如:2023-01-01T00:00:00Z的时间戳
"lte": 1675113599000 //结束时间戳,例如:2023-01-31T23:59:59Z的时间戳
}
}
}
更新指定的字段值
我需要把指定文档的一个值进行更新,执行如下命令将该文档的active值改为true:
http
POST /docwrite2/_update/change-this-id-6163dbf
{
"script": {
"source": "ctx._source.active = params.newActive",
"params": {
"newActive": true
}
}
}
高亮查询
对搜索到的关键词高亮展示对用户是很友好的,可以通过以下方法实现:
http
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": [
"<em>"
],
"post_tags": [
"</em>"
]
}
}
},
"_source": {
"excludes": ["content"]
}
}
上述查询中的高亮逻辑主要是其中的highlight
属性控制:
Elasticsearch的响应将包含一个highlight
字段,其中包含了被高亮的文本片段。这个返回结果需要前端逻辑处理和渲染才能展示高亮的效果。