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://:/<索引>/<类型>/<文档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依赖)


        UTF-8
        UTF-8
        1.8
        5.6.7
        2.8.2
        2.7
    

    

        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.elasticsearch.client
            transport
            ${elasticsearch.version}
        
        
        
        
            org.apache.logging.log4j
            log4j-core
            ${log4j-core.version}
        

        
            org.projectlombok
            lombok
            true
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
  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上有源码可以自己看看。

注:

  • 上述环境在ubuntu16.04 lts es5.6.7中测试成功
  • 本文源码见https://github.com/EarthChen/elasticsearch-study.git
  • 上述文字皆为个人看法,如有错误或建议请及时联系我`

你可能感兴趣的:(Elasticsearch学习笔记 -- 1)