elasticsearch - 结合字符串匹配和嵌套字段值的 ElasticSearch 查询
问题描述
我有一个看起来像这样的 ElasticSearch 查询:
{
"query": {
"query_string": {
"query": "Lorem*",
"fields": ["search_names", "name^2"]
}
}
}
反对看起来像这样的文件。
{
"member_name" : "Lorem Ipsum",
"complaint_periods" : [
{
"period": "01/01/2001 - 31/12/2001",
"complaints": "10"
},
{
"period": "01/01/2002 - 31/12/2002",
"complaints": "0"
},
{
"period": "01/01/2003 - 31/12/2003",
"complaints": "3"
},
{
"period": "01/01/2004 - 31/12/2004",
"complaints": "100"
}
],
"search_names" : [
"Lorem Ipsum",
"dolor sit amet",
"varius augue",
"Aliquam fringilla"
]
}
因此,我能够根据文档名称和搜索名称与我的查询的接近程度来检索文档。
要求是,文本搜索框应检索与查询最接近的名称匹配,但是,给定相对相似的名称,在过去的时间段内投诉数量超过阈值 10 的文档应在搜索结果中显示更高比那些少于 10 的人。
所以我需要传递一个时间段的密钥,例如“01/01/2001 - 31/12/2001”,如果该时间段的投诉值> 10,则提高文档分数。
当前索引映射如下所示。
"mappings": {
"properties": {
"member_name": {
"type": "text"
},
"search_names": {
"type": "text"
},
"complaint_periods": {
"type": "nested",
"properties": {
"period": {
"type": "text",
},
"complaints": {
"type": "integer"
}
}
}
}
}
我目前正在阅读嵌套查询作为一种可能的解决方案......但我对 ES 相当陌生,因此热衷于就我应该用来实现这一目标的查询/结构类型获得意见。
有什么建议吗?
谢谢你。
解决方案
所以看来我可以通过以下查询解决这个问题:
"query": {
"bool": {
"must": {
"query_string": {
"query": "Lorem*",
"fields": ["search_names", "member_name^2"]
}
},
"should": {
"nested" : {
"path" : "complaint_periods",
"query" : {
"bool" : {
"should" : [
{ "term" : {"complaint_periods.period" : "01/01/2001 - 31/12/2001"} }
]
}
}
}
}
}
}
根据文档,我已经切换到使用布尔查询
匹配与其他查询的布尔组合匹配的文档的查询
因此,据我了解,我的查询的第一部分表明结果“必须”在 2 个字段之一中包含与我的查询匹配的字符串。
第二部分是嵌套查询。虽然我的数据看起来是一个日期,但它实际上像一个类别一样存储和查询,所以我将投诉周期类型切换为“关键字”类型而不是“文本”。这使我可以在“术语”查询中使用它(精确文本匹配,分类)。
由于嵌套查询是“应该”,因此结果不必匹配,但如果匹配,则应该提高分数并将其推到结果列表的上方。
嵌套查询的文档也有一些示例,可以让我根据投诉的数量进行提升,例如:
{ "range" : {"complaint_periods.complaints" : {"gt" : 5}} }
我可能需要稍后添加。
推荐阅读
- node.js - NodeJS 承诺睡眠时间太长
- arangodb - 如何使用 arangodb 可靠地安排定期重复的作业?
- scala - 派生`CanEqual`在函数不应该成功时成功
- python - 有什么方法可以检查是否远程安装了依赖项?
- file-handling - 我想将几条记录从文件复制到另一个文件,但代码只是复制整个记录。怎么了?
- html - 从 href 获取链接查询其父标签内的文本
- c++ - 自 Epoch 到格式化时间的秒数
- wildfly - 清除wildfly中的所有http会话
- vestacp - 灶神星控制面板让我们加密自动更新问题
- asp.net-mvc - 新的 ASP.Net 项目,但要求登录