elasticsearch权威指南 学习24

elasticsearch权威指南-- getting start 第八章 Sorting and Relevance(2)

String Sorting and Multifields

被分词(Analyzed)的字段常常会被分词成多个字段,但是对他们进行排序往往不能得到想要的结果,如果你对一个字符串进行排序,比如像对fine old art进行分词,它会被分解成三个term,我们可能想按首字母排序然后返回结果,但是es并不是按照这样的顺序返回结果的,而是将这个字符串分成三个term,然后对所有的term进行排序。

你可能想到要用min和max mode来进行排序,但是排序的结果却可能也是按art或old进行的,这也不是我们想要的。

为了能对一个字符串进行排序,那么只要让字符串只有一个term,即对整个字符串不进行分词(把它设置为not_analyzed string),但是我们常常需要对这些排序的字段进行全文(full text)搜索。

一种最简单的方式是将要排序的字段分成两种类型,一个是进行分词(analyzed)的,一个是不进行分词的(not_analyzed)。但是对相同的字段进行两次排序打分计算,是比较浪费的,所以我们只想使用一个字段就达到这种效果,在es的核心类型中都支持一个filed参数,来允许我们构造如下这样的mapping:

“tweet”: {
     “type”: “string”,
     “analyzer”: “english”
}
转换为:
“tweet”: {
     “type”: “string”,
     “analyzer”: “english”,
     “fields”: {
          “raw”: {
               “type”: “string”,
               “index”: “not_analyzed”
          }
     }
}

这个tweet字段是分词的(analyzed)。

而新字段:tweet.raw子域就是用来排序的字段。

现在重新为数据创建索引,我们就可以用tweet字段来进行搜索,用tweet.raw进行排序了。

GET /_search
{
     “query”: {
          “match”: {
               “tweet”: “elasticsearch”
          }
     },
          “sort”: “tweet.raw”
}
另外注意一点:对analyzed的字符串进行排序会浪费很多内存。我们会在fileddata那节来详解这个问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>