54.字符串排序问题

Posted Outback

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进行排序

以上是关于54.字符串排序问题的主要内容,如果未能解决你的问题,请参考以下文章

哈希字符串可排序 - 大数据

C#中的字符串排序问题

SQL 查询:按字符长度排序?

包含以下划线开头的字符串的列表排序

C++中的字符串排序

对带有异常的字符串数组进行排序 Swift