分布式全文检索ES

  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数据管理
  1. 是什么

 

  1. 增删改

GET    获取资源   

POST   新建资源    

PUT    更新    

DELETE 删除资源

Bulk   批量操作

  1. 简单的查询
  1. 批量获取

      方式一: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查询与过滤
  1. 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. 分词与映射
  1. 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
  1. 导包

    <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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值