java 查询 代码_java使用es查询的示例代码
众所周知,elasticsearch简称es,它是基于基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题以及可能出现的更多其它问题。
在java中使用es时,无非想解决的是查询速度不够快,效率不够高问题,单一从数据库里查询数据已经不能拿满足当前的业务需求,ok!那么现在我们来讲述一下如何在java中使用到es这个神奇的搜索服务器呢,首先,你得要去引用es的依赖包,依赖如下:
org.elasticsearch.client
transport
5.5.0
org.elasticsearch.client
transport
5.5.0
org.elasticsearch
elasticsearch
5.5.0
好的,添加完依赖之后,进入到es使用阶段,对了,有个问题得需要说明一下,要使用es的话需要安装jdk1.8工具包并且tomcat最好是7.05以上的版本,不然es会不支持,集成到项目里面可能会报错!,还有es的安装和下载,这里附下载地址下载地址:https://www.elastic.co/downloads/elasticsearch
一切准备就绪后接下来进入到我们真正期待的时刻,什么呢,没错,集成es,究竟如何在java里面搜索查询es服务器里面的东西呢,让我一一来为你揭晓:
首先我们建议一个es的工具类
package com.osa.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.client.ClientProtocolException;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
public class HTTPSentUtils {
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
}
工具类有了之后,可以看到里面有两个发送请求的方法,一个是sendGet和sendPost方法,两个方法可以基于自己的选择选用,当然这只是个发送请求的方法,如何调用?在这里的话,我们既然是从es里面查询,就没有必要使用mybatis或者hibernate框架了,可以在数据层中,自己定义sql,然后将sql将拼好的sql通过前面的工具类调用sendGet/sendPost方法,如下:
String sql=URLEncoder.encode(" select * from table");encode方法主要是去除sql里面的一些空格
String result=HTTPSentUtils.sendGet("http://221.124.71.8:9200/_sql", "sql="+sql);ip加端口自己可以在安装的时候配置
OK!一般到这个时候的发送可以成功的话,就能取到es里面的数据,因为es里面返回的都是json数据,所以我们
格式化一下json字符串
net.sf.json.JSONObject jsonObject =net.sf.json.JSONObject.fromObject(result);
//取出hits标签
net.sf.json.JSONObject hitsjsonObject = jsonObject.getJSONObject("hits");
数据拿到之后,结下来就是业务操作了。到这里也差不多结束了。
以上是查询的一些操作,那么如果我们需要将数据批量插入到es里面该如何操作?举个例子吧
package com.sojson.core.elasticsearch.manager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import com.sojson.common.utils.StringUtils;
import com.sojson.core.elasticsearch.utils.ESTools;
publicclassInsertManager{
/**
* 添加数据到Elasticsearch
*@param index 索引
*@param type 类型
*@param idName Id字段名称
*@param json 存储的JSON,可以接受Map
*@return
*/
publicstaticMapsave(String index,String type,String idName,JSONObject json){
List list =newArrayList();
list.add(json);
return save(index, type, idName, list);
}
通过传来的参数进行处理调用save方法执行插入es操作
/**
* 添加数据到Elasticsearch
*@param index 索引
*@param type 类型
*@param idName Id字段名称
*@param listData 一个对象集合
*@return
*/
@SuppressWarnings("unchecked")
publicstaticMapsave(String index,String type,String idName,List listData){
BulkRequestBuilder bulkRequest =ESTools.client.prepareBulk().setRefresh(true);
Map resultMap =newHashMap();
for(Object object: listData){
JSONObject json =JSONObject.fromObject(object);
//没有指定idName 那就让Elasticsearch自动生成,
if(StringUtils.isBlank(idName)){
IndexRequestBuilder lrb =ElasticsearchUtils.client
.prepareIndex(index, type)
.setSource(json);
bulkRequest.add(lrb);
//ElasticsearchUtils是工具类,里面配置的是一些es配置信息
}
else{
String idValue = json.optString(idName);
IndexRequestBuilder lrb =ESTools.client.prepareIndex(index, type,idValue).setSource(json);
bulkRequest.add(lrb);
}
}
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if(bulkResponse.hasFailures()){
// process failures by iterating through each bulk response item
System.out.println(bulkResponse.getItems().toString());
resultMap.put("500","保存ES失败!");
return resultMap;
}
bulkRequest=ESTools.client.prepareBulk();
resultMap.put("200","保存ES成功!");
return resultMap;
}
}
ElasticsearchUtils工具类
public class ElasticsearchUtils {
private static final String CLUSTER_NAME = "cluster.name";
private static final String ES_IP="es.ip";
private static final String ES_PORT="es.port";
private static Settings settings;
private static TransportClient client;
public static TransportClient getESClient() throws UnknownHostException{
settings = Settings.builder().put(CLUSTER_NAME,ConfigUtils.getConfig(CLUSTER_NAME)).build();
if(client != null){
client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ConfigUtils.getConfig(ES_IP)), Integer.parseInt(ConfigUtils.getConfig(ES_PORT))));
}
return client;
}
以上是插入es操作,好了,今天的总结就到这里吧,希望可以给大家带来一些小小的帮助,也希望大家多多支持脚本之家。
相关文章:

