1. ElasticSearch认识

   ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案

   特点:

  1. 分布式的实时文件存储
  2. 分布式的实时分析搜索引擎
  3. 扩展集群,处理PB级结构化或非结构化数据
  4. 高度集成的服务
  5. 上手简单

  ElasticSearch简化了全文检索lucene的使用,同时增加了分布式的特性,使得构建大规模分布式全文检索变得非常容易。

 

  1. ElasticSearch安装与使用

 注意:ES服务只依赖于JDK,推荐使用JDK1.7+

 1.步骤:

  1. 下载ES安装包
  2. 运行ES    bin/elasticsearch.bat
  3. 验证     访问http://localhost:9300/

 2.Restful认识

   含义:  透明性,暴露资源存在  无状态

   特征:

  1. servlet提供Restful API中,URL中只使用名词来指定资源
  2. Rest是面向资源的
  3. 用HTTP协议里的动词来实现资源的添加 修改 删除等操作

    GET  获取资源   POST新建资源    PUT更新    DELETE删除资源

   Kibana5

      ① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana

      ② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES

      ③ 启动Kibana5 : bin\kibana.bat

      ④ 默认访问地址:http://localhost:5601

 

  1. ElasticSearch数据管理
  2. 是什么

 

es如何实现分布式 es分布式搜索_ElasticSearch

  1. 增删改
GET    获取资源   
POST   新建资源    
PUT    更新    
DELETE 删除资源
Bulk   批量操作
1. 简单的查询
2. 批量获取
      方式一:GET _mget
{
  "docs":[{
      "_index":"itsource",
      "_type":"blog",
      "_id":"123"
    },{
       "_index":"itsource",
      "_type":"blog",
      "_id":"AWpXiEfhCq6ubXlpA9Ia",
      "_source":"title"
      
    }]
}
方式二:
GET itsource/blog/_mget
{
  "ids":["123","AWpXiEfhCq6ubXlpA9Ia"]
}
1. 空搜索
               GET _search
1. 分页搜索
              size  : 每页条数,默认 10
from  : 跳过开始的结果数,默认 0
              GET _search?size=5
1. 查询字符串搜索
                GET crm/employees/_search?q=age:18
GET crm/employees/_search?q=age[10 TO 30]
1. DSL查询与过滤
2. DSL查询
    GET crm/employees/_search
{
"query" : {
    "match" : {
  "name" : "麒麟璧"
   }
  }
}
DSL不支持缓存
1. 过滤查询
  GET shop/goods/_search
{
  "query":{
    "bool": {
      "must": [
        {"match": {
          "name": "iphone"
        }}
      ],
      "filter": [{
        "term":{
          "local":"us"
        }
      },{
        "range":{
          "price":{
            "gte":"5000",
            "lte":"7000"
          }
        }
      }]
    }
  },
  "from": 1,
  "size": 5,
  "_source": ["id", "name", "type","price"],
  "sort": [{"price": "desc"}]
  
}
 
1. 分词与映射
2. IK分词器
    ① Maven打包IK插件
② 解压target/releases/elasticsearch-analysis-ik-5.2.2.zip文件
并将其内容放置于ES根目录/plugins/ik
③ 重启ES服务器
④ 测试分词器
POST _analyze
{
"analyzer":"ik_smart",
"text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
 
1. Mapper映射
   查询映射类型
         GET shop/goods/_mapping  
    修改映射类型
(1)Delete shop;
(2)PUT shop;
(3)POST shop/goods/_mapping
{
"goods": {
"properties": {
"id": {
"type": "integer"
            },
"name": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
            }
        }
    }
}
(4)加入数据
。。。。。。
1. Java API
2. 导包
    <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
 
1. 连接ES获取client对象
    #链接ES服务器 两个端口PC Java程序通过9300链接ES, 9200是WEB链接端口
public static TransportClient getClient() throws Exception {
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));        return client;
    }
1. DSL查询
@Test
public void getsearch() throws Exception {
     // 获取客户端的es对象
     TransportClient client = getClient();
     BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
     // 匹配 class =1
     List<QueryBuilder> must = boolQueryBuilder.must();
     must.add(QueryBuilders.termQuery("class","1"));
     //  搜索 1班的人  过滤 age 20-25  分页 0, 3   sort id desc
    // 过滤
     List<QueryBuilder> filter = boolQueryBuilder.filter();
     filter.add(QueryBuilders.rangeQuery("age").gte(20).lte(25));
     // 设置分页 排序 order by id desc
     SearchResponse searchResponse = client.prepareSearch("crm")
            .setFrom(0).setSize(3)
            .setQuery(boolQueryBuilder)
            .addSort("id", SortOrder.DESC).get();

     System.out.println("总条数:"+searchResponse.getHits().getTotalHits());
     SearchHit[] hits = searchResponse.getHits().getHits();
     // 循环数据结构
     for (SearchHit hit : hits) {
        System.out.println(hit.getSource());
     }
     // 关闭资源
     client.close();
}