Elasticsearch第15节 分页、copy_to、sort、score、doc_value

一、 多索引查询

GET /lib1/_search
GET /lib*/_search
GET /lib1,lib2/_search
GET /lib1,lib2/_search
GET /_all/_search
GET _search

二、 分页查询中的deep paging(深度分页)问题

GET /myindex/_search
{
  "from":0,
  "size":3,
  "version":true,   
  "query":{
    "match":{
      "intrest":"basketball running"
    } 
  }
}
GET /_search?from=0&size=3

deep paging : 查询的很深,比如一个索引有三个primary shard,分别存储了6000条数据,我们要得到笫100页的数据(每页10条),类似这种情况就叫deep paging

1. 如何得到笫100页的10条数据?

1.1 深度分页的错误做法

在每个shard中搜索990到999这10条数据,然后用这30条数据排序,排序之后取10条数据就是要搜索的数据,这种做法是❌的,因为3个shard中的数据的
_score分数不一祥,可能某一个shard中第一条数据的_score分数比另一个shard中笫1000条都要高,所以在每个shard中搜索990到999这10条数据然后排 序的倣法是不正确的。

1.2 深度分页的正确做法

是每个shard把0到999条数据全部搜索出来(按排序顺序),然后全部返回给coordinate node•甶coordinate按_score分数排序后,出第 100页的10条数据,然后返回绐客户端,

1.3 deep paging性能问题
  1. 耗费网络芾宽,因为搜索过深的话,各shard要把数据传送绐coordinate node,这个过程是有大量数据传递的,消耗网络。
  2. 消耗内存,各shard要把数据恃送给coordinate node,这个传递回来的数振,是被coordinate nodW存在内存中的,这样今大量消耗内存.
  3. 消耗cpu coordinate node要把传回来的数据逬行排序,这个排序过程很消耗cpu.
    鉴于deep paging的性能间题,所以应尽量减少使用


三、query String 查询以及copy_to


get /lib1/_search?q=name:xiaochao
get /lib1/_search?q=+name:xiaochao
get /lib1/_search?q=-name:xiaochao
copy_to字段是把其它字段中的值,以空格为分隔符组成一个大字符串,然后被分析和索引,但是不存储,不能显示,只能用来做查询参数。字段类型必须为text

//
DELETE /testindex
#copy_to mapping 提高搜索效率
PUT /testindex
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "age" : {"type" : "long"},
      "birthday" : {"type" : "date"},
      "name" : {"type" : "text","copy_to": "fullContent"},#自定义copy_to字段名
      "content":{"type":"text","copy_to": "fullContent"},#自定义copy_to字段名
      "price":{"type": "double"},
      "number":{"type": "integer"}
    }
  }
}
#数据1
PUT /testindex/_doc/xiaochao
{
  "name":"xiaochao",
  "age":22,
  "birthday":"1991-02-23",
  "content":"good boy",
  "price":100,
  "number":1
}
#数据2
PUT /testindex/_doc/xiaoyi
{
  "name":"xiaoyi",
  "age":22,
  "birthday":"1992-02-23",
  "content":"good girl",
  "price":100,
  "number":1
}
#数据3
PUT /testindex/_doc/xiaofei
{
  "name":"xiaofei",
  "age":22,
  "birthday":"1997-02-23",
  "content":"little girl",
  "price":100,
  "number":1
}
#通过copy_to字段索引,避免全字段检索
GET /testindex/_search?q=fullContent:xiaofei


四、字符型排序


ES对字符串分词了,所以对字符串类型排序不准确,会报错。解决办法:
对字段索引2次,一次索引分词,用于搜索;一次索引不分词,用于排序。

DELETE test1
//
PUT /test1
{
  "mappings": {
    "properties": {
      "age" : {"type" : "long"},
      "birthday" : {"type" : "date","index": false},
      "name" : {
          "type" : "text",
          "fields" : {
            "raw" : {
              "type" : "keyword"    #fields.raw.type=keyword是必须的
            }
          },
          "fielddata":true      #这个必须的
        }
    }
  }
}
#文档1
PUT /test1/_doc/1
{
  "age":10,
  "birthday":"2019-09-23",
  "name":"xiaochao"
}
#文档2
PUT /test1/_doc/2
{
  "age":20,
  "birthday":"2019-02-23",
  "name":"xiaoyi"
}
#文档3
PUT /test1/_doc/3
{
  "age":30,
  "birthday":"2019-07-23",
  "name":"xiaofei"
}
#text查询排序
GET /test1/_search
{
  "query":{
    "match_all": {}
  },
  "sort": [
    {
      "name.raw": {    #.raw是根据整个文本排序,而不是被分的词
        "order": "asc"
      }
    }
  ]
}


五、如何计算相关度分数


使用的是TF/IDF算法(Term Frequency&lnverse Document Frequency)

  1. Term Frequency(词条频率) 我们查询的文本中的词条在 document本 中出现了多少次,出现次数越多,相关度越高
    搜索内容:hello world
#
Hello, I love china.
Hello world,how are you!

2.lnverse Document Frequency(倒排索引频率): 我们查询的文本中的词条在 索引的所有文档中 出现了多少次,出现的次数越多,相关度越低
搜索内容:hello world

//hello在索引的  所有文档中   出现了500次,world出现了 100次 
//所有
hello, what are you doing?
I like the world.
  1. Field-length(字段长度归约)norm : field越长相关度越低
    搜索内容:hello world
//hello 所在文本短,得分高
{'title':"hello,what's your name?',',content':{'owieurowieuolsdjflk'}}
#world所在文本长,得分低
{'title':'hi,good morning','contenf:{'lkjkljkj................world'}}

查看分数是如何计算的:

GET /myindex/_search?explain=true
GET /myindex/_doc/_explain
{
    "query":{
    "match":{
      "intrest":"qwer"
    } 
  }
}

#没有article10的文档
GET /myindex/_doc/article10/_explain
{
    "query":{
    "match":{
      "intrest":"basketball running"
    } 
  }
}
--------------------------------
# Deprecation: [types removal] Specifying a type in explain requests is deprecated.
{
  "_index" : "myindex",
  "_type" : "_doc",
  "_id" : "article10",
  "matched" : false
}


六、 Doc Values 解析 (正排索引)

DocValues其实是Lucene在构建倒排索引时,会额外建立一个有序的正排索引(基于 document => field value的映射列表)
{'birthday':'1985-11-11','age':23}
{birthday':'1989-11-17','age':29}

document age birthday
doc1 23 1985-11-11
doc2 29 1989-11-17

存储在磁盘上,节省内存
对排序、分组和一些聚合操作能够大大提升性能
注意:默认对不分词的字段是开启的,对分词字段无效(需要把fielddata置为true)

doc_values:false 关闭正排索引

//
DELETE test1
#创建mapping
PUT /test1
{
  "mappings": {
    "properties": {
      "age" : {"type" : "long","doc_values":false}, #doc_values 关闭正排索引
      "birthday" : {"type" : "date","index": false},
      "name" : {"type" : "text"}
    }
  }
}
#数据1
PUT /test1/_doc/1
{
  "age":10,
  "birthday":"2019-09-23",
  "name":"xiaochao"
}
#数据2
PUT /test1/_doc/2
{
  "age":20,
  "birthday":"2019-02-23",
  "name":"xiaoyi"
}
#数据3
PUT /test1/_doc/3
{
  "age":30,
  "birthday":"2019-07-23",
  "name":"xiaofei"
}
#查询结果报错
GET /test1/_search
{
  "query":{
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352