【转】解密“设计模式”
有些人问我,你说学习操作系统的最好办法是学习程序设计。那我们是不是应该学习一些“设计模式”(design patterns)。这是一个我很早就有定论,而且经过实践检验的问题,所以想在这里做一个总结。 总的来说,如…

Qt Installer Framework实战
Qt Installer Framework是Qt发布的安装程序支持框架,只需要简单的配置就可以生成安装文件,同时可以通过javascript脚本来定制安装过程。 目录结构 config packages data meta 配置文件 config/config.xml packages/[product]/meta/package.xml packages/…
【NCEPU】徐韬:街景字符编码识别比赛
徐韬是华北电力大学数理系大四的学生,Datawhale成员/Dreamtech成员,参加了多期Datawhale的组队学习,也在天池/CCF/讯飞等比赛中取得了不错的成绩,现保送大连理工大学深造。 这篇图文是他在线下组队学习时,为大家分享自…

java 程序启动界面_程序启动界面java代码
最近写了个程序启动界面,分享一下import javax.swing.*;import java.awt.*;import java.net.*;//Download by http://www.codefans.net//程序启动界面/*dkplus专业搜集和编写实用电脑软件教程,*搜集各种软件资源和计算机周边,独立制作视频和p…

中国电子学会图形化四级编程题:食堂取餐
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

获取app传入的json值处理
$getDatas $_POST; if(empty($getDatas)) $getDatas file_get_contents("php://input"); $getDatas json_decode($getDatas,true); 转载于:https://www.cnblogs.com/wjw-/p/8496855.html

java虚拟机栈帧_Java虚拟机,运行时栈帧结构
业余生活要有意义,不要越轨。——华盛顿引导语“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件…
深入浅出Pytorch:01 课程大纲与PyTorch简介
深入浅出Pytorch 01 课程大纲与PyTorch简介 内容属性:深度学习(实践)专题航路开辟者:李嘉骐、牛志康、刘洋、陈安东领航员:叶志雄航海士:李嘉骐、牛志康、刘洋、陈安东开源内容:https://githu…

用C写有面向对象特点的程序
比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后&a…

[置顶] 单键模式的C++描述
设计模式-单键(Signelton):其实单键的设计模式说来很简单,说的直白一点就是程序运行过程中保证只有一个实例在运行而已。在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑…

下java7 64有什么用_Win 7 64位系统安装java 8,看完就明白了
在 Windows 7 的 64 位系统中安装 jdk 8工具/材料Windows 7 64 位系统JDK 8 64位版本方法/步骤1 下载JDK 8安装文件011.1 访问JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html点击 JDK Download 按钮,进入JDK下载页。021.2 下载JDK…
微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍...
在SSDT中部署一个 SSAS 项目到本地服务器上出现错误。 You cannot deploy the model because the localhost deployment server is not running in multidimensional mode。 错误原因是因为我在本地安装 SQL Server 2012 的时候只选择安装了 Tabular Mode,而这个Dem…

java遍历的优化
说明:这是在面试中面试官出的题。虽然是常见的优化问题,但这种经验的确很有用。感慨之余,分享出来,以此共勉。 场景:现有List<PersonA>,List<PersonB>,PersonA 的属性是 String类型的身份证号,…
深入浅出Pytorch:02 PyTorch基础知识
深入浅出Pytorch 02 PyTorch基础知识 内容属性:深度学习(实践)专题航路开辟者:李嘉骐、牛志康、刘洋、陈安东领航员:叶志雄航海士:李嘉骐、牛志康、刘洋、陈安东开源内容:https://github.com/…

