1.首先为什么要用ES?
ElasticSearch看这名字就知道是用来搜索的。
2.用ES带来什么好处?
a. 可以有效减少数据库索引的数量。
比如一个表有A,B,C三个字段要提供搜索功能,那么为了查询效率,我们通常会根据我们需要的sql语句去创建索引,这里假设不能组合索引,那么我们需要建立A,B,C三个索引。
如果把这个表的ID,和A,B,C 数据往ES上放一份,要查询的时候去ES查,查到ID后再去数据库里面查那么数据库中是不是就不需要建这三个索引了。
b. ES的分词器对模糊匹配很友好(如NGram分词器)
用数据库做模糊匹配,很多情况下都不会走索引,速度比较慢,而且有风险。
3.怎么用ES?
a. 项目中引入es客户端。
java项目中我认为用es官网上提到的restClient会比spring data elasticsearch好一些,主要是es升级太快了,restClient对es server的升级更加友好。
b.启动es server并且配置es的index。
(1)配置分词器NGram
"settings": {
...
"index": {
"analysis": {
"analyzer": {
"mygram_analyzer": {
"type": "custom",
"tokenizer": "myGram"
}
},
"tokenizer": {
"myGram": {
"type": "nGram",
"min_gram": "1",
"max_gram": "5"
}
}
}
}
...
}
注意minGram和max根据需要设置不要两者的间隔不要设置太大,否则插入es的时候会比较慢。
比如一个‘any’ ngram配了min:1 max:2 那么就会被分词为 'a','n','y','an','ny'。
(2) 设mappings并且指定类型和用哪个分词器。
{
"mappings": {
"_doc": {
"properties": {
"searchFieldA": {
"type": "text",
"analyzer": "mygram_analyzer",
},
"dateFieldA": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"userId": {
"type": "long",
"doc_values": false
}
}
}
},
settings:{
...
}
}
c. es支持乐观锁,并且支持内部的和外部的(如果你的表上本来就有version那么es支持用你传入的version,并且可以设置更新规则如version等于的时候,大于的时候,大于等于的时候)。
网友评论