es相关

  1. 查询字符串
    类似于这种搜索,GET /_search?q=mary
    查询时默认会使用_all字段(不指定搜索的字段时),该字段是数据中所有字符串字段的值拼接的结果,搜索时如果在_all中命中了,就会返回该条数据
  2. 查看索引mapping
    GET /index/_mapping
  3. 分词过程(分析器analyzer工作过程)
    • 字符过滤器(character filter): 过滤html标签、将&字符转为and等一系列操作…
    • 分词器(tokenizer):根据空格、逗号等分割单词
    • 标记过滤(token filters):增加同义词、去掉停用词、转换大小写等
  4. 索引文档时全文字段会被分析为单独的词来创建倒排索引
    查询全文(full text)字段时,查询将使用相同的分析器来分析查询字符串,以产生正确的词列
    查询确切值(exact value)字段,查询将不分析查询字符串,但是可以自己指定
  5. 测试分析器分词的结果
GET /_analyze
{
     
  "analyzer": "分析器名称",
  "text": "被测试的文本"
}
  1. es类型
类型 es类型
字符串 text
精确词 keyword
整形 byte, short, integer, long
浮点类型 float, double
布尔类型 boolean
日期 Date
对象 Object
  1. 构建索引映射
创建索引映射
PUT /索引名
{
     
  "mappings": {
     
      "properties" : {
     
        "字段名" : {
     
          "type" :    "类型名",
          "analyzer": "分词器",
           "index":true|false(是否被索引)
        }
      }
    }
}
添加索引映射
POST /索引名/_mapping
{
     
      "properties" : {
     
        "索引名" : {
     
          "type" :    "字段类型",
          "analyzer": "分词器",
          "index":true|false(是否被索引)
        }
      }
}
  1. 过滤查询
	1. term		精确匹配字段的值
	"term":{
     
		"字段名":}
	
	2. terms	精确匹配字段的多个值
	"terms":{
     
		"字段名":多值数组
	}
	
	3. exists	判断某个字段是否存在
	"exists":{
     
		"field":字段名称
	}
	4. range	范围查询
	"range":{
     
		字段名称:{
     
			"lt":数值	小于
			"gt":数值	大于
			"lte":数值	小于等于	
			"gte":数值	大于等于
		}
	}
	5. bool  布尔查询,内部复合must、must_not、should、filter多个查询子句
	6. multi_match  多值查询
	{
     
    "multi_match": {
     
        "query":    "全文查询内容",
        "fields":   "被查询的字段数组"
    }
	7. 多值字段排序
	"sort": {
     
    "字段名称": {
     
        "order": "asc",
        "mode":  "模式名称"(min、max、sum、avg)
    }
  1. 相似度
    1. es计算匹配得分时使用的是TF/IDF算法,TF指查询文本在一条数据中的被查询字段中出现的次数,次数越多得分越高。
    2. IDF 指查询文本在索引数据中出现的次数,次数越多,得分越低(次数多说明越普遍,没有区分度)
    3. 查询的一条数据,字段的值越长,得分越低。
    4. 计算得分时是以数据所在的当前shard为基础,不是以整个索引的数据为基础
    5. must、must_not、should 查询也会计算得分,filter不会
  2. 分页、
    1. searchafter:searchafter需要根据sort后返回的结果,去进行下一次搜索。sort中的返回值需要能唯一确定一份doc。
    第一次查询
    GET /account/_search
    {
           
    
      "sort": [
        {
           
          "_id":"desc"
        }
      ]
    }	
    结果
     {
           
        "_index" : "account",
        "_type" : "_doc",
        "_id" : "999",
        "_score" : null,
        "_source" : {
           
          "account_number" : 999,
          "balance" : 6087,
          "firstname" : "Dorothy",
          "lastname" : "Barron",
          "age" : 22,
          "gender" : "F",
          "address" : "499 Laurel Avenue",
          "employer" : "Xurban",
          "email" : "[email protected]",
          "city" : "Belvoir",
          "state" : "CA"
        },
        "sort" : [
          "999"
        ]
      },
    第二次查询需要带着sort里面的值
    	GET /account/_search
    	{
           
    	  "sort": [
    	    {
           
    	      "_id":"desc"
    	    }
    	  ],
    	  "search_after":[999]
    	}
    	结果
    	 {
           
        "_index" : "account",
        "_type" : "_doc",
        "_id" : "998",
        "_score" : null,
        "_source" : {
           
          "account_number" : 998,
          "balance" : 16869,
          "firstname" : "Letha",
          "lastname" : "Baker",
          "age" : 40,
          "gender" : "F",
          "address" : "206 Llama Court",
          "employer" : "Dognosis",
          "email" : "[email protected]",
          "city" : "Dunlo",
          "state" : "WV"
        },
        "sort" : [
          "998"
        ]
      },
    
    1. scroll_id:scroll查询需要存储当时的查询快照,不适合实时查询,适用于处理大数据量的情况,例如reindex。
    	第一次搜索
    	GET /account/_search?scroll=1m
    	{
           
    	 "size": 1
    	}
    	结果中包含一个scrollid,用作下次查询的参数
    	"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABFxcWWVpDc0RPQkdSOGVSR09OU0xySjd2QQ==",
    	
    	带上scroll_id后的请求
    	GET /_search/scroll
    	{
           
    	  "scroll": "1s",
    	  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABE8YWWVpDc0RPQkdSOGVSR09OU0xySjd2QQ=="
    	}
    	
    
    scroll搜索每次请求都会得到size条数据,直到请求完所有结果,返回空数组。
    如果不需要排序,可以指定一下条件提高性能
    	"sort": [
        "_doc"
      ]
    
    清空上下文,关闭文件句柄
    DELETE /_search/scroll/_all
    DELETE /_search/scroll
    {
           
        "scroll_id" : [
          "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
          "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
        ]
    }
    
    1. from size:from size方式不适合深分页查询,查询时每个shard会搜索from+size条数据,汇总给协调节点后,协调节点再筛出需要的size条数据,深分页性能不好。

fielddata 会加载索引中(针对该特定字段的) 所有的 文档
fielddata 结构不会在索引时创建。相反,它是在查询运行时,动态填充
indices.fielddata.cache.size :为fielddata 分配的堆空间大小,空间不够时,会回收fielddata(LRU 算法回收最近未使用)
fielddata监控: GET /_stats/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?fields=*
GET /_nodes/stats/indices/fielddata?level=indices&fields=*
使用设置 ?fields=* ,可以将内存使用分配到每个字段。
如果加载的fielddata大小超过设置的空间,会报oom(需要设置断路器避免)
断路器会在查询前预先估算所用的内存空间,估算的大小超过限制,查询会终止并抛出异常

indices.breaker.fielddata.limit
fielddata 断路器默认设置堆的 60% 作为 fielddata 大小的上限。

indices.breaker.request.limit
request 断路器估算需要完成其他请求部分的结构大小,例如创建一个聚合桶,默认限制是堆内存的 40%。

indices.breaker.total.limit
total 揉合 request 和 fielddata 断路器保证两者组合起来不会使用超过堆内存的 70%。

动态更新运行中的集群参数
PUT /_cluster/settings
{
“persistent” : {
“indices.breaker.fielddata.limit” : “40%”
}
}

断路器是根据总堆内存大小估算查询大小,不是根据可用内存估算

fielddata预加载设置:
PUT /music/_mapping/_song
{
“tags”: {
“type”: “string”,
“fielddata”: {
“loading” : “eager”
}
}
}
设置 fielddata.loading: eager 可以告诉 Elasticsearch 预先将此字段的内容载入内存中。
Fielddata 的载入可以使用 update-mapping API 对已有字段设置 lazy 或 eager 两种模式。

聚合模式:
深度优先:深度优先是默认设置,对每一个桶进行纵向遍历
广度优先:会根据条件进行横向剪枝,
聚合时开启广度优先
{
“aggs” : {
“actors” : {
“terms” : {
“field” : “actors”,
“size” : 10,
“collect_mode” : “breadth_first” 本层聚合已开启广度优先
},
“aggs” : {
“costars” : {
“terms” : {
“field” : “actors”,
“size” : 5
}
}
}
}
}
}

你可能感兴趣的:(es相关)