ElasticSearch之排序使用-ES常用排序方法

ElasticSearch之排序使用-ES常用排序方法

在搜索系统中,最常遇到的一个需求就是排序,同时排序也是搜索引擎需要改造最多的地方。

常见排序一般有如下两类:
(1)按照相似度匹配得分排序

(2)按照指定字段排序

相似度得分排序是系统默认的排序方式,更多时候,我们需要按照指定字段排序。lucene中,基于字段内容的排序是由FieldComparator接口来实现的,在排序中又分为单字段排序和多字段排序。在排序速度方面,数值类型排序速度最快,在lucene中数值类型的排序是由 NumericComparator 的派生类来实现,NumericComparator派生类支持 float、double、int 、long 四钟类型(日期在底层会转化为long型存储)。
字符串类型的字段一般都需要进行搜索的,那么需要对其进行分词处理。分词处理的结果就是将该字符串解析为多个词条。在lucene层面,根据docid可以取到多个索引词条,而无论采用哪个索引词条来进行排序其实都正确。
所以为了对字符串类型字段进行排序,需要保存整个字符串作为一个索引词条,同时为了保证该字段能够被搜索,还要保存该字符串analyzed的结果(即需要保存完整的字符串作为一个词条,同时又分词索引)。

在ES中为实现该功能,ES提供了 multi-field mapping 机制,配置通过配置即可实现字段即分词,又可排序:

“title”: {
“type”: “string”,
“analyzer”: “ansj”,
“fields”: {
“sort”: {
“type”: “string”,
“index”: “not_analyzed”
}
}
}

通过title字段作为搜索,而用title.sort字段作为排序:

GET /_search
{
“query”: {
“match”: {
“title”: “elasticsearch”
}
},
“sort”: “title.sort”

}

Lucene标准语法中多字段排序:
{
“from”: 0,
“size”: 10,
“query”: {
“query_string”: { “query”: “*😗”, “default_operator”: “and” }
},
“sort”: [

{

“title.sort”: { “order”: “desc” },

“_score”: { “order”: “desc” }
}
]

}

缺省字段排序:

{
“from”: 0,
“size”: 10,
“query”: {
“query_string”: { “query”: “title:test”, “default_operator”: “and” }
},
“sort”: [
{
“rpgendatetime”: { “order”: “desc”, “missing”: “_last” }
}
]
}

使用脚本排序:

{
“query” : {
“query_string”: {
“query”: “”,
“default_operator”: “and”
}
},
“sort” : {
“_script” : {
“type” : “number”,
“script” : {
“inline”: “doc[‘field_name’].value * factor”,
“params” : {
“factor” : 1.1
}
},
“order” : “asc”
}
}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值