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主要是用来一批一批检索数据,让系统进行处理的。