当前位置: 澳门新濠3559 > 数据库 > 正文

参考链接,我去搜了几篇Elasticsearch教程澳门新濠

时间:2019-10-06 19:53来源:数据库
JDBC连接SQL Server 参考链接: 如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以 关注微信公众号:Java3y Java三年工作经验面试准备

JDBC连接SQL Server

参考链接:


如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

Java三年工作经验面试准备(一),java工作经验

前言

很多东西其实也是自己网上百度的,下面贴的链接就是自己参考的文章,感谢链接作者

Java关键字

Java关键字个人感觉占的比重不是很多,这里挑选了几个不常用的关键字

1.transient
如果一个类必须要实现Serilizable接口进行序列化,但是又有某些字段比较敏感(银行账号、密码)不能被序列化,就可以用transient来修饰这个字段。
网上案例:

2.volatile
再此之前要知道,多线程的时候为了效率,每个线程都会维护一个自己的内存副本。
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,
即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。
可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。
网上案例:

Java集合框架

谈到Java集合框架,就会联想到Collectoin,你就会答出ArrayListHashMapHashSet,就会聊到他们的区别。要是更加深入的话,HashMap的原理、for-each原理以及CopyOnWriteArrayList、ArrayBlockingQueue 而聊到这两个类,继而就会聊到java.util.concurrent包下面的问题

1.Collectoin集合框架

2.ArrayListHashMapHashSet区别

3.HashMap原理

参考下面两个链接,只要看懂应该就没什么问题了,简单讲一下自己看过之后的理解。HashMap在1.7之前就是列表 链表,1.8之后改为了列表 红黑树[链表效率更高O(n)与O(logn)的对比]。每次getput的时候都会将key转换为下标,直接命中数据O(1)

参考链接:

参考链接:

4.for-each原理

 

5.CopyOnWriteArrayList应用场景

6.ArrayBlockingQueue使用及原理

澳门新濠3559 1

 

前言 很多东西其实也是自己网上百度的,下面贴的链接就是自己参考的文章,感谢链接作者...

能够出现下面这种情况,说明安装成功

大功告成---测试

在开源项目weixin_guide 中添加路由 com.javen.common.APPConfig 类的 configRoute(Routes me) 的方法中添加 me.add("/wxuser", UserController.class,"/front");

在浏览器中输入http://localhost:8080/wxuser 即可下载Excel

public void index(){
    List<UserInfo> allUserInfo = getAllUserInfo(getAllOpenId());

    if (!allUserInfo.isEmpty()) {
      ///下载userInfos
      File file = saveToExcel(allUserInfo);
      renderFile(file);
    }else {
      render("目前暂无用户...");
    }
  }

以上如何一键导出微信所有用户信息到Excel的全过程。
欢迎留言、转发、打赏项目源码参考地址 点我点我--欢迎Start

SQLServer 安装

参考链接:

最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene为基础的。

获取所有用户列表

/**
   * 获取所有的openid
   * @return
   */
  public List<String> getAllOpenId(){
    List<String> openIds = getOpenIds(null);
    return openIds;
  }

getOpenIds(Stirng next_openid) 方法中迭代(一次拉取调用最多拉取10000个关注者的OpenID)获取所有的openId并返回一个List集合

private List<String> getOpenIds(String next_openid){
    List<String> openIdList=new ArrayList<String>();
    ApiResult apiResult=UserApi.getFollowers(next_openid);
    String json=apiResult.getJson();
log.error("json:" json);
    if (apiResult.isSucceed()) {
      JSONObject result = JSON.parseObject(json);
      next_openid = apiResult.getStr("next_openid");
      int count = apiResult.getInt("count");
      JSONObject openIdObject = result.getJSONObject("data");
      if (count>0) {
        JSONArray openids=openIdObject.getJSONArray("openid");
        for (int i = 0; i < openids.size(); i  ) {
          openIdList.add(openids.getString(i));
        }
      }
      //下一页
      if (next_openid!=null&& !next_openid.equals("")) {
        List<String> list = getOpenIds(next_openid);
        openIdList.addAll(list);
      }
    }
    return openIdList;
  }

