54.字符串排序问题

主要知识点:

  • 对一个field索引两次来解决字符串排序问题

   

实际程序中,如果对一个query string进行搜索,然后再按这个query string所搜索的string field进行排序的话,结果往往不准确,因为在搜索时是对query string进行分词后再搜索的,分词后的string field就变成多个单词,再排序的话就是按照这些单词的_source进行排序,而程序希望的排序往往是按照完整的string field进行排序,因此得到的结果就不是程序想要的结果。解决办法是在建立string field时就对同一个string field 建立两个索引,一个设置成分词,用来进行搜索;另一个不分词,用来进行排序。以下用一个简单例子进行完整演示

   

一、建立一个index website,在建立时就对title建立两次索引

PUT /website

{

"mappings": {

"article": {

"properties": {

"title": {

"type": "text",

"fields": {

"raw": {

"type": "string",

"index": "not_analyzed"

}

},

"fielddata": true

},

"content": {

"type": "text"

},

"post_date": {

"type": "date"

},

"author_id": {

"type": "long"

}

}

}

}

}

二、插入数据

PUT /website/article/1

{

"title":"python",

"content":"i love python",

"post_date":"2016-01-01",

"author_id":1101

}

PUT /website/article/2

{

"title":"i love es ",

"content":"i love es ",

"post_date":"2016-01-01",

"author_id":1101

}

PUT /website/article/3

{

"title":"scrapy",

"content":"i love scrapy",

"post_date":"2016-01-01",

"author_id":1101

}

   

三、进行搜索,并按titel.raw进行排序

GET /website/article/_search

{

"query": {

"match_all": {}

},

"sort": [

{

"title.raw": {

"order": "desc"

}

}

]

}

可以发现结果就是按完整的title进行排序

posted @ 2018-02-26 11:18  outback123  阅读(254)  评论(0编辑  收藏  举报