赞
踩
在搜索系统中,最常遇到的一个需求就是排序,同时排序也是搜索引擎需要改造最多的地方。
常见排序一般有如下两类:
(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" } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。