需要这样执行elasticsearch,如果使用的是root用户的话

将详细的用户信息(List)保存到Excel

/**
   * 将详细的用户信息保存到Excel
   * @param userInfos
   * @return
   */
  private File saveToExcel(List<UserInfo> userInfos){
    File file=null;
    try {
      WritableWorkbook wwb = null;

      // 创建可写入的Excel工作簿
      String fileName = "用户详细信息.xls";
      file=new File(fileName);
      //以fileName为文件名来创建一个Workbook
      wwb = Workbook.createWorkbook(file);

      // 创建工作表
      WritableSheet ws = wwb.createSheet("用户详细信息", 0);
      ws.setColumnView(0,8);
      ws.setColumnView(1,15);
      ws.setColumnView(2,50);
      ws.setColumnView(3,8);
      ws.setColumnView(4,10);
      ws.setColumnView(5,10);
      ws.setColumnView(6,10);
      ws.setColumnView(7,20);
      ws.setColumnView(8,50);
      ws.setColumnView(9,10);
      ws.setColumnView(10,30);
      ws.setColumnView(11,20);
      ws.setColumnView(12,20);

      ws.mergeCells(0,0,12,0);//合并第一列第一行到第七列第一行的所有单元格 
      WritableFont font1= new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 
      WritableCellFormat format1=new WritableCellFormat(font1); 
      format1.setAlignment(jxl.format.Alignment.CENTRE);
      Label top= new Label(0, 0, "所有用户详细信息",format1);
      ws.addCell(top);

      //要插入到的Excel表格的行号,默认从0开始
      Label labelId= new Label(0, 1, "编号");
      Label labelnickname= new Label(1, 1, "用户的昵称");
      Label labelopenid= new Label(2, 1, "用户的标识");
      Label labelsex= new Label(3, 1, "性别");
      Label labelcountry= new Label(4,1, "所在国家");
      Label labelprovince= new Label(5,1, "所在省份");
      Label labelcity= new Label(6, 1, "所在城市");
      Label labellanguage= new Label(7,1, "用户的语言");
      Label labelheadimgurl= new Label(8,1, "用户头像");
      Label labelsubscribe= new Label(9, 1, "是否订阅");
      Label labelsubscribetime= new Label(10, 1, "关注时间");
      Label labelgroupid= new Label(11, 1, "所在的分组ID");
      Label labelremark= new Label(12, 1, "备注");
      ws.addCell(labelId);
      ws.addCell(labelnickname);
      ws.addCell(labelopenid);
      ws.addCell(labelsex);
      ws.addCell(labelcountry);
      ws.addCell(labelprovince);
      ws.addCell(labelcity);
      ws.addCell(labellanguage);
      ws.addCell(labelheadimgurl);
      ws.addCell(labelsubscribe);
      ws.addCell(labelsubscribetime);
      ws.addCell(labelgroupid);
      ws.addCell(labelremark);
      for (int i = 0; i < userInfos.size(); i  ) {

          Label labelId_i= new Label(0, i 2, i 1 "");
          Label nickName= new Label(1, i 2, userInfos.get(i).getNickname());
          Label openid= new Label(2, i 2, userInfos.get(i).getOpenid());

        String sexStr=userInfos.get(i).getSex();
        //用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
        if (StrKit.notBlank(sexStr)) {
          int sexInt=Integer.parseInt(sexStr);
          if (sexInt==1) {
            sexStr="男";
          }else if (sexInt==2) {
            sexStr="女";
          }
        }else {
          sexStr="未知";
        }

          Label sex= new Label(3, i 2, sexStr);
          Label country= new Label(4, i 2, userInfos.get(i).getCountry());
          Label province= new Label(5, i 2, userInfos.get(i).getProvince());
          Label city= new Label(6, i 2, userInfos.get(i).getCity());
          Label language= new Label(7, i 2, userInfos.get(i).getLanguage());
          Label headimgaeurl= new Label(8, i 2, userInfos.get(i).getHeadimgurl());

          Label subscribe= new Label(9, i 2, userInfos.get(i).getSubscribe().equals("1")?"已关注":"未关注");
        //获取关注时间
        String subscribe_time = userInfos.get(i).getSubscribe_time();

        if (StrKit.notBlank(subscribe_time)) {
          subscribe_time=sfg.format(new Date(Long.parseLong(subscribe_time) * 1000L));
        }
          Label subscribetime= new Label(10, i 2, subscribe_time);
          Label groupid= new Label(11, i 2, userInfos.get(i).getGroupid());
          Label remark= new Label(12, i 2, userInfos.get(i).getRemark());
          ws.addCell(labelId_i);
          ws.addCell(openid);
          ws.addCell(nickName);
          ws.addCell(sex);
          ws.addCell(country);
          ws.addCell(province);
          ws.addCell(city);
          ws.addCell(language);
          ws.addCell(headimgaeurl);
          ws.addCell(subscribe);
          ws.addCell(subscribetime);
          ws.addCell(groupid);
          ws.addCell(remark);
      }

      //写进文档
      wwb.write();
      // 关闭Excel工作簿对象
      wwb.close();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return file;
  }
esusers useradd kibanaserver -r kibana4_server

批量获取用户基本信息

注意批量接口最多支持一次拉取100条

/**
   * 根据openId列表获取用户信息
   * @param allOpenId  
   * @return
   */
  private List<UserInfo> getAllUserInfo(List<String> allOpenId){
    List<UserInfo> userInfos = new ArrayList<UserInfo>();
    int total=allOpenId.size();
    UserConfig[] user_list=null;
    //开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
    int temp=100;//一次获取100
    if (total>temp) {
      int page=0;//当前页面
      int count=total/100 (total0>0?1:0);//总共获取多少次
      int index=0;
      while (page<count) {
        index=(temp*(page 1))>total?total:(temp*(page 1));
        System.out.println("/////////" page*temp " " index);
        user_list=new UserConfig[index-(page*temp)];
        for (int i = page*temp; i <index; i  ) {
          UserConfig config=new UserConfig();
          config.setLang(LangType.zh_CN);
          config.setOpenid(allOpenId.get(i));
          user_list[i-(page*temp)]=config;
        }
        GetUserInfo getUserInfo = new GetUserInfo();
        getUserInfo.setUser_list(user_list);
        String jsonGetUserInfo = JsonKit.toJson(getUserInfo);
        System.out.println("jsonGetUserInfo:" jsonGetUserInfo);

        ApiResult apiResult = UserApi.batchGetUserInfo(jsonGetUserInfo);

        String jsonResult = apiResult.getJson();
        //将json转化为对象
        List<UserInfo> userInfo = parseJsonToUserInfo(jsonResult);
        userInfos.addAll(userInfo);
        page  ;
      }
    }else {
      user_list=new UserConfig[total];
      for (int i = 0; i < user_list.length; i  ) {
        System.out.println(allOpenId.get(i));
        UserConfig config=new UserConfig();
        config.setLang(LangType.zh_CN);
        config.setOpenid(allOpenId.get(i));
        user_list[i]=config;
      }
      GetUserInfo getUserInfo = new GetUserInfo();
      getUserInfo.setUser_list(user_list);
      String jsonGetUserInfo = JsonKit.toJson(getUserInfo);


      ApiResult batchGetUserInfo = UserApi.batchGetUserInfo(jsonGetUserInfo);
      List<UserInfo> userInfo = parseJsonToUserInfo(batchGetUserInfo.getJson());
      userInfos.addAll(userInfo);
    }
    return userInfos;
  }

微信开发交流群:148540125
系列文章参考地址 极速开发微信公众号欢迎留言、转发、打赏
项目源码参考地址 点我点我--欢迎Start

Logstash下载的版本是:2.3.3与Elasticsearch对应起来。

极速开发微信公众号系列文章之如何一键导出微信所有用户信息到Excel

前方高能警告⚠️:用户信息导出我们需要使用以下权限以及接口

  • 权限:必须微信认证(测试号也是可以的)
  • 接口:1、获取用户列表 2、获取用户基本信息

以上链接点击可以查看相关文档

本文中用户导入到excel使用的是jxl,当然大家可以使用poi。如果不会使用jxl可以参考我之前写的 Java实现Excel导入数据库,数据库中的数据导入到Excel

好了,准备工作做好了那就开干吧!!!!

实现的目标:访问一个地址可以下载一个保存最新所有用户详细信息的Excel,最终效果图如下

澳门新濠3559 2

plugin install licenseplugin install shield

前面下载了中文分词器,后边在看教程的时候也发现了拼音分词器,拼音分词器的安装和中文分词器安装的时候很类似

解压的时候是在zip解压到当前文件上,把conf的数据拿过去是将其源文件拿过去

添加管理员

要以windows服务的方式运行,教程给出的链接已经挂了。我搜到了一篇

 ./elasticsearch -d -Des.insecure.allow.root=true

重启,接着执行:

PS:2018年3月22日18:58:12更新:这里我已经不建议在Windows下装Elasticsearch了,因为装起来还是麻烦,也有一堆的小问题(后面也有在Linux下配置Elasticsearch的过程,建议用linux环境下学习Elasticsearch(要是学生建议去买个服务器,有优惠的),实在不想出钱,用虚拟机也行

现在使用下面的语句,是可以获取得到信息的

澳门新濠3559 3image

这是我搭建一个项目时候的笔记,

首先是对Elasticsearch的安装,上面那篇教程也有说,并且给出了一键安装的脚本。这里就用来记录我个人的安装历程吧。

给出的连接是stackOverFlow下的提问,还有youtobe的视频。stackOverFlow并不能解决我安装过程的问题,youtobe我没联外网,也进不去。

安装head插件就很简单了,切换到对应的目录下,使用如下命令:

后来,我又找到了一篇教程,也十分顺利:

plugin install mobz/elasticsearch-head

安装Elasticsearch以window服务的方式来运行,它的给出的版本是2.3.3。于是我也去安装2.3.3了

3.2.2下载权限shield

我在windows下开发是有下载shiled,为了保持一致,我也下载吧。

输入命令:

plugin install licenseplugin install shield

下载完就配置一个管理员用户

bin/shield/esusers useradd adminName -r admin

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

在前面一章中已经下载了Elasticsearch和它常用的各种插件了。了解相关的概念后,我们就应该动手弄一弄Elasticsearch是怎么用的。

参考链接:

我是跟着这个教程大致把REST API走了一下,也渐渐了解了Elasticsearch的知识点了。

我们毕竟是使用Java的,因此得知道Elasticsearch和Java是怎么连接的。我找了几篇教程:

后来找到了一篇比较系统的教程,推荐这个:

自己也跟着教程写了Demo,其中也出了不少错误。贴上代码:

import com.carrotsearch.hppc.cursors.ObjectObjectCursor;import org.elasticsearch.action.admin.indices.close.CloseIndexResponse;import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;import org.elasticsearch.action.admin.indices.open.OpenIndexResponse;import org.elasticsearch.action.bulk.BulkRequestBuilder;import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.deletebyquery.DeleteByQueryAction;import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.get.MultiGetItemResponse;import org.elasticsearch.action.get.MultiGetResponse;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.cluster.metadata.MappingMetaData;import org.elasticsearch.common.collect.ImmutableOpenMap;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.script.Script;import org.elasticsearch.script.ScriptService;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.SearchHits;import org.elasticsearch.shield.ShieldPlugin;import org.junit.Test;import java.io.*;import java.net.InetAddress;import java.net.UnknownHostException;import java.util.List;import java.util.concurrent.ExecutionException;import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;import static org.elasticsearch.index.query.QueryBuilders.termQuery;import org.elasticsearch.client.transport.TransportClient;/** * Created by ozc on 2017/11/5. */public class ElasticsearchDemo { /** * 创建 * @throws UnknownHostException */ @Test public void CreateIndex() throws UnknownHostException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //将数据转成json字符串,用集合装载起来 List<String> jsonData = DataFactory.getInitJsonData(); //创建blog索引、article类型、数据是上边的json字符串 for (int i = 0; i < jsonData.size { IndexResponse response = client.prepareIndex("blog", "article","1").setSource(jsonData.get; if (response.isCreated { System.out.println; } } client.close(); } /** * 查询 * @throws UnknownHostException */ @Test public void selectIndex() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //查询title字段中包含hibernate关键字的文档 QueryBuilder qb1 = termQuery("title", "hibernate"); //查询title字段或content字段中包含git关键字的文档: QueryBuilder qb2= QueryBuilders.multiMatchQuery("git", "title","content"); SearchResponse response = client.prepareSearch.setTypes("article").setQuery.execute() .actionGet(); SearchHits hits = response.getHits(); if (hits.totalHits { for (SearchHit hit : hits) { System.out.println("score:" hit.getScore() ":t" hit.getSource;// .get } } else { System.out.println; } } /** * 使用updateRequest更新 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void update1() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); UpdateRequest uRequest = new UpdateRequest(); uRequest.index; uRequest.type("article"); uRequest.id; uRequest.doc(jsonBuilder().startObject().field("content", "学习目标 掌握java泛型的产生意义ssss").endObject; client.update.get(); } /** * 使用脚本更新,需要更改配置文件 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void update2() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); client.prepareUpdate("blog", "article", "1") .setScript(new Script("ctx._source.title = "git入门"", ScriptService.ScriptType.INLINE, null, null)) .get(); } /** * 使用doc更新 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void update3() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); client.prepareUpdate("blog", "article", "1") .setDoc(jsonBuilder().startObject().field("content", "SVN与Git对比222222。。。").endObject; } /** * 使用updateRequest更新、能够新增新字段 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void update4() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); UpdateRequest updateRequest = new UpdateRequest("blog", "article", "1") .doc(jsonBuilder().startObject().field("commet", "0").endObject; client.update(updateRequest).get(); } /** * 使用UpdateRequest更新, 如果文档不存在则创建新的索引 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void update5() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); IndexRequest indexRequest = new IndexRequest("blog", "article", "10").source(jsonBuilder().startObject() .field("title", "Git安装10").field("content", "学习目标 git。。。10").endObject; UpdateRequest uRequest2 = new UpdateRequest("blog", "article", "10").doc( jsonBuilder().startObject().field("title", "Git安装").field("content", "学习目标 git。。。").endObject .upsert(indexRequest); client.update(uRequest2).get(); } /** * 删除具体的索引值 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void deleteSpecificIndex() throws IOException, ExecutionException, InterruptedException { //连接客户端 Client client = TransportClient.builder .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); DeleteResponse dResponse = client.prepareDelete("blog", "article", "10").execute() .actionGet(); if (dResponse.isFound { System.out.println; } else { System.out.println; } } /** * 根据index名称 删除整个索引库 * @throws IOException * @throws ExecutionException * @throws InterruptedException */ @Test public void deleteIndex() throws IOException, ExecutionException, InterruptedException { //要删除索引库的名字 String indexName = "zhognfucheng"; if (!isIndexExists(indexName)) { System.out.println(indexName   " not exists"); } else { Client client = TransportClient.builder.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(indexName) .execute().actionGet(); if (dResponse.isAcknowledged { System.out.println("delete index " indexName " successfully!"); }else{ System.out.println("Fail to delete index " indexName); } } } // 创建索引库 @Test public void createIndex() { //要创建索引库的名称 String indexName = "shcool"; try { Client client = TransportClient.builder.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // 创建索引库 if (isIndexExists(indexName)) { System.out.println("Index "   indexName   " already exits!"); } else { CreateIndexRequest cIndexRequest = new CreateIndexRequest(indexName); CreateIndexResponse cIndexResponse = client.admin().indices().create(cIndexRequest) .actionGet(); if (cIndexResponse.isAcknowledged { System.out.println("create index successfully!"); } else { System.out.println("Fail to create index!"); } } } catch (UnknownHostException e) { e.printStackTrace(); } } /** * 批量从Elasticsearch导出json到文件中 */ @Test public void ElasticSearchBulkOut() { try { //初始化 Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch").build();// cluster.name在elasticsearch.yml //连接客户端 Client client = TransportClient.builder().settings.build() .addTransportAddress(new InetSocketTransportAddress( InetAddress.getByName("127.0.0.1"), 9300)); //匹配所有查询 QueryBuilder qb = QueryBuilders.matchAllQuery(); SearchResponse response = client.prepareSearch .setTypes("article").setQuery .execute().actionGet(); //获取命中记录 SearchHits resultHits = response.getHits(); //遍历命中记录,写到文件中 File article = new File("C:\ElasticsearchDemo\src\java\file\bulk.txt"); FileWriter fw = new FileWriter; BufferedWriter bfw = new BufferedWriter; if (resultHits.getHits().length == 0) { System.out.println("查到0条数据!"); } else { for (int i = 0; i < resultHits.getHits().length; i  ) { String jsonStr = resultHits.getHits()[i] .getSourceAsString(); System.out.println; bfw.write; bfw.write; } } bfw.close(); fw.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 批量导入到Elasticsearch中 */ @Test public void ElasticSearchBulkInput() { try { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch").build();// cluster.name在elasticsearch.yml中配置 Client client = TransportClient.builder().settings.build() .addTransportAddress(new InetSocketTransportAddress( InetAddress.getByName("127.0.0.1"), 9300)); File article = new File("C:\ElasticsearchDemo\src\java\file\bulk.txt"); FileReader fr=new FileReader; BufferedReader bfr=new BufferedReader; String line = null; BulkRequestBuilder bulkRequest=client.prepareBulk(); int count=0; while((line=bfr.readLine{ bulkRequest.add(client.prepareIndex("test","article").setSource; if (count==0) { bulkRequest.execute().actionGet(); } count  ; //System.out.println; } bulkRequest.execute().actionGet(); bfr.close(); fr.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 根据名称判断索引是否存在 * @param indexName * @return */ public boolean isIndexExists(String indexName) { boolean flag = false; try { Client client = TransportClient.builder.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); IndicesExistsRequest inExistsRequest = new IndicesExistsRequest(indexName); //下面可判断多个索引名称是否存在 //IndicesExistsResponse indexResponse = client.admin().indices().prepareExists("blog","blog1").execute().actionGet(); IndicesExistsResponse inExistsResponse = client.admin().indices() .exists(inExistsRequest).actionGet(); if (inExistsResponse.isExists { flag = true; } else { flag = false; } } catch (UnknownHostException e) { e.printStackTrace(); } return flag; } /** * 删除type下的所有文档 * 也就是类似关系型数据库中根据表删除所有记录 * * ps(需要下载插件plugin install delete-by-query)和导入pom包 * * ps(使用的是windows服务的方式运行Elastic,因此需要在bin目录下的使用service重启,不然就会报空指针异常! */ @Test public void deleteByQuery() throws UnknownHostException { Client client = TransportClient.builder.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); String deletebyquery = "{"query": {"match_all": {}}}"; DeleteByQueryRequestBuilder response = new DeleteByQueryRequestBuilder(client,DeleteByQueryAction.INSTANCE); response.setIndices.setTypes("article").setSource(deletebyquery) .execute() .actionGet(); } //------------------------------------------------------------------- /** * Java三层嵌套查询,我感觉是用得很少的。贴个链接把: * http://blog.csdn.net/napoay/article/details/52060659 * <p> * 搜索有相同父id的子文档,我也感觉用得少。贴个链接吧: * http://blog.csdn.net/napoay/article/details/52118408 * * 集群配置,现在用不上。贴个链接吧: * http://blog.csdn.net/napoay/article/details/52202877 */ //------------------------------------------------------------------- /** * 删除index为blog、类型为article、id为1的索引中的id属性 * (需要在配置文件中添加以下内容),否则会出现异常 * * script.inline: on script.indexed: on script.engine.groovy.inline.aggs: on * * @throws UnknownHostException */ @Test public void deleteField() throws UnknownHostException { Client client = TransportClient.builder.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); client.prepareUpdate("blog", "article", "1").setScript(new Script("ctx._source.remove("title")",ScriptService.ScriptType.INLINE, null, null)).get(); //删除属性中的属性 //client.prepareUpdate("test", "document", "1").setScript(new Script( "ctx._source.processInstance.remove",ScriptService.ScriptType.INLINE, null, null)).get(); } /** * 添加了Elasticsearch安全插件以后,连接cliet的方式就要改变了。 * * 网站给的maven坐标根本找不到,只能下载了个jar包用了。 * * 配置了Elasticsearch认证以后,kibana也需要配置,不然进不去的。 * * 链接: * http://blog.csdn.net/sd4015700/article/details/50427852 * * 当前配置的Elasticsearch zhongfucheng:zhongfucheng * 当前配置的kibana kibanaserver:zhongfucheng (ps:此部分还需要修改配置文件,详情看上边的连接) * */ @Test public void changeClient() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); System.out.println; } /** * 判断类型是否存在 * @throws UnknownHostException */ @Test public void isTypeExists() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // bolg是index、article是类型 TypesExistsResponse typeResponse = client.admin().indices() .prepareTypesExists.setTypes("article") .execute().actionGet(); System.out.println(typeResponse.isExists; } /** * 关闭索引 */ @Test public void closeIndex() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); CloseIndexResponse cIndexResponse = client.admin().indices().prepareClose .execute().actionGet(); if (cIndexResponse.isAcknowledged { System.out.println; } } /** * 打开索引 * @throws UnknownHostException */ @Test public void openIndex() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); OpenIndexResponse oIndexResponse = client.admin().indices() .prepareOpen .execute().actionGet(); System.out.println(oIndexResponse.isAcknowledged; } /** * 获取文档的集合 * 可以获取同一索引、同一类型、不同id的文档集合 * 也可以获取不同索引、不同类型、不同id的文档集合 */ @Test public void getDocCollection() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); MultiGetResponse multiGetItemResponses = client.prepareMultiGet() .add("blog", "article", "1") //注释1 //.add("twitter", "tweet", "2", "3", "4") //注释2 .add("test", "article", "AV-K5x1NAQtVzQCf247Q") //注释3 .get(); for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //注释4 GetResponse response = itemResponse.getResponse(); if (response.isExists { //注释5 String json = response.getSourceAsString(); //注释6 System.out.println; } } /** 注释1: 通过单一的ID获取一个文档. 注释2:传入多个id,从相同的索引名/类型名中获取多个文档. 注释3:可以同时获取不同索引中的文档. 注释4:遍历结果集. 注释5:检验文档是否存在. 注释6:获取文档源. */ } /** * 获取索引下每个Type和Mapping * @throws IOException */ @Test public void getIndexTypeAndMapping() throws IOException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); ImmutableOpenMap<String, MappingMetaData> mappings = client.admin().cluster().prepareState().execute() .actionGet().getState().getMetaData().getIndices().get.getMappings(); for (ObjectObjectCursor<String, MappingMetaData> cursor : mappings) { System.out.println(cursor.key); // 索引下的每个type System.out.println(cursor.value.getSourceAsMap; // 每个type的mapping } } /** * * Elasticsearch还有分析聚合这么一个功能,类似与Mysql中的分组函数、统计数据。 * 贴个链接: * * http://blog.csdn.net/napoay/article/details/53484730 */}

上面的代码是到:

在练习Demo的时候出现了几个问题:

  • 使用shiled认证,无法下载maven坐标,只能导入jar包(官方给出的maven坐标也找不着....shield被废弃了)
  • 使用shiled认证之后,上面博主给出的连接ElasticSearch代码有错,抛出了异常。上网找了几篇资料,无法解决我的问题:
    • 最后在一篇博文中找到了答案:更新连接Elasticsearch的代码
 Settings settings = Settings.settingsBuilder() .put("cluster.name", "elasticsearch") .put("shield.user", "zhongfucheng:zhongfucheng") .build(); TransportClient client = TransportClient.builder() .addPlugin(ShieldPlugin.class) .settings.build(); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

在我的个人项目中简单用到了Elasticsearch,也遇到了不少的坑,比如:当创建Elasticsearch的Client的时候,一定要加入嗅探这么一个配置:.put("client.transport.sniff", true),否则Elasticsearch在使用的时候会非常非常卡,简直令人怀疑人生。

当时我是用Elasticsearch做自动补齐的功能的,也就下面这张图片:

澳门新濠3559 4image

Elasticsearch有suggest这么一个自动提示的功能,参考博文:

具体的操作:

  • 在建立Mapping的时候创建自动补齐的这么一个字段,设置以下的Mapping
 //自动补全属性-------- .startObject("suggestName") .field("type", "completion") .field("analyzer", "standard") .field("payloads", "true") .endObject() //自动补全属性结束--------

当用户加入新的索引记录的时候,自动补齐字段就是我们的关键字段

 public static String String2JSON(String... strings) throws IOException { String suggestName = strings[2]; if (suggestName.length { } XContentBuilder builder = jsonBuilder() .startObject() .field("userId", strings[0]) .field("webSiteAddr", strings[1]) .field("webSiteName", strings[2]) //自动补全字段 .field("suggestName", strings[2]) .endObject(); return builder.string(); }

其他基础的东西其实都是Lucene演变过来的,要是没学过Lucene可以去看看我另外一篇博文:

  • Lucene就这么简单

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

还要在ESC服务器上开放端口才能访问:

我去搜了几篇Elasticsearch教程,发现很多都是基于linux的,但我linux耍得并不熟,很少用。仅仅会一些简单的命令,等真正去用到linux的时候再慢慢啃吧。

curl -X GET 'http://localhost:9200'

下载了2.3.3版本,因为我在windows开发的时候也是下载2.3.3版本的,就为了保持一致吧。

下载kibana的版本是:4.5.0

ik分词器的版本是1.9.3。文章给出的是以mvn的方式打包下载。因此在github中我们下载resouce类型的

在其配置上(kibana.yml)添加:

Elasticserach的下载还是非常方便的,提供搜索来进行下载。这里我就不贴链接了。直接去官网找就行了。或者去我的Elasticsearch学习记录中找。

对应Elasticsearch2.3.3版本的拼音分词器版本为:1.7.3

澳门新濠3559 5image

这次教程给出的连接就用上了,我截图主要的:

只有配置了kibanaserver账户、才能登陆进去

切换到bin目录下执行就行了...

在官网上可以在搜索框中查找对应的版本

bin/shield/esusers useradd adminName -r admin
kibana_elasticsearch_username: kibanaserver #Kibana服务将用这个用户名访问ElasticSearch服务器。 kibana_elasticsearch_password: zhongfucheng #密码 

3.2.1下载head插件

在下载head插件的时候,需要修改elasticsearch的用户和组,否则它就不让你下载。命令如下

添加用户和组

groupadd elasticsearchuseradd elasticsearch -g elasticsearch -p 123456

修改文件夹权限

chown -R elasticsearch:elasticsearch elasticsearch-2.3.3

澳门新濠3559 6image

弄完之后就可以执行命令下载head插件了。

./plugin install mobz/elasticsearch-head

澳门新濠3559 7image

下载完head插件后,不要立马下载shield插件,首先在head插件上创建一个索引!

否则,当下载完shield插件、再访问head插件的话,就无法连接节点了!

这搞了我好长的时间才弄好!!!!!网上也有很多人遇到过这种情况,却没什么好的回答。都在说配置文件上的事情。

我是通过在github中别人提出的issue中找到答案的。参考:

记住了,先在head插件中创建索引、再下载shield插件,否则无法连接head插件澳门新濠3559,!

澳门新濠3559 8image

Windows下装Elasticsearch到此就结束了。

于是发现了一篇写得很好的教程:

tar -xzvf elasticsearch-2.3.3.tar.gz

想要通过外网来访问的话,那么就需要修改配置文件了,参考链接

为kibana添加用户

编辑:数据库 本文来源:参考链接,我去搜了几篇Elasticsearch教程澳门新濠

关键词: 澳门新濠3559