程序员IT技术篇

项目中使用ElasticSearch

2019-09-25  本文已影响0人  冰鱼飞鸟

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等于的时候,大于的时候,大于等于的时候)。

上一篇下一篇

猜你喜欢

热点阅读