ES底层使用的是开源的lucene,它是Lucene的封装,提供了 REST API 的操作接口,开箱即用。
ES本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个ES实例。有master和node两种节点。
Index:ES数据管理的顶层单位就叫 Index(类似于数据库)
Document:Index 里的单条记录成为 Document
Type:Document 可以分组,(类似又不同于数据库的表,type应有相似的schema)
1、field datatype
字符串:
keyword:适用于索引结构化的字段,如字段需要进行过滤、排序、聚合。keyword类型的字段只能通过精确值搜索。
text:当一个字段是要被全文搜索的,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。
数字:
byte、short、int、long
特殊类型:
ip:ES底层会将ip转成long类型进行存储。
date:ES中的日期格式。在内部,日期被转换为UTC(如果指定了时区)并存储为时间戳。
Object等
2、入库
Settings settings = Settings.builder().put("cluster.name", "test-es")
.put("client.transport.sniff", true)
.build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.21.204"), 9303))
BulkRequestBuilder bulkRequest = client.prepareBulk();
循环
bulkRequest.add.add(client.prepareIndex(index, type).setSource(XContentFactory.jsonBuilder()
.startObject()
.field(“field_name", "field_value")
。。。
.endObject()
bulkRequest.execute();
这里使用了keyword进行精确匹配,过滤条件有:
- 省ID
- 用户向WAP网关的请求时间
- 用户公网IP
- 用户公网Port
- 目的IP
- 目的Port
- 用户手机号
- 目的域名
- nat时间
查询
通过ES scroll search(滚屏查询),滚动查询大量数据,批量大小5000