提高搜索结果中与数组匹配的文档

时间:2019-10-17 16:32:23

标签: ruby-on-rails elasticsearch

我已经建立了这个相对复杂的搜索查询,并且可以进行完美的排序。

但是我认为这里由于脚本的原因搜索很慢,所以我想删除脚本并相应地编写查询。

当前代码:-

'MQL_DLLS_ALLOWED' - l-value required   TestingEnum.mq5 15  4
'1' - cannot convert enum   TestingEnum.mq5 15  22
'=' - l-value required  TestingEnum.mq5 15  21

以上代码说明:-

例如,如果匹配查询给出的结果如下:

"sort": [
{
  "_script": {
    "type": "number",
    "script": {
      "lang": "painless",
      "source": "double pscore = 0;for(id in params.boost_ids){if(params._source.midoffice_master_id == id){pscore = -999999999;}}return pscore;",
      "params": {
        "boost_ids": [
         3,
         4,
         5
        ]
      }
    }
  }
}]

所以我想使用m_id数组[3,4,5]增强文档,然后将结果转换为:

[{m_id: 1, name: A}, {m_id: 2, name: B}, {m_id: 3, name: C}, {m_id: 4, name: D}, ...]

1 个答案:

答案 0 :(得分:1)

您可以使用Function Score Query(用于提升)和Terms Query(用于查询值数组)来使用以下查询

请注意,我提到的逻辑在bool queryshould子句中。

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}   //just a sample must clause to retrieve all docs
        }
      ],
      "should": [
        {
          "function_score": {     <---- Function Score Query
            "query": {
              "terms": {          <---- Terms Query
                "m_id": [
                  3,4,5
                ]
              }
            },
            "boost": 100          <---- Boosting value
          }
        }
      ]
    } 
  }
}

因此,基本上,您可以完全删除排序逻辑,并在function query子句中添加以上should,这将为您提供所需的结果。

请注意,如果您有非常复杂的查询,并且如果遇到任何困难,请务必设法正确添加逻辑。我很乐意提供帮助!

希望这会有所帮助!