ElasticSearch入门学习

(1)ElasticSearch的概述

ElasticSearch(简称ES)用于进行全文检索的查询,它的底层使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

优点:(1)分布式的实时文件存储,每个字段都被索引并可被搜索

          (2)分布式的实时分析搜索引擎

          (3)可以扩展到上百台服务器,处理PB级结构化或非结构化数据

          (4)高度集成化的服务,上手Elasticsearch非常容易

          (5)支持集群没有单点故障,支持多种语言

(2)lunce的缺点

lunce只是一个库,想要使用它必须使用java与语言将它直接集成到自己的应用中去使用,但是lunce的配置和使用相当复杂入门难(需要创建索引和搜索索引),且lunce只能在java项目中使用,并且要以jar包的方式直接集成到项目中,且不支持集成环境 索引库和应用应处于同一个服务器,如果搜索的数据量太大就不行,因为搜索的时候会创建索引库,这个库是放在磁盘上的,数据量大 库占用的空间就会增大。

(3)ElasticSearch的安装

ElasticSearch是由服务端和客户端组成的

a.服务端

            下载ES安装包:官方下载地址:https://www.elastic.co/downloads/elasticsearch

            下载后是绿色版本,解压后就能直接安装

             由于每个人的电脑配置不相同,低配的可以去修改解压后文件中的config文件下的jvm.options文件,改为:-Xms1g

             然后去bin下运行elasticsearch.bat,成功浏览器后验证:访问:http://localhost:9200

b.客户端

             客户端可以分为图形界面客户端和代码客户端.,这里主要讲图形界面客户端,代码客户端后面讲解

            这里的的客户端以Kibana5为介绍

            下载Kibana5:https://www.elastic.co/downloads/kibana,下载解压后编辑config/kibana.yml,设置elasticsearch.url的值为

                                   已启动  的ES,即打开里面的elasticsearch.url注解。

            启动Kibana5 : bin\kibana.bat,启动成功在浏览器中检验:http://localhost:5601

(4)Restful认识

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。  url中不要出现动词。

(5)ElasticSearch数据管理

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。数据格式为json格式

一个document中包含:_index(这个相当于数据库名),_type(这个相当于表名),_id(这个相当于document中的唯一标志符),_source(表示文档原始数据),_all(这个表示所有字段的连接字符串)

(6)文档的增删改

a.增加

             添加有两种方式,一种是用PUT 还有一种用POST

          (1)PUT方式:

              

#添加(put方式 即可以自定义document的id)
put crm/t_department/1
{
  "id":1,
  "name":"测试1",
  "age":18
}

          (2)POST方式:

#添加(post方式 即自动生成document的id)
post crm/t_department/
{
  "id":2,
  "name":"测试2",
  "age":19
}

          PUT 和POST的区别:

                    PUT添加需要指定document的id,POST添加会自动生成一个id

b.修改

            修改有两种方式,一种是用PUT 还有一种用POST

            (1)PUT

#修改(put修改 会覆盖修改)
put crm/t_department/AWmjycKnJAiT1pGD1sJs
{
  "id":2,
  "name":"测试2"
}

            (2)POST

#修改(post修改 只修改部分数据)
post crm/t_department/AWmjycKnJAiT1pGD1sJs/_update
{
  "doc":{
    "name":"测试哈哈",
    "age":19
  }
}

PUT 和POST的区别:

                    PUT修改的时候是进行的覆盖是修改 即先删除原来的 再进行添加,POST修改只修改部分数据

c.删除

#删除(删除指定的document的id)
delete crm/t_department/AWmjycKnJAiT1pGD1sJs

#删除(删除整个库)
delete crm

(7)文档的查寻

查询的方式有很多,但都是通过GET进行查询

#根据doucument的id进行查询
get crm/t_department/1

#空搜索,查询这个库
get _search

#查询这个表中的所有数据
get crm/t_department/_search

批量查询

#批量查询(注意GET是大写),可以适用于不同数据库中
GET _mget
{
  "docs": [
      {
        "_index": "crm",
        "_type": "t_department",
        "_id": "1"
      },
      {
        "_index": "crm",
        "_type": "t_department",
        "_id": "2"
      }
    ]
}

#批量查询,适用于同一数据库中的查询
GET crm/t_department/_mget
{
  "ids":[1,3]
}

分页查询

#分页查询(size:表示每页显示的条数,form:表示从哪一条数#据开始查询,默认是从0开始)
GET crm/t_department/_search?size=2&from=0

关键字条件查询

#查询字符串进行搜索(关键字条件查询),需要用到q #且只能使用q,如果不指定q则查询所有
GET crm/t_department/_search?q=age:19

高级查询

#高级查询
#查询t_department表中的年龄为19-20之间的数据进行分页 #每页三条从第0条数据的开始,再按照年龄进行降序排序,然#后只显示年龄和姓名
GET crm/t_department/_search?q=age[19 TO 20]&size=3&from=0&sort=age:desc&_source=age,name

(8)DSL查询

概述:DSL是为了解决上面的高级查询的语句的复杂性而产生的新的查询语言,它以json的请求形式出现

DSL包含查询与过滤

a.查询:

