loopback自定义顺序

问题描述 投票:1回答:2

我正在使用angularjs作为前端和环回用于后端和弹性搜索数据库。

我有一个属性为的模型:

 "name": {
  "type": "string",
  "required": true
},
"mobileNumber": {
  "type": "string",
  "required": true
},
"email": {
  "type": "string"
},
"message": {
  "type": "string",
  "required": true
},
"quantity": {
  "type": "number",
  "required": true
},
"price": {
  "type": "number",
  "required": true
},
"status": {
  "type": "string",
  "required": true,
  "default": "open"
}

},

数据为:

{
 "_index": "XXXXXX",
 "_type": "XXXXX",
 "_id": "XXXXXXX",
 "_version": 1,
 "_score": 1,
 "_source": {
  "name": "aadil kirana",
  "email": "[email protected]",
  "message": "dfgfb dgfggf",
  "quantity": 3434,
  "price": 5454,
  "status": "open",
  "createdAt": "2017-12-19T14:53:41.727Z",
  "updatedAt": "2017-12-19T14:53:41.727Z"
  }
}

状态可以是打开,处理,关闭,拒绝和失败。

我想要的是按顺序获取数据,我可以通过created_At日期查看所有打开状态数据,然后按createdAt dat排序所有处理状态数据,等等....

我尝试使用环回过滤器:

filter = {
                order: ['status ASC','createdAt DESC'],
            };

但这首先给出了按日期排序的所有关闭状态数据,然后是按日期排序的所有打开状态数据,依此类推,该状态按字母顺序排序。

请帮助我获得理想的结果。

angularjs elasticsearch loopbackjs strongloop loopback
2个回答
0
投票

您可以将新属性作为statusOrder和define添加到数据中

  • 1 - >打开
  • 2 - >关闭
  • ...

在订购状态时按statusOrder而不是状态排序。


0
投票

我想要的是按顺序获取数据,我可以通过created_At日期查看所有打开状态数据,然后按createdAt dat排序所有处理状态数据,等等....

解决方法可能是让Elasticsearch使用自定义顺序进行排序,例如在这种情况下,状态可以按开放顺序,然后是处理,然后是关闭,然后是拒绝,然后是失败。它可以用Function Score Query完成。还可以找到更多的见解here

批量插入的示例输入数据:

POST custom/sort/_bulk?pretty
{"index" : {"_index" : "custom"}}
{"status": "open", "createdAt": "2017-12-19T14:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "open", "createdAt": "2017-12-18T14:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "processing", "createdAt": "2017-12-19T14:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "processing", "createdAt": "2017-12-17T14:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "close", "createdAt": "2017-12-19T14:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "close", "createdAt": "2017-12-19T15:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "failure", "createdAt": "2017-12-19T10:53:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "failure", "createdAt": "2017-12-19T14:59:41.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "reject", "createdAt": "2017-12-19T14:53:40.727Z"}
{"index" : {"_index" : "custom"}}
{"status": "reject", "createdAt": "2017-12-19T14:53:41.727Z"}

弹性搜索的示例响应(没有自定义顺序):

查询:

GET custom / sort / _search?filter_path = took,hits.total,hits.hits._score,hits.hits._source

{
  "took": 0,
  "hits": {
    "total": 10,
    "hits": [
      {
        "_score": 1,
        "_source": {
          "status": "processing",
          "createdAt": "2017-12-19T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "close",
          "createdAt": "2017-12-19T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "reject",
          "createdAt": "2017-12-19T14:53:40.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "open",
          "createdAt": "2017-12-18T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "failure",
          "createdAt": "2017-12-19T10:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "failure",
          "createdAt": "2017-12-19T14:59:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "reject",
          "createdAt": "2017-12-19T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "open",
          "createdAt": "2017-12-19T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "processing",
          "createdAt": "2017-12-17T14:53:41.727Z"
        }
      },
      {
        "_score": 1,
        "_source": {
          "status": "close",
          "createdAt": "2017-12-19T15:53:41.727Z"
        }
      }
    ]
  }
}

