Elasticsearch学习笔记 -- 1

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

具体的大家可以再去网上看看介绍。这里就不阐述了

Elasticsearch

安装

笔者这里是使用docker安装的,比较方便。笔者使用docker-compose搭建了一个集群,并且安装了head插件。

  1. docker-compose.yml内容为
version: '3'
services:
  elasticsearch-master:
    restart: always
    image: elasticsearch:latest
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - ./master-config:/usr/share/elasticsearch/config
    

  elasticsearch-slave1:
    restart: always
    image: elasticsearch:latest
    ports:
      - "8200:9200"
      - "8300:9300"
    depends_on:
      - elasticsearch-master
    links:
      - elasticsearch-master
    environment:
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - discovery.zen.ping.unicast.hosts=lasticsearch-master
    volumes:
      - ./slave1-config:/usr/share/elasticsearch/config

  elasticsearch-head:
    restart: always
    image: mobz/elasticsearch-head:5
    ports:
      - "9100:9100"

具体的我会放到github上,如果想使用只要clone下来进入docker-start目录执行

$ docker-compose up -d

即可,如果没安装dockerdocker-compose,请自行搜索安装。

注:

  • 如果不搭建集群可以直接docker run,但是测试发现如果单结点运行在插入索引的时候,健康状态会变成yellow,
  • 随从结点可以不开启http,可以根据自己需要编写elasticsearch.yml
  • 第一次创建完容器之后,下次启动需要进入docker-compose.yml所在的文件路径执行docker-compose start即可。

测试是否成功

  1. 在浏览器输入127.0.0.1:9100,进入head插件的web端查看
  1. 还可以直接输入127.0.0.1:9200,查看相应结点的状态

根据提示,判断是否成功,如果你使用我的docker配置文件,除非端口冲突,一般是不会出错的。

elasticsearch基本操作

es的api基本格式为:http://<ip>:<port>/<索引>/<类型>/<文档id>

使用http动词来操作数据

创建索引

  1. 非结构化创建索引
    PUT {{host}}/people

people为索引名

  1. 结构化创建索引
    POST {{host}}/book/novel/_mappings
{
  "novel": {
    "properties": {
      "title": {
        "type": "text"
      }
    }
  }
}

执行创建结构化时,索引必须存在,即执行上述命令时,book索引必须存在

如果索引不存在,使用下面的方式

PUT {{host}}/people

