1

我继承了我正在尝试修改的 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”。

谁能帮我提升一个特定的术语类型?

4

2 回答 2

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"
                        ]
                     }
                  }
               ]
            }
         }
      }
   }

您可以启用说明以查看这如何影响评分

于 2015-08-03T17:38:04.023 回答
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"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }
}
于 2015-08-04T07:38:39.137 回答