每次在写1617年的时候都会想20年我在干嘛,80年的我应该老得不像样了,人真是生来就是孤独的,我在胡说八道些什么。本周被老师进度逼得崩溃,每天从早八点半到晚九点半寸步不离实验室,一直盯着满屏的巴哥视力看起来应该涨了一百度,总算有了点进展,然而依旧不想继续完善功能实现,因为知道前方道路必然有无数个坑等着自己,我只不过填好了第一个坑。然后如下。
ES中所有的Java API调用都要使用Client对象,ES为API调用者提供了两类Client对象:NodeClient和TransportClient。
NodeClient是一种嵌入式节点客户端。它首先在客户端启动一个节点(Node),并加入同名集群内。这个节点可以保存数据,并且数据能够被索引。然后从这个节点中获取Client,这类Client就是NodeClient。NodeClient无需指明ES服务端的地址,操作的数据位于启动的节点所在的集群中。下面是获得NodeClient的代码:
import org.elasticsearch.client.Client; import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.node.Node; import static org.elasticsearch.node.NodeBuilder.nodeBuilder; public class NodeClient { public static void main(String[] args) { // 启动一个本地节点,并加入子网内的ES集群 Node node = nodeBuilder() .clusterName("elasticsearch") // 要加入的集群名为elasticsearch // .client(true) //如果设置为true,则该节点不会保存数据 .data(true) // 本嵌入式节点可以保存数据 .node(); // 构建并启动本节点 // 获得一个Client对象,该对象可以对子网内的“elasticsearch”集群进行相关操作。 Client nodeClient = node.client(); } }NodeClient适合用作单元或集成测试,而不适合用于生产环境。一般都使用TransportClient,ransportClient适合用于生产环境中。
TransportClient连接远端的ES集群,其本身并不会加入集群。创建TransportClient的代码如下:
import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.transport.TransportAddress; import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder; public class TransportClient { public static void main(String[] args) { // 配置信息 Settings esSetting = settingsBuilder() .put("cluster.name", "elasticsearch") .build(); TransportClient transportClient = new TransportClient(esSetting); // 添加连接地址 TransportAddress address = new InetSocketTransportAddress("192.168.1.110", 9300); transportClient.addTransportAddress(address); } } 创建Index和Mapping ES支持插入数据自动创建Index和Mapping,我就没有注重如何创建。 查询与过滤查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异。一条过滤语句会询问每个文档的字段值是否包含着特定值,查询语句会询问每个文档的字段值与特定值的匹配程度如何。一条查询语句会计算每个文档与查询语句的相关性,会给出一个相关性评分 _score,并且按照相关性对匹配到的文档进行排序。 这种评分方式非常适用于一个没有完全配置结果的全文本搜索。
使用过滤语句得到的结果集 -- 一个简单的文档列表,快速匹配运算并存入内存是十分方便的, 每个文档仅需要1个字节。这些缓存的过滤结果集与后续请求的结合使用是非常高效的。
查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存。 原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句。
elasticsearch的查询是通过执行json格式的查询条件,在Java api中就是构造QueryBuilder对象,elasticsearch完全支持queryDSL风格的查询方式,QueryBuilder的构建类是QueryBuilders,filter的构建类是FilterBuilders。
import static org.elasticsearch.index.query.FilterBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*; QueryBuilder qb1 = termQuery("name", "kimchy"); QueryBuilder qb2 = boolQuery() .must(termQuery("content", "test1")) .must(termQuery("content", "test4")) .mustNot(termQuery("content", "test2")) .should(termQuery("content", "test3")); QueryBuilder qb3 = filteredQuery( termQuery("name.first", "shay"), rangeFilter("age") .from(23) .to(54) .includeLower(true) .includeUpper(false) );
其中qb1构造了一个TermQuery,对name这个字段进行项搜索,项是最小的索引片段,这个查询对应lucene本身的TermQuery。 qb2构造了一个组合查询(BoolQuery),其对应lucene本身的BooleanQuery,可以通过must、should、mustNot方法对QueryBuilder进行组合,形成多条件查询。 qb3构造了一个过滤查询,就是在TermQuery的基础上添加一个过滤条件RangeFilter,这个范围过滤器将限制查询age字段大于等于23,小于等于54的结果。构造好了Query就要传到elasticsearch里面进行查询:
SearchResponse response = client.prepareSearch("test") .setQuery(query) .setFrom(0).setSize(60).setExplain(true) .execute() .actionGet();获得SearchResponse中的SearchHits:
SearchHits hits = response.getHits(); if (hits.totalHits() > 0) { for (SearchHit hit : hits) { System.out.println("score:"+hit.getScore()+":\t"+hit.getSource());// .get("title") } } else { System.out.println("搜到0条结果"); }ElatsicSearch入门推荐:Elasticsearch 权威指南(中文版)
java API资料:ElatsicSearch中文指南-java-api,Java API官方文档
控制反转(IOC)依赖注入(DI):把创建对象(bean)和维护对象(bean)的关系的权利从程序中转移到spring容器中,而程序本身不再维护。 Spring开发接口编程,配合DI技术实现层与层之间的解耦。(▲先留在这,需要以后详细学习)
势必要单独写篇布佬哥:
引起error:src refspec master does not match any错误的原因是,目录中没有文件,空目录是不能提交上去的,解决办法:
touch README
git add README
git commit -m 'first commit'
git push origin master
这样你就完成了向远程仓库的推送。
github上传项目流程:
在github上创建项目
使用git clone xxxxxxx克隆到本地
编辑项目
git add . (将改动添加到暂存区)
git commit -m "提交说明"
git push origin master 将本地更改推送到远程master分支。
如果在github的remote上已经有了文件,会出现错误。此时应当先pull一下,即:
git pull origin master
然后再进行:git push origin master
(git push origin es-tx:rs-tx 将本地es-tx分支推送到远程es-tx分支
◆ Spring Data ElasticSreach复合查询以及聚合查询实现(阿门)
◆ 统计分析日志图表的实现方法优化