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
- 安装解压即可
- 运行bin/elasticsearch.bat
- 验证
- localhost:9200/
使用辅助管理工具kibana
1.下载https://www.elastic.co/downloads/kibana - 安装解压即可
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()); } }
···