【elasticsearch实现优先展示连词并按某个字段折叠显示最新一条】

news/2024/9/23 10:23:01/

elasticsearch实现优先展示连词并按某个字段折叠显示最新一条

  • 前言
  • match_phrase 顺序前缀 + boost 权重
  • collapse 折叠
    • 基本用法
    • 高级功能
    • 排序


前言

场景要求:

  1. 优先展示关键词连词的商品
  2. 按照某个字段折叠相同字段,并按指定排序字段选择第一个

match_phrase 顺序前缀 + boost 权重

elasticsearch常用匹配:

match_phrase 查询
match_phrase 查询用于匹配包含短语的文档,它会确保查询的短语在文档中按顺序连续出现。

{ "query": { "match_phrase": { "content": "星球大战" } } 
} 

multi_match 查询
multi_match 查询允许在多个字段上执行相同的查询,可以指定不同的字段权重和查询类型。

{ "query": { "multi_match": { "query": "星球大战", "fields": ["title", "content^2"], "type": "best_fields", "tie_breaker": 0.3 } } 
} 

match_all 查询
match_all 查询会匹配所有文档,常用于返回整个索引的内容或与其他查询一起使用。

{ "query": {     "match_all": {} } 
} 

match_none 查询
match_none 查询用于不匹配任何文档,通常用于测试或特定的过滤场景。

{ "query": { "match_none": {} } 
} 

bool 查询
bool 查询是一个复合查询,允许将多个查询条件组合在一起,包括 must 、 should 、 must_not 和 filter 子句。

{ "query": { "bool": { "must": [ { "match": { "title": "星球" } }, { "match": { "title": "大战" } } ], "filter": [ { "range": { "price": { "gte": 100, "lte": 200 } } } ] } } 
} 

term 查询
term 查询用于精确匹配某个字段的值,不会对查询字符串进行分析。

{ "query": { "term": { "category.keyword": "电影" } } 
} 

terms 查询
terms 查询用于匹配多个值,类似于 SQL 中的 IN 操作符。

{ "query": { "terms": { "tags.keyword": ["science fiction", "action"]     } } 
} 

efix 查询
prefix 查询用于匹配指定字段开头的文档。

{ "query": { "prefix": { "title": "星球" } } 
} 

wildcard 查询
wildcard 查询允许使用通配符匹配字段值。

{ "query": { "wildcard": { "title": "星球*" } } 
} 

range 查询
range 查询用于匹配指定范围内的字段值。

{ "query": { "range": { "price": { "gte": 100, "lte": 200 } } } 
}