#查询年龄为:19的数据
GET crm/t_department/_search
{
  "query": {
    "match": {
      "age": 19
    }
  }
}

查询t_department表中的年龄为19-20之间的数据进行分页   每页三条从第0条数据的开始,再按照年龄进行降序排序,然#后只显示年龄和姓名

#"match": {}表示必须完全匹配,应该放在query中,但是因为我这里用不上这个,所以query可以为空

GET crm/t_department/_search
{
  "query": {
    "match": {
      "age": 19
    }
  }, 
  "_source": ["name","age"],
  "size": 2,
  "from": 0,
  "sort": [
    {
      "age": "desc"
    }
  ]
}

条件范围查询:(查询年龄是18-60岁的,两边都包含)

 gt表示>    gte表示>=   lt表示<  lte表示<=

GET crm/t_department/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 18,
        "lte": 60
      }
    }
  }
}

一些了解的查询:

                   multi_match 表示查询的时候可以匹配多个值
                  Term和Terms 表示查询和过滤中的单词匹配,Terms是复数形式,可以匹配多个
                   minimum_match 表示至少匹配的个数,默认为1

                  前匹配:prefix 用于查询搜索中
                  通配符搜索查询: wildcard 用于查询搜索中,使用*代表0~N个,使用?代表1个   例如:
                               "wildcard": {
                                     "name": "文*华"
                                }

DSL过滤:

bool 表示条件组合查询和过滤,里面包含:must,should,must_not,filter,minimum_should_match 等,注意 如果bool下面没有must 就必须有should子句,如果有must 就可以不必有should

此处过滤用的bool,里面包含查询和过滤,而在查询处的时候,#因为match的匹配里面没有写东西 为空,所以当里面的东西为#空的时候,不能写它,而filter为过滤器,它是根据上面的查#询器查询得到所有的数据后 再对这些数据进行过滤,此处配#置的过滤器为年龄=20的数据,所以 在查询出来的值里只能得#到age=12的数据,再把这些数据进行最后面的分页排序显示设#置

#此处用的match_all 表示查询的所有的数据
GET crm/t_department/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "term": {
          "age": 20
        }
      }
    }
  },
  "_source": ["name","age"],
  "size": 2,
  "from": 0,
  "sort": [
    {
      "age": "desc"
    }
  ]
}

(9)分词与映射

在全文检索理论中,文档的查询是通过关键字查询文档索引来进行匹配,因此将文本拆分为有意义的单词,对于搜索结果的准确性至关重要,因此,在建立索引的过程中和分析搜索语句的过程中都需要对文本串分词。

分词器有很多,指的是进行搜索的时候将词进行拆分去匹配。市面上有很多分词器,例如庖丁分词器,结巴分词器,ik等,此处以ik为例讲解。

首先配置ik分词器:进行下载ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik

下载后进行打包为jar包,然后进行解压,解压之后将文件放入ES根目录/plugins/ik目录下,配置完成后需要重启服务器和客户端

文档映射Mapper:ES的文档映射(mapping)机制用于进行字段类型确认(字段是什么类型,那个分词器),将每个字段匹配为一种确定的数据类型。我的理解:指的是在创建表的时候,一些默认字段不能满足我们的需求的时候(例如 在创建字段的时候 字段类型 不是我们想要的 这时候,这时候 就需要自己来配置映射)

文档映射包括:默认映射,自定义映射,全局映射

检查映射(两种方式都可以):
              (1)GET dms/user/_mapping
              (2)GET dms/_mapping/user

                          默认映射表:

JSON type

Field type

Boolean: true or false

"boolean"

Whole number: 123

"long"

Floating point: 123.45

"double"

String, valid date:"2014-09-15"

"date"

String: "foo bar"

"string":text,keyword

                     自定义映射:

#配置自定义映射
POST aisell/_mapping/dept
{
    "dept":{
      "properties": {
        "id": {
          "type": "integer"
        },
        "price":{
          "type": "double"
        }
     }
  }
}

            全局映射 :通过动态模板和默认设置两种方式进行实现

默认方式:  _default_        

表示在数据库dms中,新建的表user和表dept都会继承_defaul#t_的配置,user类型的文档中将不会合并所有字段到_all,而#dept会

PUT dms
{
  "mappings": {
    "_default_": { 
      "_all": {
        "enabled": false
      }
    },
    "user": {}, 
    "dept": { 
      "_all": {
        "enabled": true
      }
    }
  }
}

动态模板   dynamic_templates(创建一个名为global_template的动态模板)

PUT _template/global_template
{
  "template":   "*",
  "settings": { "number_of_shards": 1 },
  "mappings": {
    "_default_": {
      "_all": { 
        "enabled": false
      },
      "dynamic_templates": [
        {
          "string_as_text": { 
            "match_mapping_type": "string",
            "match":   "*_text",
            "mapping": {
              "type": "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word",
              "fields": {
                "raw": {
                  "type":  "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        },
        {
          "string_as_keyword": { 
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
             }
          }
        }
      ]
    }
  }}

作用域:自定义映射>全局映射>默认映射

最佳实践顺序:默认映射-->全局映射-->自定义映射

你可能感兴趣的:(java)