ElasticSearch

ElasticSearch
  • ES的基本认识
    简称ES,它是基于全文搜索lucene上,解决了原生lucene使用的不足,优化lucene的调用方式,并实现了高可用的搜索方案
  • ES的核心特点:
    分布式的实时文件存储,每个字段都被索引并可被搜索

分布式的实时分析搜索引擎

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

高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之交互。

上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它拥有开瓶即饮的效果(安装即可使用),只需很少的学习既可在生产环境中使用。

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

  • ES的使用者及类似框架
    典型使用案例
    ①Github(美国)使用Elasticsearch搜索20TB的数据,包括13亿的文件和1300亿行的代码.
    ②Foursquare实时搜索5千万地点信息?Foursquare每天都用Elasticsearch做这样的事.
    ③德国SoundCloud使用Elasticsearch来为1.8亿用户提供即时精准的音乐搜索服务.
    ④Mozilla公司以火狐著名,它目前使用 WarOnOrange 这个项目来进行单元或功能测试,测试的结果以 json的方式索引到elasticsearch中,开发人员可以非常方便的查找 bug.
    ⑤Sony公司使用elasticsearch 作为信息搜索引擎.
    类似框架
  • Solr(重量级对手)
    Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持。
  • Solr和ES的比较:
    Solr利用zookeeper进行分布式管理,支持更多格式的数据(HTML/PDF/CSV),官方提供的功能更多在传统的搜索应用中表现好于ES,但实时搜索效率低.
    ES自身带有分布式协调管理功能,但仅支持json文件格式,本身更注重于核心功能,高级功能多有第三方插件提供,在处理实时搜索应用时效率明显高于solr.
    Es的安装和使用
    网站https://www.elastic.co/downloads/elasticsearch
  1. 安装解压即可
  2. 运行bin/elasticsearch.bat
  3. 验证
  4. localhost:9200/
    使用辅助管理工具kibana
    1.下载https://www.elastic.co/downloads/kibana
  5. 安装解压即可
    3.启动kibana5:bin\kibana.bat
    4.访问网站: http://localhost:5601
基本使用

添加put post

	PUT wxwx/xx/1
	{
	  "name":"小明",
	  "age":"12",
	  "sex":"男"
	}

	POST wxwx/xx/2
	{
	  "name":"小花",
	  "age":"23",
	  "sex":"女"
	}

GET wxwx/xx/_search

#局部修改

POST wxwx/xx/2/_update
{
  "doc": {
    "name":"小猪",
    "age":"33",
    "sex":"男"
  }
}

#删除

DELETE wxwx/xx

#批量操作

POST _bulk
{ "delete": { "_index": "wxwx", "_type": "xx", "_id": "123" }}
{ "create": { "_index": "wxwx", "_type": "xx", "_id": "123" }}
{ "title": "小明","age":"2"}
{ "index": { "_index": "wxwx", "_type": "xx" }}

DELETE wxwx

GET wxwx/xx/_search

#批量获取

GET _mget
{
  "docs":[
  {
    "_index":"wxwx",
    "_type":"xx",
    "_id":"123"
  },
  {
    "_index":"wxwx",
    "_type":"xx",
    "_id":"AWpYzaQExdsnzkc-lJO2"
  }
  ]
}

#分页查询 size每页条数 from从第几条开始

GET _search?size=5&from=5

#高级查询 q

GET  wxwx/xx/_search?q=age:3

#DSL模式

GET wxwx/xx/_search
{
  "query": {
    "match": {
      "title": "猫"
    }
  },
  "from": 1,
  "size": 4
}

#组合条件搜索与过滤

GET wxwx/xx/_search
{
  "query": {
    "match": {
      "title": "猫"
    }   
  },
  "from": 1,
  "size": 6,
  "sort": [{
        "age.keyword": "asc"
  }]
}

GET wxwx/xx/_search
{
  "query": {
    "match": {
      "title": "猫"
    }, 
    "range": {
      "age": {
        "gte": 1,
        "lte": 7
      }
    }
  },
  "_source": ["title","age"],
  "sort": [{"age.keyword": "desc"}]
}

分词器"ik_smart",ik_max_word

#ik_smart粗粒度分词

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "啊,今天真好玩个球,Holle world"
}

#ik_max_word细粒度分词
POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "有时候需要去改变它的默认映射(相当于改变改变表结构,但是有数据 不一定能够改变表结构s)"
}
Java操作:
public static Client getClient() throws UnknownHostException {
    //设置自动添加集群
    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new InetSocketTransportAddress
                    (InetAddress.getByName("localhost"), 9300)
            );
    return client;
}

//添加

@Test
public void EsAddDemo1() throws Exception {
    //获取client对象
    Client client = getClient();
    IndexRequestBuilder indexRequestBuilder = client.prepareIndex("wxwx", "xx", "10");
    //准备一个map
    Map map = new HashMap();
    //map中添加值
    map.put("name", "小明");
    map.put("age", "18");
    map.put("sex", "男");
    //
    IndexResponse indexResponse = indexRequestBuilder.setSource(map).get();
    //获取添加的数据
    System.out.println("添加的" + indexResponse);
}

//更新

@Test
public void EsUpdateDemo() throws Exception {

Client client = getClient();

//准备一个map
Map map = new HashMap();
//map添加
map.put("name", "小明");
map.put("age", "20");
map.put("sex", "女");

//修改操作updateResponse
UpdateResponse updateResponse = client.prepareUpdate("wxwx", "xx", "10").setDoc(map).get();
System.out.println(updateResponse);
}

//删除del

@Test
public void EsDelDemo2() throws Exception {
    Client client = getClient();
    //删除
    DeleteResponse deleteResponse = client.prepareDelete("wxwx", "xx", "123").get();
    System.out.println(deleteResponse);
}

//批量操作

@Test
public void EsPlDemo() throws Exception {
    Client client = getClient();
    //获取批量操作对象
    BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();

    Map map = new HashMap();

    for (int i = 0; i <= 10; i++) {
        map.put("name", "小猫" + i);
        map.put("age", i);
        map.put("size", "1");
        //添加
        BulkRequestBuilder requestBuilder = bulkRequestBuilder.add(client.prepareIndex("wxwx", "xx", i + "").setSource(map));
    }
    //获取添加的对象
    BulkResponse bulkItemResponses = bulkRequestBuilder.get();
    System.out.println("成功" + bulkItemResponses);
    //判断如果添加失败报错误
    if (bulkItemResponses.hasFailures()) {
        System.out.println("添加失败");
    }
}
  • 搜索

     @Test
     public void EsQuery() throws Exception {
         Client client = getClient();
         //获取查询对象
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
         //获取List
         List<QueryBuilder> must = boolQueryBuilder.must();
         //添加查询条件
         must.add(QueryBuilders.termQuery("size", "1"));
         //拿到过滤的List
         List<QueryBuilder> filter = boolQueryBuilder.filter();
         //区间 大于小于 age gte大于等于 lte小于等于
         filter.add(QueryBuilders.rangeQuery("age").gte("1").lte("9"));
         //
         SearchResponse searchResponse = client.prepareSearch("wxwx")
                 //分页
                 .setFrom(1).setSize(3)
                 //查询条件
                 .setQuery(boolQueryBuilder)
                 //排序
                 .addSort("age", SortOrder.DESC).get();
         SearchHit[] hits = searchResponse.getHits().getHits();
         for (SearchHit hit : hits) {
             //
             System.out.println(hit.getSource());
         }
     }
    

    ···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值