需要的jar包,我这里使用maven的pom.xml导入,可以自己下载jar包并导入到项目中

                <dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.4.2</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.4.2</version></dependency>

连接集群ClientConnect.java

import java.net.InetSocketAddress;import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;/*** * @createDate 2018年3月8日* @class_name ClientConnect 连接ES集群* @description : 建立es的client,通过getClient()调用,只能连接es5.4.2*/
public class ClientConnect {private TransportClient client;public TransportClient getClient() {return client;}/*** * @param clusterName       集群名称* @param clusterAddress    集群ip地址* @param port              端口号*/@SuppressWarnings({ "unchecked", "resource" })public ClientConnect(String clusterName, String clusterAddress, int port) {Settings settings = Settings.builder().put("cluster.name", clusterName).build();client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(clusterAddress, port)));System.out.println("success connect");}}

查询模板BaseSearch.java

package util;import java.util.Arrays;
import java.util.Iterator;import org.apache.lucene.search.Sort;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.lucene.search.function.CombineFunction;
import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction.Modifier;
import org.elasticsearch.index.query.MultiMatchQueryBuilder.Type;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;/*** @date 2018年3月8日* @class_name baseSearch* @description : 查询模板*/
public class BaseSearch {private TransportClient client;private SearchResponse response;private SearchRequestBuilder searchRequestBuilder;/*** @description : 构造一个搜索实例* @param client es服务器的ip地址*/public BaseSearch(TransportClient client){this.client=client;}/*** @description : 使用前必须先自定义搜索语句*/private QueryBuilder setQuery(){/*   *   must        查询子句must出现在文档中,并且会影响文档得分score*   filter      查询子句must出现在文档中,但是不会影响文档得分,并且会缓存*  should      查询子句should出现在文档中,即并列的should子句必须有一个或者多个出现在文档中,可以通过设置参数 minimum_should_match来指定最少匹配的查询子句*   must_not    查询子句一定不能出现在文档中,处于filter上下文,不影响文档得分,会被缓存* * 1.   加权查询,数据在"title","summary","author","content"四个字段中包含搜索关键词"国经理",并将该次查询分数变成1.0倍。* 2.   整句查询,数据在"title","summary"字段中包含搜索关键短语"事件反腐风暴",事件反腐风暴不分词,事件反腐风暴中间可间隔2位* 3.   模糊查询,数据在"title","summary"字段中包含搜索关键词"国经理",并将该次查询设置为模糊查询,模糊程度"AUTO"* 4.   数据在"title"字段中包含搜索符合关键词"反腐","国家","公司"中任意一个条件,并并将该次查询分数变成-0.9倍* 5.   数据不在"title","summary","author","content"任意一个字段内含有关键词"交易"* 6. 通配符查询,数据在"author"字段中含有通配符表达式"*w*",支持? 匹配任何字符,*匹配零个或多个字符* 7.   正则查询,数据在"author"字段中含有正则表达式"[a-z]k[a-z]"* 8.  前缀短语查询,数据在"summary"字段中以"据"开头的数据* 9-11。数据在3个should中满足至少一个查询子句* 12.   设置至少要符合多少个条件,参数为百分比,或者整型* 13.  数据在"publish_time"字段里的数据在from("2018-01-13 14:21:09")和to("2018-01-17 14:21:09")之间* 14.    数据存在"title"字段* 15.  衰减函数DecayFunction(field, origin, scale, offset, decay),有linear,gauss,exponential三种,数据离origin越近得分越高* 16.  域值因子fieldValueFactorFunction(field).通过字段field里的值提高数据的得分*/return QueryBuilders.boolQuery()/*1*/   //  .must(QueryBuilders.multiMatchQuery("国经理", "title","summary","author","content").boost(1.0f))/*2*/    //  .must(QueryBuilders.multiMatchQuery("事件反腐风暴", "title","summary").type(Type.PHRASE).slop(2))/*3*/  //  .must(QueryBuilders.multiMatchQuery("报道", "title","summary").fuzziness("AUTO"))/*4*/    //  .must(QueryBuilders.termsQuery("title", "反腐","国家","公司").boost(-0.9f))/*5*/  //  .mustNot(QueryBuilders.multiMatchQuery("交易", "title","summary","author","content"))/*6*/  //  .must(QueryBuilders.wildcardQuery("author", "*w*"))/*7*/    //  .must(QueryBuilders.regexpQuery("author", "[a-z]k[a-z]"))/*8*/  //  .must(QueryBuilders.matchPhrasePrefixQuery("summary","据"))/*9*/ //  .should(QueryBuilders.multiMatchQuery("亿元","title","summary","author","content"))/*10*/   //  .should(QueryBuilders.multiMatchQuery("严格","title","summary","author","content"))/*11*/   //  .should(QueryBuilders.multiMatchQuery("发表","title","summary","author","content"))/*12*/   //  .minimumShouldMatch("55%")/*13*/  //  .must(QueryBuilders.rangeQuery("publish_time").from("2018-01-13 14:21:09").to("2018-01-17 14:21:09"))//50.45 59.12  1741 1749.66/*14*/  //    .must(QueryBuilders.existsQuery("title"))/*15*/   //  .must(QueryBuilders.functionScoreQuery(ScoreFunctionBuilders.linearDecayFunction("price",67,20,5,0.5)))/*16*/ //  .must(QueryBuilders.functionScoreQuery(ScoreFunctionBuilders.fieldValueFactorFunction("comment").modifier(Modifier.LN1P).factor(0.1f)).boostMode(CombineFunction.SUM));}/*** @description : 使用前必须先自定义过滤语句,过滤不影响得分,*/private QueryBuilder setFilter(){/*  *   must        查询子句must出现在文档中,并且会影响文档得分score*   filter      查询子句must出现在文档中,但是不会影响文档得分,并且会缓存*  should      查询子句should出现在文档中,即并列的should子句必须有一个或者多个出现在文档中,可以通过设置参数 minimum_should_match来指定最少匹配的查询子句*   must_not    查询子句一定不能出现在文档中,处于filter上下文,不影响文档得分,会被缓存* * 1.   加权查询,数据在"title","summary","author","content"四个字段中包含搜索关键词"国经理",并将该次查询分数变成1.5倍。* 2.   整句查询,数据在"title","summary"字段中包含搜索关键短语"事件反腐风暴",事件反腐风暴不分词,事件反腐风暴中间可间隔2位* 3.   模糊查询,数据在"title","summary"字段中包含搜索关键词"国经理",并将该次查询设置为模糊查询,模糊程度"AUTO"* 4.   数据在"title"字段中包含搜索符合关键词"反腐","国家","公司"中任意一个条件,并并将该次查询分数变成-0.9倍* 5.   数据不在"title","summary","author","content"任意一个字段内含有关键词"交易"* 6. 通配符查询,数据在"author"字段中含有通配符表达式"*w*",支持? 匹配任何字符,*匹配零个或多个字符* 7.   正则查询,数据在"author"字段中含有正则表达式"[a-z]k[a-z]"* 8.  前缀短语查询,数据在"summary"字段中以"据"开头的数据* 9-11。  数据在3个should中满足至少一个查询子句* 12.     设置至少要符合多少个条件,参数为百分比,或者整型* 13.  数据在"publish_time"字段里的数据在from("2018-01-13 14:21:09")和to("2018-01-17 14:21:09")之间*/return QueryBuilders.boolQuery()/*1*/  //  .must(QueryBuilders.multiMatchQuery("国经理", "title","summary","author","content").boost(1.5f))/*2*/    //  .must(QueryBuilders.multiMatchQuery("事件反腐风暴", "title","summary").type(Type.PHRASE).slop(2))/*3*/  //  .must(QueryBuilders.multiMatchQuery("报道", "title","summary").fuzziness("AUTO"))/*4*/    //  .must(QueryBuilders.termsQuery("title", "反腐","国家","公司").boost(-0.9f))/*5*/  //  .mustNot(QueryBuilders.multiMatchQuery("交易", "title","summary","author","content"))/*6*/  //  .must(QueryBuilders.wildcardQuery("author", "*w*"))/*7*/    //  .must(QueryBuilders.regexpQuery("author", "[a-z]k[a-z]"))/*8*/  //  .must(QueryBuilders.matchPhrasePrefixQuery("summary","据"))/*9*/ //  .should(QueryBuilders.multiMatchQuery("亿元","title","summary","author","content"))/*10*/   //  .should(QueryBuilders.multiMatchQuery("严格","title","summary","author","content"))/*11*/   //  .should(QueryBuilders.multiMatchQuery("发表","title","summary","author","content"))/*12*/   //  .minimumShouldMatch("55%")/*13*/  //  .must(QueryBuilders.rangeQuery("publish_time").from("2018-01-13 14:21:09").to("2018-01-17 14:21:09"));}/*** @description : 使用前必须先自定义高亮设置语句*/private HighlightBuilder setHighlight(){HighlightBuilder highlightBuild = new HighlightBuilder()// 设置被高亮的字段.field("summary").field("title")// 设置高亮的标签.preTags("<strong>").postTags("</strong>");return highlightBuild;}/*** @param response * @description : 打印搜索结果*/public void printResponse(){response=this.getResponse();// timed_outboolean isTimedOut = response.isTimedOut();System.out.println("查询成功,timed_out:"+isTimedOut);// _shards,查询总分片数,查询成功片数,查询失败片数int totalShards = response.getTotalShards();int successfulShards = response.getSuccessfulShards();int failedShards = response.getFailedShards();System.out.println("查询分片数:{ total="+totalShards+" successful="+successfulShards+" failed="+failedShards+"},查询到"+response.getHits().totalHits+"条记录");// 文档在hit数组中,更多方法使用请看API中SearchHitsSearchHits searchHits = response.getHits();Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit hit = iterator.next();String hitIndex = hit.getIndex();String hitType = hit.getType();String id = hit.getId();float score = hit.getScore();System.out.println("index="+hitIndex+" type="+hitType+" id="+id+" score="+score+" source-->"+hit.getSourceAsString());System.out.println(hit.getHighlightFields());}System.out.println("查询结束...");}/*** @description 获取搜索结果,需先修改BasaSearch里的方法setQuery(),setFilter(),setHighlight()* @param indexs 索引名称* @param types    类型名称*/public void getSearchByIndexAndType(String[] indexs,String[] types) {System.out.print("集群中查询索引为"+Arrays.deepToString(indexs)+"和类型为"+Arrays.deepToString(types)+"的所有数据");//查询QueryBuilder queryBulid=this.setQuery();QueryBuilder filterBulid=this.setFilter();HighlightBuilder highlightBuild1=this.setHighlight();searchRequestBuilder =                       //设置查询的index,例{"twitter","indexName"}        client.prepareSearch(indexs)//设置查询的type,例{"tweet","typeName"}.setTypes(types)/* 设置查询类型* 1.SearchType.DFS_QUERY_THEN_FETCH = 最精确* 2.SearchType.QUERY_THEN_FETCH = 比较快*/.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)//设置查询.setQuery(queryBulid)//设置过滤器.setPostFilter(filterBulid)  //设置获取查询数据的位置      .setFrom(0)//设置获取查询数据的数量.setSize(50)//设置是否按查询匹配度排序,很耗资源,只能用作调试工具,千万不要用于生产环境
//              .setExplain(true)//设置显示高亮,.highlighter(highlightBuild1)//设置根据"publish_time"排序
//              .addSort("publish_time", SortOrder.DESC);System.out.println("开始查询...");//建立查询,并返回结果SearchResponse response = searchRequestBuilder.get();this.setResponse(response);}/*** @description : 获取发送给服务器的请求的JSON格式* @return String*/public String getRequestJSON(){return searchRequestBuilder.toString();}public TransportClient getClient() {return client;}public void setClient(TransportClient client) {this.client = client;}public SearchRequestBuilder getSearchRequestBuilder() {return searchRequestBuilder;}public void setSearchRequestBuilder(SearchRequestBuilder searchRequestBuilder) {this.searchRequestBuilder = searchRequestBuilder;}public SearchResponse getResponse() {return response;}public void setResponse(SearchResponse response) {this.response = response;}
}

测试实例SearchTest.java

package instancetest;import org.elasticsearch.client.transport.TransportClient;import util.BaseSearch;
import util.ClientConnect;public class SearchTest {public static void main(String[] args) {// TODO Auto-generated method stubTransportClient client = new ClientConnect("elasticsearch", "192.168.203.201", 9320).getClient();BaseSearch bs = new BaseSearch(client);String[] index = {};String[] type = {};// 从index和type中搜索,为空则为全部搜索bs.getSearchByIndexAndType(index, type);// 打印服务器的回复bs.printResponse();// 打印发送的请求System.out.println(bs.getRequestJSON());}}

根据需求修改查询模板BaseSearch.java来获取想要的检索结果。

通过进行各种尝试来掌握ElasticSearch的查询功能。

注意:使用的ElasticSearch的jar包要和集群使用的版本一样,不然可能出现连接不上集群的错误。

ElasticSearch查询模板相关推荐

  1. elasticsearch 查询模板

    简单版示例: 2.x版本(相比于1.x版本,使用bool替代filtered,使用must替代query) {"query": {"bool": {" ...

  2. 《深入理解Elasticsearch(原书第2版)》一2.3.3 把查询模板保存到文件

    本节书摘来华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第2章 ,第2.3.3节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoz ...

  3. ElasticSearch6 查询模板的创建使用

    各个版本之间的使用命令还是有些差别,前段时间用6.1.3,不管是使用head还是cerebro,提交时总是碰到各种问题,部分原因就是以前看到的一些资料,版本较早,命令有些差异,所以把一些内容记下来,免 ...

  4. 为什么Elasticsearch查询变得这么慢了?

    Elasticsearch 最少必要知识实战教程直播回放 0.引言 Elasticsearch社区中经常看到慢查询问题:"你能帮我看看Elasticsearch的响应时间吗?"或者 ...

  5. Elasticsearch——Templates 模板

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch--Templates 模板 博客分类: java 搜索引擎,爬虫 刚开始的时候,每次实验都去改/e ...

  6. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  7. es查询语句拼接 java_JAVA使用ElasticSearch查询in和not in的实现方式

    JAVA使用ElasticSearch查询in和not in的实现方式 发布时间:2020-08-22 16:03:11 来源:脚本之家 阅读:119 作者:执笔记忆的空白 ElasticSearch ...

  8. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  9. bigquery_到Google bigquery的sql查询模板,它将您的报告提升到另一个层次

    bigquery In this post, we're sharing report templates that you can build with SQL queries to Google ...

  10. Elasticsearch查询性能优化

    constant_score的用处 当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包 ...

最新文章

  1. day042前端之HTML
  2. 第十四章:springboot 定时任务
  3. MySql乱码解决(五)
  4. 使用openpyxl去操作Excel表格
  5. 中随机打乱序列的函数_提前准备,方能“随机”应对,人生不悔
  6. Color Tint
  7. C++shell sort希尔排序的实现算法之二(附完整源码)
  8. Java集合--TreeMap
  9. 软件项目组织管理(五)项目范围管理
  10. Date Picker控件:
  11. Android开发笔记(五十七)录像录音与播放
  12. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP
  13. 7-7 整数的分类处理 (20 分)
  14. java破解ip屏蔽+多线程同步拨号-【多线程数据采集之五】
  15. CENTOS上编译FreeSwitch
  16. 层次分析法AHP及Python实现
  17. ShuffleNet在Caffe框架下的实现
  18. 分享2020年第三方支付产品服务流程
  19. linux如何结束at命令,Linux命令总结--at命令(atq.atrm)
  20. JSONObject 转对象

热门文章

  1. 增选54位院士,京东副总裁梅涛等18位华人入选!
  2. pdf多页合成一张pdf图片
  3. 分享一个NI软件卸载工具
  4. 一道金蝶校园招聘试题数据库笔试题
  5. FNT不能计算通用数据集(看看fwt···)
  6. 微信读书vscode插件_想用 VSCode 写书?这款插件必须备上!
  7. nodejs下载安装
  8. 华为手机html查看器,华为手机文件查看管理器
  9. 【有限元分析】有限元仿真分析与解析解的结果对比——以简单悬臂梁的受力分析为例
  10. 恩智浦智能车电机驱动程序_恩智浦智能车电机驱动-HIP4082+LR7843