在ElasticSearch中对文本字段中的数字进行排序

时间:2017-07-31 09:19:46

标签: sorting elasticsearch nest

在ElasticSearch中使用同一字段中的文本和数字对字段进行排序时,我遇到了一个问题。

我的模式是这样的:" text / number / year / text"

我试着按此分类,但我得到的是这样的东西:

"hits": [
         {            
            "_source": {
               "fields": {
                  "numbered": "text/1/year/text",
                  "numbered-number": "1"
               }
            },
            "sort": [
               "1"
            ]
         },
         {            
            "_source": {
               "fields": {
                  "numbered": "text/10/year/text",
                  "numbered-number": "10"
               }
            },
            "sort": [
               "10"
            ]
         },
         {            
            "_source": {
               "fields": {
                  "numbered": "text/11/year/text",
                  "numbered-number": "11"
               }
            },
            "sort": [
               "11"
            ]
         },
         ...
          {            
            "_source": {
               "fields": {
                  "numbered": "text/19/year/text",
                  "numbered-number": "19"
               }
            },
            "sort": [
               "19"
            ]
         },
         {            
            "_source": {
               "fields": {
                  "numbered": "text/2/year/text",
                  "numbered-number": "2"
               }
            },
            "sort": [
               "2"
            ]
         },

好吧,ElasticSearch正在对这个1,10,11,12,......,19,2,20,21进行排序......我该如何解决这个问题?我只需要自然排序。

更新:

我试试这个剧本,但它也没有用。

POST myindex/_search
{
   "from": 0,
   "size": 40,
   "sort": [
      {
         "_script": {
            "type": "string",
            "script": {
               "inline": 
               "if ('fields.myfield.sort' =~ /\\d+/) { return Integer.parseInt(doc['fields.myfield.sort'].value); }"               
            },
            "order" : "asc"

         }
      }
   ],
    "_source": { "include": ["fields.myfield"] }
}

错误

"reason": {
               "type": "null_pointer_exception",
               "reason": null

1 个答案:

答案 0 :(得分:0)

您可以使用scripted sort按整数值排序,而不是按字典顺序排序(文本将排序的方式)

var searchResponse = client.Search<MyDocument>(s => s
    .Sort(so => so
        .Script(ss => ss
            .Script(sc => sc
                .Inline("Integer.parseInt(doc['numbered-number'].value)")
            )
        )
    )
);

更好的方法是明确地map numbered-number field as an integer.这样做,您将能够按预期对字段进行排序。