被分词的string字段也是一个multi-value字段,但是对他们进行排序往往得不到想要的结果。如果你对”fine old art“进行分词,他将会返回三个term。我们也许对以一个term进行字母排序,然后第二个等。但是ES没有在这个期间的时间顺序。
你可以使用min和max排序模式(默认使用min),但是结果既不是art或者old也不是任何想要的结果。
为了对string field进行排序,这个field就只能是一个term:也就是一个not_analyzed类型的string。但是我们是需要对string进行分词的,以便于我们能够查询。
一个不成熟的做法是插入两个相同的string,一个为了搜索使用分词,一个为了排序不使用分词。
但是在_source中存储两个相同的string是浪费空间的做法,然而我们真的想在一个field中使用两种不同的存储方式。所有的核心字段类型——string,number,boolean,date——都接受fields参数,这个参数允许你想下面的这个样子进行mapping:
把
"tweet":{
"type": "string",
"analyzer":"english"
}
转换为:
"tweet":{
"type": "string",
"analyzer":"english",
"fields":{
"raw":{
"type": "string",
"index":"not_analyzed"
}
}
}
标记1表示:主要的tweet字段和之前的是一样的:是一个analyzed的full text field。
标记2表示:这个tweet.raw子字段不分词。
现在,至少等我们重新插入数据,我们可以使用tweet字段进行搜索,并且根据tweet.raw进行排序:
GET /_search
{
"query":{
"match":{
"tweet":"elasticsearch"
}
},
"sort":"tweet.raw"
}
对analyzed的full text进行排序是很耗费内存的,详情请见: Field data
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/multi-fields.html
字符串排序和多字段排序(string sorting and multi-fields),布布扣,bubuko.com
字符串排序和多字段排序(string sorting and multi-fields)
原文:http://www.cnblogs.com/blog1350995917/p/3778273.html