我继承了一个我试图修改的Elasticsearch查询。我目前的查询是:
{
"fields": [
],
"from": 0,
"size": 51,
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
"data.*"
],
"default_operator": "AND",
"query": "*Search term*"
}
},
"filter": [
{
"terms": {
"type": [
"typeOne",
"typeTwo",
"typeThree"
]
}
}
]
}
}
}
现在我一直在尝试做的是在结果中提升其中一个术语,但未能使其工作。我已经尝试添加一个“提升”值,但这奇怪地给了我相反的效果 - 它禁用任何提升的类型。
我尝试了以下“过滤器”对象:
"filter": [
{
"bool": {
"should": [
{
"term": {
"type": "typeOne"
}
},
{
"term": {
"type": "typeTwo"
}
},
{
"term": {
"type": "typeThree",
"boost": 2
}
}
]
}
}
]
但正如我之前所说的那样,它不会提升“typeThree”,而是从结果中删除所有“typeThree”。
任何人都可以帮助我提升特定的术语类型吗?
答案 0 :(得分:1)
有多种方法可以构建查询来实现上述目标,一种方法是使用function_score。它会在这些行上看到一些东西
示例:
"query": {
"function_score": {
"functions": [
{
"filter": {
"term": {
"type": "typeThree"
}
},
"weight": 2
}
],
"score_mode": "sum",
"boost_mode": "sum",
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
"data.*"
],
"default_operator": "AND",
"query": "*search term*"
}
},
"filter": [
{
"terms": {
"type": [
"typeOne",
"typeTwo",
"typeThree"
]
}
}
]
}
}
}
}
您可以启用explain来查看这会如何影响评分
答案 1 :(得分:1)
虽然keety的回答是98%的回答,但需要一些额外的谷歌搜索来完成所有这些。问题是"体重"在这里不起作用,你必须使用" boost_factor"。最终查询如下所示:
{
"fields": [
],
"from": 0,
"size": 51,
"query": {
"function_score": {
"functions": [
{
"filter": {
"term": {
"type": "typeOne"
}
},
"boost_factor": 1.2
},
{
"filter": {
"term": {
"type": "typeTwo"
}
},
"boost_factor": 1.1
},
{
"filter": {
"term": {
"type": "typeThree"
}
},
"boost_factor": 1
}
],
"score_mode": "sum",
"boost_mode": "sum",
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
"data.*"
],
"default_operator": "AND",
"query": "*search term*"
}
},
"filter": [
{
"terms": {
"type": [
"typeOne",
"typeTwo",
"typeThree"
]
}
}
]
}
}
}
}
}