Elasticsearch - 按优先级例外过滤和按名称排序

Ben*_*ala 9 javascript sorting indexing node.js elasticsearch

我正在尝试使用优先级异常按名称进行筛选和排序,这意味着即使结果按字母顺序排序,我也希望首先显示特定名称.

例如 - 这是我的基本查询

{
  "from": 0,
  "size": 500,
  "min_score": 0.15,
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "brand.id"
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "brand.names.1.raw": "asc"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望通过优先考虑 "rc-cola"对这个数组["pepsi","rc-cola","coca-cola"]进行排序,以便将其排序为["rc-cola" ,"可口可乐","百事可乐"]

现在它按字母顺序排序.我想到了一些可行的想法:

  1. 通过"匹配"添加"应该"提升.但后来我通过"_score"排序有问题,它打破了我的字母排序,虽然我首先按"_score"和品牌名称排序.将此添加到"bool"的示例:"should":[{"match":{"brand.id":{"query":34709,"boost":20}}}

  2. 我尝试使用"聚合",以便第一个查询(存储桶)将"匹配"特定的品牌名称并按字母顺序排序,第二个查询将仅按字母顺序排序.但我完全搞砸了.

我必须使用过滤 - >过滤器,我不能使用脚本查询.谢谢.

更新 以下是文档的示例以及如何对其进行排序.我希望首先对"ccc"品牌进行优先排序,请帮助我更新我的查询.

{
  "_index": "retailer1",
  "_type": "product",
  "_id": "1",
  "_score": null,
  "_source": {
    "id": 1,
    "brand": {
      "names": {
        "1": "aaa"
      },
      "id": 405
    }
  },
  "sort": [
    "aaa"
  ]
},
{
  "_index": "retailer1",
  "_type": "product",
  "_id": "2",
  "_score": null,
  "_source": {
    "id": 2,
    "brand": {
      "names": {
        "1": "bbb"
      },
      "id": 406
    }
  },
  "sort": [
    "bbb"
  ]
},
{
  "_index": "retailer1",
  "_type": "product",
  "_id": "3",
  "_score": null,
  "_source": {
    "id": 3,
    "brand": {
      "names": {
        "1": "ccc"
      },
      "id": 407
    }
  },
  "sort": [
    "ccc"
  ]
},
Run Code Online (Sandbox Code Playgroud)

Oli*_*ier 5

如果使用Elasticsearch版本1.x,则以下查询应为您提供预期的结果:(如果需要,可能需要稍作调整以使用原始字段)

{
  "from": 0,
  "size": 500,
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "brand.names.1": "ccc",
                "boost": 10
              }
            },
            {
              "exists": {
                "field": "brand.id"
              }
            }
          ]
        }
      },
      "filter": {
        "exists": {
          "field": "brand.id"
        }
      }
    }
  },
  "sort": [
    "_score",
    {
      "brand.names.1": {
        "order": "asc"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在更高版本的Elasticsearch上,过滤查询由bool查询代替,该查询应能完成工作(与上一个查询类似,如果需要,可以使用原始字段)

{
  "from": 0,
  "size": 500,
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "brand.id"
        }
      },
      "should": [
        {
          "term": {
            "brand.names.1": "ccc"
          }
        }
      ]
    }
  },
  "sort": [
    "_score",
    {
      "brand.names.1": {
        "order": "asc"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,如果您想以给定顺序让顶部填充多个首选匹配项,则可以使用boost函数