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]

解决方案一,把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一样要求必须满足条件,但是不参与分值计算,可以提高查询效率。

字符串类型
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的副本,分片与副本处于不同节点,这样某个节点挂了,不会导致分片和副本同时挂掉。

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 |
网友评论