{
    "settings":{
        "number_of_shards":3,   
        "number_of_replicas": 1
    },
    "mappings":{
        "man":{
            "properties":{
                "name":{
                    "type": "text"
                },
                "country":{
                    "type": "keyword"
                },
                "age":{
                    "type": "integer"
                },
                "date":{
                    "type":"date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        },
        "woman":{
        }
    }
}
  • settings为当前索引的配置,比如切片数备份数
  • es支持||代表当前属性支持多种格式

数据插入

  1. 指定文档id插入

PUT {{host}}/people/man/1

{
    "name":"earthchen",
    "country": "China",
    "age": 18,
    "date":"1996-11-25"
}
  1. 自动生成id插入

POST {{host}}/people/man

{
    "name":"earthchen2",
    "country": "China",
    "age": 20,
    "date":"1997-11-25"
}

数据修改

  1. 直接修改

POST {{host}}/people/man/1/_update

{
    "doc":{
        "name":"修改后的name"
    }
}
  1. 使用脚本

POST {{host}}/people/man/1/_update

{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.age=params.age",
        "params":{
            "age":100
        }
    }
}

或
{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.age+=10",
    }
}

数据删除

  1. 删除指定的文档

DELETE {{host}}/people/man/1

  1. 删除指定索引

DELETE {{host}}/people

基本查询

查询结构为

{
    "mappings": {
        "novel": {
        "properties": {
            "word_count": {
                "type": "integer"
                },
            "author": {
                "type": "keyword"
                },
            "title": {
                "type": "text"
                },
            "publish_date": {
                "format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis",
                "type": "date"
        }
    }
}
简单查询
  1. 根据id查询数据

GET {{host}}/book/novel/2

条件查询
  1. 查询所有数据

POST {{host}}/book/_search

{
    "query":{
        "match_all":{
        }
    }
}

默认10条数据

  1. 指定从第几条返回,返回多少条数据

POST {{host}}/book/_search

{
    "query":{
        "match_all":{}
    },
    "from":1,
    "size":2
}
  1. 查询关键词

    • 查询title中含有title的数据

    POST {{host}}/book/_search

    {
        "query":{
            "match":{
                "title":"title"
            }
        }
    }
    
    • 增加排序规则(按照publish_date的降序排列)

    POST {{host}}/book/_search

    {
        "query":{
            "match":{
                "title":"title4"
            }
        },
        "sort":[
                {
                    "publish_date":{
                        "order":"desc"
                    }
                }
            ]
    }
    
聚合查询
  1. 按照指定字段聚合查询

POST {{host}}/book/_search

{
    "aggs":{
        "group_by_word_count":{
            "terms":{
                "field":"word_count"
            }
        },
        "group_by_publish_date":{
            "terms":{
                "field":"publish_date"
            }
        }
    }
}
  1. 按照指定字段聚合计算

POST {{host}}/book/_search

{
    "aggs":{
        "grades_word_count":{
            "stats":{
                "field":"word_count"
            }
        }
    }
}

高级查询

子条件查询(特定字段查询所指特定值)
  1. Query context

(在查询过程中,除了判断文档是否满足查询条件,es还会计算一个_score,来标示匹配的程度,为了判断目标文档和查询条件有多好)

  • 全文本查询(针对文本类型数据)

    1. 模糊匹配(分词匹配)match

      查询title中含有elasticsearch或者入门的数据

      POST {{host}}/book/_search

      {
          "query":{
              "match":{
                  "title":"elasticsearch入门"
              }
          }
      }
      
    2. 不分词匹配(将查询内容作为一个整体)match_phrase

      查询title中含有elasticsearch学习的数据

      POST {{host}}/book/_search

      {
          "query":{
              "match_phrase":{
                  "title":"elasticsearch学习"
              }
          }
      }
      
    3. 对多个字段的匹配查询multi_match

      查询title或者author字段中含有elasticsearch的数据

      POST {{host}}/book/_search

      {
          "query":{
              "multi_match":{
                  "query":"elasticsearch",
                  "fields":["title","author"]
              }
          }
      }
      
    4. 语法查询query_string

      查询含有elasticsearch学习或者java的数据

      POST {{host}}/book/_search

      {
          "query":{
              "query_string":{
                  "query": "(elasticsearch AND 学习) OR java"
              }
          }
      }
      
    5. 指定字段语法查询query_string

      查询字段title或者author中含有elasticsearch学习或者java或者aaa的数据

      POST {{host}}/book/_search

      {
          "query":{
              "query_string":{
                  "query": "(elasticsearch AND 学习) OR java OR 4444",
                  "fields":["author","title"]
                  
              }
          }
      }
      

}

  • 字段级别查询(针对结构化数据,数字,日期等)term

    1. 对指定字段的精确查询

      1. 查询word_count等于1000的的数据

      POST {{host}}/book/_search

      {
          "query":{
              "term":{
                  "word_count": 1000
              }
          }
      }
      
      1. 查询word_count在范围1000到3000内的数据

      POST {{host}}/book/_search

      {
          "query":{
              "range":{
                  "word_count":{
                      "lte": 3000,
                      "gte":1000
                  }
              }
          }
      }
      
  1. Filter context

    (在查询过程中,只判断该文档是否满足条件,只有yes或者no,并且会缓存结果)

    查询出word_count等于1000的数据

    {
        "query":{
            "bool":{
                "filter":{
                    "term":{
                        "word_count":1000
                    }
                }
            }
        }
    }
    
复合条件查询(以一定的逻辑组合子条件查询)
  1. 固定分数查询

    查询所有索引中title为java

    POST {{host}}/_search

    {
        "query":{
            "constant_score":{
                "filter":{
                    "match":{
                        "title": "java"
                    }
                },
                "boost":2
            }
        }
    }
    
  2. 布尔查询

    1. 查询所有索引中authoraaatitleelasticsearchshould

    POST {{host}}/_search

    {
        "query":{
            "bool":{
                "should":[
                    {
                        "match":{
                            "auther":"aaa"
                        }
                    },
                    {
                        "match":{
                            "title": "elasticsearch"
                        }
                    }
                ]
            }
        }
    }
    
    1. 查询所有索引中author含有aaa,title含有java的数据 (must)

    POST {{host}}/_search

    {
        "query":{
            "bool":{
                "must":[
                    {
                        "match":{
                            "author":"aaa"
                        }
                    },
                    {
                        "match":{
                            "title": "java"
                        }
                    }
                ]
            }
        }
    }
    
    1. 查询所有索引中author含有aaa,title含有java,并且过滤word_count1000的数据 (must)

    POST {{host}}/_search

    {
        "query":{
            "bool":{
                "must":[
                    {
                        "match":{
                            "author":"aaa"
                        }
                    },
                    {
                        "match":{
                            "title": "java"
                        }
                    }
                ],
                "filter":{
                    "term":{
                        "word_count": 1000
                    }
                }
            }
        }
    }
    
    1. 查询所有索引中author不含有aaa,并且title不含有java的数据 (must_not)

    POST {{host}}/_search

    {
        "query":{
            "bool":{
                "must_not":[
                    {
                        "match":{
                            "author":"aaa"
                        }
                    },
                    {
                        "match":{
                            "title": "java"
                        }
                    }
                ]
            }
        }
    }
    

spring boot 使用es

集成es

1.在pom.xml中添加依赖。(es的依赖必须与你的es版本相对应,自行查看es版本 es内部使用log4j2作为日志,所以还需要添加log4j依赖)

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <elasticsearch.version>5.6.7</elasticsearch.version>
        <log4j-api.version>2.8.2</log4j-api.version>
        <log4j-core.version>2.7</log4j-core.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--elasticsearch 客户端-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <!--ElasticSearch 5.x 根据官网配置maven 依赖, 由于 5.0x的 jar 内部使用的 apache log4日志。-->
        <!--所以要配置额外的依赖支持 org.apache.logging.log4j。-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j-core.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. 添加log4j2的配置文件
    resources中创建文件log4j2.properties
appender.console.type=Console
appender.console.name=Console
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=[%t] %-5p $c -%m%n
rootLogger.level=info
rootLogger.appenderRef.console.ref=console

笔者这里只配置了控制台的,如果还需要其他的自行配置一下。

对es进行操作

在需要的地方注入TransportClient,进行操作即可。具体内容这里就不贴出来了,github上有源码可以自己看看。

注:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容