我有一个看起来像这样的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的人
所以我需要在一段时间内传递密钥,例如“2001年1月1日-2001年12月31日”,如果该期间的投诉值> 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"} }
]
}
}
}
}
}
}
根据docs,我已切换为使用 bool(boolean) 查询
因此,据我所知,查询的第一部分表明结果“必须”在2个字段之一中包含与我的查询匹配的字符串。
第二部分是嵌套查询。虽然我的数据似乎是一个日期,但它实际上像一个类别一样被存储和查询,因此我将appendance_period类型切换为“关键字”类型而不是“文本”类型。这使我可以在“词条”查询中使用它(精确文本匹配,分类)。
由于嵌套查询是“应该”,结果不一定要匹配,但是如果匹配,它将提高得分并将其进一步推向结果列表。
嵌套查询上的docs也提供了一些示例,这些示例可以使我根据投诉数量进行提升,例如:
{ "range" : {"complaint_periods.complaints" : {"gt" : 5}} }
稍后可能需要添加。