美文网首页程序员IT技术篇
项目中使用ElasticSearch

项目中使用ElasticSearch

作者: 冰鱼飞鸟 | 来源:发表于2019-09-25 22:54 被阅读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等于的时候,大于的时候,大于等于的时候)。

    相关文章

      网友评论

        本文标题:项目中使用ElasticSearch

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