ElasticSearch学习笔记之十九 多字段排序和字符串排序

ElasticSearch学习笔记之十九 多字段排序和字符串排序

排序

为了按照相关性来排序,需要将相关性表示为一个数值。在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。

新建索引映射

PUT tweet
{
  "mappings": {
    "tweet": {
      "properties": {
          "about": {
            "type": "text"
          },
          "comments": {
            "type": "nested", 
            "properties": {
              "content": {
                "type": "text"
              },
              "date": {
                "type": "date"
              },
              "user_id": {
                "type": "long"
              }
            }
          },
          "date": {
            "type": "date"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "topic": {
            "type": "text"
          },
          "tweet": {
            "type": "text"
          },
          "user_id": {
            "type": "long"
          }
      }
    }
  }
}

插入数据

PUT tweet/tweet/1
{
    "tweet":    "What is Elasticsearch?",
    "date":     "2014-09-14",
    "name":     "Mary Jones",
    "about":["es","elasticsearch"],
    "topic":"elasticsearch",
    "user_id":  1,
    "comments": [
      {
        "content":  "very good",
        "date":  "2014-09-14",
        "user_id":  1
      },
      {
        "content":  "good question",
        "date":  "2014-09-15",
        "user_id":  2
      }
    ]
}
PUT tweet/tweet/2
{
    "tweet":    "How can we study Elasticsearch?",
    "date":     "2014-09-18",
    "name":     "Mary Jones",
    "about":["es","elasticsearch"],
    "topic":"elasticsearch",
    "user_id":  1,
    "comments": [
      {
        "content":  "very good",
        "date":  "2014-09-18",
        "user_id":  1
      },
      {
        "content":  "good question",
        "date":  "2014-10-15",
        "user_id":  2
      }
    ]
}
PUT tweet/tweet/3
{
    "tweet":    "How can we manage Elasticsearch?",
    "date":     "2014-10-18",
    "name":     "Tom Foxs",
    "about":["es","elasticsearch"],
    "topic":"elasticsearch",
    "user_id":  2,
    "comments": [
      {
        "content":  "do not know",
        "date":  "2014-09-14",
        "user_id":  3
      },
      {
        "content":  "good question",
        "date":  "2014-09-15",
        "user_id":  2
      }
    ]
}

此时假设我们希望看到按照时间的排序,来查询数据

GET tweet/tweet/_search
{
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ]
}

结果如下:
日期排序查询结果

  • 文档返回时多出来了sort 它包含了我们用于排序的值。
  • _score 不被计算, 因为它并没有用于排序。
  • date 字段的值表示为自 epoch (January 1, 1970 00:00:00 UTC)以来的毫秒数,通过 sort字段的值进行返回。

_scoremax_score 字段都是 null 。计算 _score 的花销巨大,通常仅用于排序;这里 我们并不根据相关性排序,所以记录 _score 是没有意义的。如果无论如何你都要计算 _score , 你可以将 track_scores 参数设置为 true

相关性查询

GET tweet/tweet/_search
{
  "query": {
    "match": {
      "name": "jones"
    }
  }
}

查询结果如下:
相关性查询

多级排序

假定我们想要结合使用 date_score 进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序:

GET tweet/tweet/_search
{
  "query": {
    "match": {
      "name": "jones"
    }
  },
    "sort": [
    {
      "date": {
        "order": "desc"
      }
    },
    {
      "_score":{
        "order": "desc"
      }
    }
  ]
}

排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个 sort 值完全相同时才会按照第二个条件进行排序,以此类推。

字符串排序

以全文 analyzed 字段排序会消耗大量的内存。

如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,但是 Elasticsearch 在排序过程中没有这样的信息。

你可以使用 minmax 排序模式(默认是 min ),但是这会导致排序以 art 或是 old ,任何一个都不是所希望的。

为了以字符串字段进行排序,这个字段应仅包含一项: 整个 not_analyzed 字符串。 但是我们仍需要 analyzed 字段,这样才能以全文进行查询

一个简单的方法是用两种方式对同一个字符串进行索引,这将在文档中包括两个字段: analyzed 用于搜索, not_analyzed 用于排序

但是保存相同的字符串两次在 source 字段是浪费空间的。 我们真正想要做的是传递一个 _单字段 但是却用两种方式索引它。所有的 _core_field 类型 (strings, numbers, Booleans, dates) 接收一个 fields 参数

该参数允许你转化一个简单的映射如我们上面为名字创建的映射:

"name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }

对应检索

GET tweet/tweet/_search
{
  "query": {
    "match": {
      "name": "jones"
    }
  },
    "sort": [
    {
      "name.keyword": {
        "order": "asc"
      }
    },
    {
      "_score":{
        "order": "desc"
      }
    }
  ]
}
相关推荐
可部署到云主机(Heroku,AWS……)! 使用dlib最先进的面部识别功能构建而成,具有深度学习功能。该模型在Wild标记的Labeled Faces中具有99.38%的准确度 。 这提供了一个简单的命令行工具,允许从命令行对图像文件夹进行面部识别! 1、找到图片中出现的所有面孔 2、获取每个人的眼睛,鼻子,嘴巴和下巴的位置和轮廓。 3、应用数字化妆 4、识别每张照片中出现的人物。 5、可以将此库与其他Python库一起使用来进行实时人脸识别。 使用要求 Python 3.3+或Python 2.7 macOS或Linux(Windows未正式支持,但可能有效) 人脸检测 在照片中找到面孔 在照片中找到面孔(使用深度学习) 使用GPU(使用深度学习)批量查找图像中的面孔 使用网络摄像头模糊实时视频中的所有人脸(需要安装OpenCV) 面部特征 识别照片中的特定面部特征 应用(可怕的丑陋)数字化妆 面部识别 根据已知人物的照片查找并识别照片中的未知面部 识别并在照片中的每个人周围绘制框 通过数字面部距离比较面部而不仅仅是真/假匹配 使用网络摄像头识别实时视频中的人脸 - 简单/慢速版本(需要安装OpenCV) 使用网络摄像头识别实时视频中的人脸 - 更快的版本(需要安装OpenCV) 识别视频文件中的面部并写出新的视频文件(需要安装OpenCV) 用相机识别Raspberry Pi上的脸部 运行Web服务以通过HTTP识别面部(需要安装Flask) 使用K近邻分类器识别面部
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页