Elasticsearch单个子块排序

时间:2018-10-16 09:17:04

标签: sorting elasticsearch

目前,我正在尝试对一个文本搜索查询的多个结果块进行单独排序。不幸的是,我无法找到正确的语法,例如查询结果未正确排序。

我的索引包含以下字段:

"category_id": { "type": "integer" }
"type":        { "type": "keyword"}
"subject":     { "type": "text"},
"body":        { "type": "text"},
"date":        { "format": "yyyy-MM-dd HH:mm:ss", "type": "date"}

说明:
-字段“ category_id”是一个数字值
-字段“类型”可以是“ E”或“ U”
-字段“主题”包含文字
-字段“正文”包含文字
-“日期”字段包含日期

我想要实现的是在“主题”和“正文”中搜索字符串以及匹配的category_id将导致结果列表具有特殊的排序。

查询示例
在“主题”和“正文”字段中搜索所有“ category_id”等于12的记录的文本“ foo”。

结果排序
第一个区块:类型==“ E”的结果
第二个块:类型==“ U”

的结果

以上两个块中的结果应重新排序:

第一个区块:搜索结果为“主题”字段的结果
第二个块:搜索结果为“正文”字段的结果

最后,这两个块应分别按“日期”字段进行排序。

Sorting shown as picture

我当前的查询如下:

    {
      "query": {
        "function_score": {
          "query": {
            "bool": {
              "must": {
                "multi_match": {
                  "query": "foo",
                  "operator": "and",
                  "fields": [
                    "subject^10",
                    "body^0.1"
                  ]
                }
              },
              "filter": {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "category_id": 106
                      }
                    }
                  ]
                }
              }
            }
          },
          "exp": {
            "date": {
              "origin": "now",
              "scale": "7d",
              "decay": 0.9
            }
          }
        }
      },
      "sort": {
        "type": {
          "order": "desc"
        },
        "_score": {
          "order": "desc"
        }
      }
    }

按类型排序可以正常工作,但是按主题,正文和日期对子块进行排序有时会变得混乱。我的想法是对点击次数和日期使用得分,以达到所需的排序...

有什么方法可以进行这种模块化的子分类吗?

0 个答案:

没有答案