java for 两个条件_for循环条件里定义2个变量为什么会报错
public class HelloWorld {//完成 main 方法public static void main(String[] args) {int scores[]{89,-23,64,91,119,52,73};HelloWorld hellonew HelloWorld();hello.sortScore(scores);}//定义方法完成成绩排序并输出前三名的功能public void sortScore(int[] scores){Arra…
Qt4在linux下的安装
1、下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensource-2010.05.1.bin 2、修改文件权限 想要安装SDK,需要拥有对其读写和执行的权限。可以通过【右键】->【属性】->【权限】进行设置。 也可以通过命…

高性能千万级定时任务管理服务forsun使用详解
Forsun高性能高精度定时服务,轻松管理千万级定时任务。项目地址: https://github.com/snower/forsun 使用 linux 系统定时器提供精确到秒级的定时调度,长时间运行保证无误差。支持本地内存存储和 redis 持久化存储,使用 redis 可轻…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器
吃瓜教程——西瓜书南瓜书 Datawhale南瓜书是经典机器学习教材《机器学习》(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习。 内容属性:机器学习(理…

java 上传的图片大小为0_JAVA技术:上传图片的缩放处理
图片上传到后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理。下面的程序使用jdk1.4中最新的ImageIO对图片进行读写。使用AffineTransform对图片进行缩放。import java.io.File;i…

信息安全推荐书籍
本页列出了我发现的与计算机安全,数字取证,事件响应,恶意软件分析和逆向工程以及其他相关主题学习主题高度相关和有用的书籍。这些书从介绍性文本到高级研究作品。尽管这些书中的一些看起来有点过时,但所包含的信息对今天学习的人…

paip.odbc DSN的存储与读取
paip.odbc DSN的存储与读取 作者Attilax , EMAIL:1466519819qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax 1.列出系统级ODBC列表 ---------------------- [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data So…

【青少年编程】【三级】计算平均分
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

java 判断是否为邮箱_Java判断邮箱是否存在 有返回值
public static boolean checkEmail(String email) {if (!email.matches("[\\w\\.\\-]([\\w\\-]\\.)[\\w\\-]")) {return false;}String log "";String host "";String hostName email.split("")[1];// 去掉后面的System.out.printl…

Android Handler介绍
本文转自:http://www.cnblogs.com/keyindex/articles/1822463.html前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,…

阿里巴巴一年投三家AR公司,AR购物或是最终目标
阿里巴巴再投资AR公司,一年连续投资超2.2亿美元,它到底想要做什么? 最近,以色列AR眼镜厂商Lumus获得来自阿里巴巴的600万美元的投资。此前,镁客网报道过这家公司在去年12月份获得由广达电脑、HTC和盛大集团投资的300万…

青少年编程竞赛交流群周报(第035周)
2021年10月24日(周日)晚20:00我们在青少年编程竞赛交流群开展了第三十五期直播活动。 一、直播内容 我们直播活动的主要内容如下: 讲解了上次测试中小朋友们做错的题目 Scratch青少年编程能力等级测试模拟题(四级)。…

java 接口工程_Java工程师(15)抽象类与接口
抽象类思考下面程序潜在的问题交通工具中定义了4个方法,其中行驶方法内部会依次调用启动、加速、停止方法。由于不同的交通工具,启动的方式差异很大,所以交通工具类中并不实现该方法,而是将其交给子类实现。上述代码的问题&#x…

为什么必须是final的呢?
一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话,那下面这种风格的代码对你来说应该不陌生: 1 2 3 4 5 6 7 8 9public void tryUsingGuava() {final int expectedLength 4;Iterables.filter(Lists.newArrayList("123", &…

java mvc view_对Springmvc view层的理解
MVC框架可以把应用清晰明了地分为三个部分:Model层–数据层,View层–视图层,Controller–逻辑层,Model层负责整合数据,View层负责页面渲染,Controller层负责实现业务逻辑。我在这里简单说一下我对MVC框架中…