按属性对相似数据进行排序

时间:2018-10-17 10:14:42

标签: elasticsearch

我有以下数据:

[
  {
    DocumentId": "85",
    "figureText": "General Seat Assembly - DBL",
    "descriptionShort": "Seat Assembly - DBL",
    "partNumber": "1012626-001FG05",
    "itemNumeric": "5"
  },
  {
    DocumentId": "85",
    "figureText": "General Seat Assembly - DBL",
    "descriptionShort": "Seat Assembly - DBL",
    "partNumber": "1012626-001FG05",
    "itemNumeric": "45"
  }
]

我使用以下查询获取数据:

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "DocumentId": "85"
        }
      },
      "should": [
        {
          "match": {
            "figureText": {
              "boost": 5,
              "query": "General Seat Assembly - DBL",
              "operator": "or"
            }
          }
        },
        {
          "match": {
            "descriptionShort": {
              "boost": 4,
              "query": "Seat Assembly - DBL",
              "operator": "or"
            }
          }
        },
        {
          "term": {
            "partNumber": {
              "boost": 1,
              "value": "1012626-001FG05"
            }
          }
        }
      ]
    }
  }
}

当前,它将返回带有“ itemNumeric” = 45的项目,我想获得itemNumeric =“ 5”(最低)。

是否存在执行此操作的提示?我尝试使用“ sort”:[{“ itemNumeric”:“ desc”}]

Thx

1 个答案:

答案 0 :(得分:0)

查看您的评论,您可以通过两种方式解决此问题。

解决方案1::更新映射,以便您的查询现在可以按预期运行

FirebaseAnimatedList(
         physics: NeverScrollableScrollPhysics(),
         shrinkWrap: true, ...)

解决方案2::如果动态创建了映射,则检查PUT my_index/_mapping/_doc { "properties": { "itemNumeric": { "type": "text", "fielddata": true } } } 字段的映射,您的itemNumeric字段将是多字段。

itemNumeric

在这种情况下,您可以将排序逻辑应用于"itemNumeric": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } 字段。

itemNumeric.keyword

在elasticsearch中,每当有文本数据时,总是建议为其创建两个字段。类型为"sort":[{"itemNumeric.keyword":"desc"}] 的一种,以便您可以应用全文查询,而类型为text的另一种,则可以使用if实现排序或任何聚合操作。

不建议使用解决方案1,因为ES官方文档中提到了以下原因

  默认情况下,

keyword在文本字段上处于禁用状态。将Fielddata设置为   [your_field_name]为了通过反转将字段数据加载到内存中   倒排索引。 fielddata=true

我建议阅读有关multi-fieldfielddata的信息,以便您更清楚地了解正在发生的事情。