查询以模仿自定义排序:

GET custom/sort/_search?filter_path=took,hits.hits._id,hits.hits._score,hits.hits._source,hits.hits.sort
{
  "query": {
    "function_score": {
      "boost_mode": "replace",
      "query": {
        "constant_score": {
          "filter": {
            "terms": {
              "status.keyword": [
                "open",
                "processing",
                "close",
                "reject",
                "failure"
              ]
            }
          }
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "status.keyword": "open"
            }
          },
          "weight": 4
        },
        {
          "filter": {
            "term": {
              "status.keyword": "processing"
            }
          },
          "weight": 3
        },
        {
          "filter": {
            "term": {
              "status.keyword": "close"
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "term": {
              "status.keyword": "reject"
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "term": {
              "status.keyword": "failure"
            }
          },
          "weight": 0
        }
      ]
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      },
      "createdAt": {
        "order": "asc"
      }
    }
  ]
}

输出(带自定义顺序):

{
  "took": 4,
  "hits": {
    "hits": [
      {
        "_id": "grOucmABwtSchlgLKlaV",
        "_score": 4,
        "_source": {
          "status": "open",
          "createdAt": "2017-12-18T14:53:41.727Z"
        },
        "sort": [
          4,
          1513608821727
        ]
      },
      {
        "_id": "gbOucmABwtSchlgLKlaV",
        "_score": 4,
        "_source": {
          "status": "open",
          "createdAt": "2017-12-19T14:53:41.727Z"
        },
        "sort": [
          4,
          1513695221727
        ]
      },
      {
        "_id": "hLOucmABwtSchlgLKlaV",
        "_score": 3,
        "_source": {
          "status": "processing",
          "createdAt": "2017-12-17T14:53:41.727Z"
        },
        "sort": [
          3,
          1513522421727
        ]
      },
      {
        "_id": "g7OucmABwtSchlgLKlaV",
        "_score": 3,
        "_source": {
          "status": "processing",
          "createdAt": "2017-12-19T14:53:41.727Z"
        },
        "sort": [
          3,
          1513695221727
        ]
      },
      {
        "_id": "hbOucmABwtSchlgLKlaV",
        "_score": 2,
        "_source": {
          "status": "close",
          "createdAt": "2017-12-19T14:53:41.727Z"
        },
        "sort": [
          2,
          1513695221727
        ]
      },
      {
        "_id": "hrOucmABwtSchlgLKlaV",
        "_score": 2,
        "_source": {
          "status": "close",
          "createdAt": "2017-12-19T15:53:41.727Z"
        },
        "sort": [
          2,
          1513698821727
        ]
      },
      {
        "_id": "ibOucmABwtSchlgLKlaV",
        "_score": 1,
        "_source": {
          "status": "reject",
          "createdAt": "2017-12-19T14:53:40.727Z"
        },
        "sort": [
          1,
          1513695220727
        ]
      },
      {
        "_id": "irOucmABwtSchlgLKlaV",
        "_score": 1,
        "_source": {
          "status": "reject",
          "createdAt": "2017-12-19T14:53:41.727Z"
        },
        "sort": [
          1,
          1513695221727
        ]
      },
      {
        "_id": "h7OucmABwtSchlgLKlaV",
        "_score": 0,
        "_source": {
          "status": "failure",
          "createdAt": "2017-12-19T10:53:41.727Z"
        },
        "sort": [
          0,
          1513680821727
        ]
      },
      {
        "_id": "iLOucmABwtSchlgLKlaV",
        "_score": 0,
        "_source": {
          "status": "failure",
          "createdAt": "2017-12-19T14:59:41.727Z"
        },
        "sort": [
          0,
          1513695581727
        ]
      }
    ]
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.