要实现目标效果,这里需要用的就是match_phrase 顺序前缀 + boost 权重
查询按顺序的与不按顺序的,将按顺序的权重高于不按顺序的就可以了

	"query": {"bool": {"should": [{"match_phrase": {"name": {"query": "星球大战","boost": 3 # 权重}}},{"match": {"name": {"query": "星球大战","boost": 1 # 权重}}}]}},

collapse 折叠

Elasticsearch (ES) 中的collapse功能主要用于在搜索结果中进行字段折叠,以便于根据某个字段的不同值只返回每个值的首个匹配项。这类似于SQL 中的 GROUP BY功能,但在 Elasticsearch 中主要用于避免返回重复的数据,并集中展示多样化的结果。这个功能特别适用于想要从每个类别或组获取顶部记录的场景。

基本用法

基本的 collapse 语法需要指定一个字段,搜索结果会根据该字段的值折叠,每个不同的值只返回第一条匹配的记录。例如,如果你有一个包含多个产品信息的索引,每个产品都有一个 “brand” 字段,你可能想要从每个品牌中获取一条记录。

GET /products/_search
{"query": {"match_all": {}},"collapse": {"field": "brand.keyword"  // 使用.keyword后缀以确保字段不分词}
}

在这个示例中,搜索将返回每个品牌的第一个产品。

高级功能

如果你希望除了获取每个分组的首个匹配项外,还想获取每个分组的更多记录,可以使用 inner_hits 选项。例如,获取每个品牌的前三个产品:

GET /products/_search
{"query": {"match_all": {}},"collapse": {"field": "brand.keyword","inner_hits": {"name": "more_products",  // inner hits的名称,可自定义"size": 3  // 每个品牌返回的记录数}}
}

排序

你也可以在折叠字段上指定排序规则,以确定哪条记录应该作为每个值的代表:

GET /products/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "asc"}}],"collapse": {"field": "brand.keyword"}
}

在这个例子中,系统会针对每个品牌返回价格最低的产品。

注意事项

性能影响:使用 collapse 可能会影响查询的性能,尤其是在处理大量数据时。字段选择:折叠字段应该是非分析字段(例如,通常带有 .keyword 后缀的字段),以保证字段值的完整性。限制:折叠操作不能和某些其他特性如聚合(aggregations)直接组合。

通过适当使用 collapse 功能,可以在 Elasticsearch 中有效地管理和优化搜索结果的展示,使得结果更加精准和高效。


http://www.ppmy.cn/news/1503328.html

相关文章

【日常记录】【JS】JS中查询参数处理工具URLSearchParams

文章目录 1. 引言2. URLSearchParams2.1 URLSearchParams 的构造函数2.2 append() 方法2.3 delete() 方法2.4 entries() 方法2.5 forEach() 方法2.6 get() 方法2.7 getAll() 方法2.8 has() 方法2.9 keys() 方法2.10 set() 方法2.11 toString() 方法2.12 values() 方法 参考链接…

“手撕”MySQL的索引

目录 二、索引的作用 三、索引的缺点 四、如何使用索引 查看索引: 创建索引: ​编辑 删除索引: 五、索引的底层原理 那什么是B树,什么是B树呢? B树的好处: 总结: 一、什么是索引 索…

UE4调试UE4Editor-Cmd.exe

在工作中,我们看到这样的构建命令: %EnginePath%\Binaries\Win64\UE4Editor-Cmd.exe %ClientPath%\%ProjectName%.uproject -runHotPatcher {其它参数} 我们应该如何调试UE4Editor-Cmd.exe呢?其实调试 UE4Editor.exe 就可以了(参考…

IoTDB 入门教程 实战篇④——C#示例(开源)

文章目录 一、前文二、新建C#项目三、NuGet安装四、示例源码五、查询数据六、参考 一、前文 IoTDB入门教程——导读 本文详细阐述了如何通过一个C#项目成功连接到IoTDB时序数据库,进而展示了如何向该数据库高效地写入数据以及执行精确的数据查询操作。 此示例旨在为…

【数据结构与算法 | 二叉树篇】二叉搜索树

1. 前言 数据结构好久没看了,代码感觉都有点生疏了。 二叉搜索树前提是二叉树,每个节点最多只有两个孩子。如果二叉树的节点满足任意节点的键比其左孩子的值要大,比右孩子的值要小,称这样的二叉树为二叉搜索树。 2. 二叉搜索树…

【echarts】echarts-liquidfill 水球图

echarts-liquidfill3兼容echarts5 echarts-liquidfill2兼容echarts4 npm install echarts npm install echarts-liquidfill设置水球图背景色和内边框样式 var option {series: [{type: liquidFill,data: [0.6, 0.5, 0.4, 0.3],backgroundStyle: {borderWidth: 5,//边框宽度bo…

云计算中云防火墙是如何实现的

在云计算中,云防火墙(Cloud Firewall)是用于控制和管理网络流量的安全服务。它可以根据预定义的规则集来允许或阻止进入和离开云资源(如虚拟机、容器、数据库等)的网络流量。云防火墙通常在云提供商的基础设施层上实现…

社区团购系统搭建开发,前端uniapp。社区团购搭建开发定制

目录 前言: 一、社区团购系统有哪些功能? 二、社区团购管理端 三、社区团购的基本流程如下: 总结 : 前言: 社区团购是一种以社区为单位进行的集体购物模式。这种模式利用了互联网平台来组织同一社区内的居民一起购…