ElasticSearch:

        简称ES,基于Apache Lucene构建的开源搜索引擎

        采用Java编写,提供了简单易用的RESTFul API

        轻松的横向扩展,可支持PB级的结构化或非结构化数据处理


    应用场景:

  •             海量数据分析引擎
  •             站内搜索引擎
  •             数据仓库

    

    安装:

            版本历史:1.x->2.x->5.x->6.x       

            官方网址:https://www.elastic.co

            下载elasticsearch-6.6.1并解压            ​注意:JDK需大于1.8


    启动:

            进入elasticsearch目录,运行命令行:

        sh ./bin/elasticsearch         //注:由于安全机制不能用root权限运行                   sh ./bin/elasticsearch -d    //后台启动
            如果遇到报错:[unknown] unable to install syscall filter: java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed 
                修改elasticsearch.yml 添加一下内容 : 
                bootstrap.memory_lock: false  
                bootstrap.system_call_filter: false

            运行完成后输入127.0.0.1:9200查看是否成功


     安装插件Head(可视化界面):

             github地址:https://github.com/mobz/elasticsearch-head

             下载解压后,进入目录使用安装:

        sudo npm install

              安装后运行:

        npm run start


    通过ElasticSearch-Head和ElasticSearch进行注册与分布式集群安装

            注册:

                    在/config/elasticsearch.yum中添加配置:(master)

            http.cors.enabled: true
            http.cors.allow-origin: "*"

            分布式集群:

                    1、需要一个master节点,在elasticsearch.yum中配置:

            cluster.name: demo    //项目名称,需统一
            node.anme: master    //节点名称
            node.master: true    //声明此节点为master
            network.host: 127.0.0.1    //绑定Ip

                    2、slave节点配置:

            cluster.name: demo
            node.name: slave1
            network.host: 127.0.0.1
            http.post: 8200    //端口自定
            discovery.zen.ping.unicast.hosts: ["127.0.0.1"]    //寻找master


    基本用法:

            1、RESTFulAPI

                        格式:http://<ip>:<post>/<索引>/<类型>/<文档ID>

                        常用Http动词:GET/PUT/POST/DELETE

            2、创建结构化索引(非结构化索引直接在插件中创建)    

                        例:PUT: http://127.0.0.1:9200/people

JSON:
{
    "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":{
    }
}

}

            3、插入

                   1、手动添加ID 例:PUT:127.0.0.1:9200/people/man/1

JSON:
{
"name":"Labmem",
"country":"China",
"age":18,
"date":"2001-01-01"
}

                    2、自动生成ID 例:POST:127.0.0.1/people/man        json格式相同

            4、修改

                    1、直接修改 例:POST:127.0.0.1:9200/people/man/1/_update

JSON:
{
"doc":{
"name":"labmem"
}
}

                    2、脚本修改 例:POST:127.0.0.1:9200/people/man/1/_update         API一样

脚本:
{
"script":{
"lang":"painless", //支持多种脚本语言,painless为内置脚本语言
"inline":"ctx._source.age +=10"
}
}
OR
{
"script":{
"lang":"painless",
"inline":"ctx._source.age = params.age",
"params":{
"age":100
}
}
}

            5、删除

                    1、删除数据  例:DELETE:127.0.0.1:9200/people/man/1        //通过ID删除

                    2、删除索引  例:DELETE:127.0.0.1:9200/people

            6、查询

                    1、简单查询  例:GET:127.0.0.1:9200/people/man/1        //通过ID简单查询

                    2、条件查询  例:POST:127.0.0.1:9200/people/_search

JSON:

{
"query":{
"match_all":{} //全部
},
"from":1 , //从哪里返回
"size":10 //返回几条数据
}

{
"query":{
"match":{
"name":"lab" //关键字
}
},
"sort":[ //查询条件
{"date":{"order":"desc"}}
]
}

                    3、聚合查询  例:POST:127.0.0.1:9200/book/_search

JSON:
{
"aggs":{
"group_by_word_count":{
"stats":{
"field": "word_count" //统计计算,或者min/max等
} ,
"group_by_publish_date":{
"terms":{
"field": "publish_date"
}
}
}
}


    高级查询:

   子条件查询:指定字段查询所指特定值

      Query Context

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

                  1、全文本查询  例:POST:127.0.0.1:9200/book/_search
JSON:
模糊匹配
{
"query":{
"match":{
"title":"ElasticSearch 入魔"
}
}
}
习语匹配
{
"query":{
"match_phrase":{
"title":"ElasticSearch 入魔"
}
}
}
多个字段匹配
{
"query":{
"multi_match":{
"query":"ElasticSearch 入魔",
"fields":["author","title"]
}
}
}
语法查询
{
"query":{
"query_string":{
"query":"ElasticSearch AND 大法" //"(ElasticSearch AND 大法) OR Python"
}
}
}

                 2、结构化数据查询  例:POST:127.0.0.1:9200/book/_search

JSON:
{
"query":{
"term":{
"word_count": 1000
}
}
}
范围查询
{
"query":{
"range":{
"word_count": {
"gte":1000, //大于等于 ,e就是=
"lte":2000 //小于等于
},
"publish_date": {
"gt":"2018-10-01", //大于
"lte":"now"
}
}
}
}

     Filter Context

            在查询过程中,值判断该文档是否满足条件,只有Yes或者No。

            例:POST:127.0.0.1:9200/book/_search

JSON:
{
"query":{
"bool":{
"filter":{
"term":{
"word_count":1000
}
}
}
}
}


    复合条件查询:以一定的逻辑组合子条件查询      

        固定分数查询:

                例:POST:127.0.0.1:9200/_search

JSON:
{
"query":{
"constant_score":{
"filter":{
"match":{
"title":"ElasticSearch"
}
},
"boost":2 //指定分数
}
}
}

        布尔查询

{
"query":{
"bool":{
"should":[
{
"match":{
"title":"ElasticSearch"
}
},
{
"match":{
"author":"瓦力"
}
}
]
}
}
}