深入理解ES 第一章-ES基础功能大全

ES基本类型

字段可自定义的参数

analyzer

分词器 可定义一个细粒度分词器

boost

字段评分权重,作用于按照多个条件查询,其中一个条件比如id命中了,但是因为评分机制,id命中的数据并没有排序在前面

举例

catergory=1

或者 (name=“abc" xxxx=bbbb)

比如有5条category=1的值 3条在前面,另外两个是 (name=“abc" xxxx=bbbb) 通过权重可以放到前面

fielddata

是否生成正向索引存储在内存中,只有生成才能对text字段聚合。但是全部内容加入内存。 不推荐使用

ignore_above

这是用来指定keyword字符串长度的 默认256

index

决定字段是否可以被索引 如果是no,则无法通过检索查询到该字段; (是否建立倒排索引)

norms

是否参与打分

search_analyzer

搜索分词器 可定义一个粗粒度的分词器搜索性能更高

normalizer

参数用于自定义解析前(索引或者查询)的标准化配置。 只对keyword有效

doc_values

默认是开启的,如果确定某个字段不需要排序或者不需要聚合,那么可以关闭 doc_values。这个字段利用了列式存储

index_options

控制索引时哪些信息被存储到倒排索引中(用在 text 字段中),有四种取值:

docs:只记录doc id

freqs:记录doc id 和term frequencies

positions:记录doc id、 term frequencies和term position

offsets:记录doc id、 term frequencies、term position、character offsets

text类型的默认配置为positions,其他默认为docs。记录的内容越多,占据的空间越大。

null_value

让null值可以被索引和搜索 默认无法搜索

position_increment_gap

被解析的 text 字段会将 term 的位置考虑进去,目的是为了支持近似查询和短语查询,当我们去索引一个含有多个值的 text 字段时,会在各个值之间添加一个假想的空间,将值隔开,这样就可以有效避免一些无意义的短语匹配,间隙大小通过 position_increment_gap 来控制,默认是 100。

PUT users

PUT users/_doc/1
{
  "name":["zhang san","li si"]
}

GET users/_search
{
  "query": {
    "match_phrase": {
      "name": {
        "query": "sanli"
      }
    }
  }
}

sanli` 搜索不到,因为两个短语之间有一个假想的空隙,为 100。

store

默认情况下,字段会被索引,也可以搜索,但是不会存储,虽然不会被存储的,但是 _source 中有一个字段的备份。如果想将字段存储下来,可以通过配置 store 来实现。没必要存储

copyTo
把字段复制到某一个字段。搜索的时候根据这个字段搜索。无需合并倒排链
* 类似联合索引
* 例:一个模糊查询字段要查询 name nicknam username phone 等字段。组合为一个模糊查询字段。磁盘空间占用变大。性能也变更好。
* 因为无需多次检索FST的树
* 对整合后的字段聚合的话,会得到多个字段的聚合结果  目标对象text和keyword类型都能使用
eager_global_ordinals

表示是否提前加载全局顺序号。 Global ordinals 是一个建立在 doc values 和 fielddata 基础上的数据结构 , 它为每一个精确词按照字母顺序维护递增的编号。 每一个精确词都有一个独一无二的编号 并且 精确词 A 小于精确词 B 的编号 . Global ordinals 只支持 keyword 和 text 型字段,在 keyword 字段中 , 默认是启 用的 而在 text 型字段中 只有 fielddata 和相关属性开启的状态下才是可用的。

搜索

filter 不评分的must

must 必须包含的 相当于and

must_not 不包含

should 包含一个相当于or

1、match all

POST /_search

{

“query”: {

"match_all": {}

}

}

2、match

POST /_search

{
“query”: {
“match”: {
“name”: “亚马逊”
}
}
}

3、multi match

{
“query”: {
“multi_match”: {
“query”: “亚马逊”,
“fields”: [
“name”,
“city”
]
}
}
}

4、range query

POST /company/employee/_search

{
“query”: {
“range”: {
“lastTrackTime”: {
“gte”: 1629777506000
}
}
}
}

5、term query

//把这个字段当成exact value去查询(前提条件:手动创建mapping的时候需要指定no_analy不分词去建立索引,这样才可以用test hello在term搜到)

{
“query”: {
“bool”: {
“must”: [
{
“term”: {
“name.keyword”: “亚马逊”
}
}
],
“must_not”: [],
“should”: []
}
}
}

6、terms query

{
“query”: {
“bool”: {
“must”: [
{
“terms”: {
“name.keyword”: [
“亚马逊”,
“习惯”
]
}
}
],
“must_not”: [],
“should”: []
}
}
}

7、match_phrase短语匹配

{
“query”: {
“match_phrase”: {
“name”: “亚马逊定制”
}
}
}

8、fuzzy

有容错率的like查询

{
“query”: {
“fuzzy”: {
“name.keyword”: “亚ma逊定制”
}
}
}

9、wildcard

https://blog.youkuaiyun.com/laoyang360/article/details/115222329?utm_term=eswildcardQuery%E8%A6%81%E6%85%8E%E7%94%A8%E5%90%97&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-0-115222329&spm=3001.4430

避免以*或?开头的模式。这会增加查找匹配项所需的迭代次数并降低搜索性能。

like查询

{
“query”: {
“wildcard”: {
“name.keyword”: “定制
}
}
}

10、scoll查询

如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scoll滚动查询,一批一批的查,直到所有数据都查询完处理完

使用scoll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来

scoll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的

采用基于_doc进行排序的方式,性能较高

每次发送scroll请求,我们还需要指定一个scoll参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了

每次取3条

GET /test_index/test_type/_search?scroll=1m

{

“query”: {

“match_all”: {}

},

“sort”: [ “_doc” ],

“size”: 3

}

获得的结果会有一个scoll_id,下一次再发送scoll请求的时候,必须带上这个scoll_id

GET /_search/scroll

{

“scroll”: “1m”,

“scroll_id” : “1”

}

scoll,看起来挺像分页的,但是其实使用场景不一样。分页主要是用来一页一页搜索,给用户看的;scoll主要是用来一批一批检索数据,让系统进行处理的。

github地址 https://github.com/zhaohaoh/es-plus
下一篇将介绍ES索引的类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值