es笔记

作者: 修行者12138 | 来源:发表于2020-12-16 18:07 被阅读0次

analyzer分词器

analyzer由character filter, tokenizer, token filter组装而成
character filter 在tokenizer之前对原始文本进行处理,比如去掉html标签
tokenizer 将原始文档按照一定规则切分为单词
token filter 针对tokenizer 输出的单词进行增删改等操作,比如转化为小写

分词器使用的两个情形:
1,Index time analysis. 创建或者更新文档时,会对文档进行分词
2,Search time analysis. 查询时,对查询语句分词

ik_max_word与ik_smart

ik_max_word:会将文本做最细粒度的拆分;尽可能多的拆分出词语
ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
以“招商银行”为例
ik_max_word效果

{
    "tokens": [
        {
            "token": "银行",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "银",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "行",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 2
        }
    ]
}

ik_smart效果

{
    "tokens": [
        {
            "token": "银行",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        }
    ]
}

preference参数

Elasticsearch在处理搜索请求时,默认会随机选择分片或其副本查询数据,导致同样的搜索结果顺序有可能不同,如果想要保证搜索结果顺序一致,可以在url加上preference=_primary_first。
preference 参数用来控制由哪些分片或副本来处理搜索请求,有以下选择
(1)randomizeacross shards:随机选择分片或其副本查询数据,es的默认方式。
(2)_local:优先在本地节点上的分片查询数据然后再去其他节点上的分片查询,本地节点没有IO问题但有可能造成负载不均问题。
(3)_primary:搜索只在主分片执行搜索请求,副本不参与搜索;性能会打折扣,达不到性能的水平扩展。
(4)_primary_first:优先在主分片执行,如果主分片挂掉,会在副本执行请求。
(5)_only_node:123 :只在123这个节点执行搜索。
(6)_prefer_node:123:搜索请求优先在节点123执行。
(7)_shards:2,3:搜索只在分片2、3执行,可以与_primary参数一起使用如:_shards:2,3;_primary
(8)随机字符串:指定一个随机字符串,可以保证同样的请求,被分配到同样的副本上面,从而保证同一请求结果的稳定性。我遇到的问题就可以使用这种方式,把搜索串的hash值作为随机字符串,这样可以保证同一个搜索条件的请求的返回结果和排序一致。

max_result_window

默认一次只能查询10000条文档,否则报错Result window is too large, from size must be less than or equal to: [10000]


image.png

解决方案一,把max_result_window调大

PUT {{di}}/audit_es_gis/_settings
{
    "settings" : {
        "index" : {
            "max_result_window":100000
        }
    }
}

解决方案二,使用es游标

修改field类型

ElasticSearch中的index一旦建立, 里面的field类型就不可以再更改. 例如, 你不能把一个int类型的字段, 改为string类型,否则该字段中的数据将失效,想要改field类型,只能重建索引(reindex).

filter查询

如果不需要计算分值,可以使用bool查询的filter。filter与must一样要求必须满足条件,但是不参与分值计算,可以提高查询效率。


image.png

字符串类型

ES2.x版本时,字符串只有string类型,没有keyword和text类型。
ES5.x版本后,取消了 string类型,增加了keyword类型和text类型

映射参数 fields

出于不同的目的,可能需要用不同分词器索引同一个字段。例如,一个字符串字段可以映射为text字段用于全文搜索,也可以映射为keyword字段用于排序或聚合。

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

keyword类型长度限制

keyword类型的字段,长度不能超过32766字节,否则报错如下
max_bytes_length_exceeded_exception: bytes can be at most 32766 in length

ignore_above

设置ignore_above(单位为字符)后,超过给定长度的字符会被储存,但不被索引。例如设置ignore_above为10,插入一个字符数为11的字符串,这个字符串会被完整的储存,但是不会被索引(整个字符串都不被索引,而不是超过10个字符部分不被索引)

节点 分片 副本

集群内的每个服务器是一个节点,一个节点可以有多个分片,一个分片可以有多个副本。
下图中,有两个节点,每个节点有3个分片,每个分片副本数为1,B1/B2/B3分别为A1/A2/A3的副本,分片与副本处于不同节点,这样某个节点挂了,不会导致分片和副本同时挂掉。


image.png

mysql与es对比

mysql sql语句 es api
where age = 18 term
where age in (18, 19, 20) terms
where name like ‘%xx%’ match_phrase,slot设为0
update age = 18 where xx _update_by_query
delete from xx where xx _delete_by_query
组合查询,如where age = 18 and name like ‘%xx%’ bool

相关文章

网友评论

    本文标题:es笔记

    本文链接:https://www.haomeiwen.com/subject/yvgzgktx.html