ElasticSearch学习笔记(九)Java AP实现搜索,排序,高亮,分页
来源:互联网 发布:淘宝买家秀怎么做兼职 编辑:程序博客网 时间:2024/06/05 18:01
虽然上一篇中的对索引的搜索可以在一定程度上获取索引的信息,但是毕竟功能是有限的,本篇主要是对elasticsearch使用javaAPI实现搜索功能的笔记。
一、搜索
package test;import static org.elasticsearch.index.query.QueryBuilders.termQuery;import java.net.InetAddress;import java.util.HashMap;import java.util.Map;import org.apache.lucene.index.Terms;import org.elasticsearch.action.search.MultiSearchResponse;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchRequestBuilder;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.elasticsearch.common.unit.TimeValue;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.script.ScriptType;import org.elasticsearch.script.mustache.SearchTemplateRequestBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.aggregations.AggregationBuilders;import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;import org.elasticsearch.search.sort.FieldSortBuilder;import org.elasticsearch.search.sort.SortOrder;import org.elasticsearch.transport.client.PreBuiltTransportClient;@SuppressWarnings({ "resource","deprecation" })public class testSearch { public static void main(String[] args) throws Exception{ searchmethod6(); } /** * 方法一 * @throws Exception */ public static void searchmethod1() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); SearchResponse response = client.prepareSearch("movies").setTypes("movie").get(); println(response); for (SearchHit searchHit: response.getHits()) { println(searchHit); } } /** * 方法二 * @throws Exception */ public static void searchmethod2() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); QueryBuilder qb1 = termQuery("user","10");// QueryBuilder qb2 = QueryBuilders.multiMatchQuery("git", "title", "content"); SearchResponse response = client.prepareSearch("movies").setQuery(qb1).get(); for (SearchHit searchHit: response.getHits()) { println(searchHit); } } /** * 方法三 * @throws Exception * 这个相当于之前的分页,使用的是Scroll方法 */ public static void searchmethod3() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); QueryBuilder qb = termQuery("user", "kimchy"); SearchResponse scrollResp = client.prepareSearch("movies") .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC) .setScroll(new TimeValue(60000)) .setQuery(qb) .setSize(1).get(); do { for (SearchHit hit : scrollResp.getHits().getHits()) { println(hit); } scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); } while(scrollResp.getHits().getHits().length != 0); } /** * 方法四 * @throws Exception */ public static void searchmethod4() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); SearchRequestBuilder srb1 = client.prepareSearch().setQuery(QueryBuilders.queryStringQuery("kimchy")); SearchRequestBuilder srb2 = client.prepareSearch().setQuery(QueryBuilders.matchQuery("user", "kimchy")); MultiSearchResponse sr = client.prepareMultiSearch().add(srb1).add(srb2).get(); for (MultiSearchResponse.Item item : sr.getResponses()) { SearchResponse response = item.getResponse(); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } } /** * 方法五 * 这个方法先欠着,不是很懂 * @throws Exception */ public static void searchmethod5() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); SearchResponse sr = client.prepareSearch() .setQuery(QueryBuilders.matchAllQuery()) .addAggregation( AggregationBuilders.terms("agg1").field("field") ) .addAggregation( AggregationBuilders.dateHistogram("agg2") .field("birth") .dateHistogramInterval(DateHistogramInterval.YEAR) ) .get(); // Get your facet results Terms agg1 = sr.getAggregations().get("agg1");// DateHistogram agg2 = sr.getAggregations().get("agg2"); } /** * 方法六 * 能运行,但是就是不知道为什么查询不到结果,同时感觉这种方法很鸡肋,感觉写起来很麻烦,顺便说一下这个东西好像也可以在script下配置,我测试失败,但是感觉没什么用,就不深究了。 * https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-template.html * @throws Exception */ public static void searchmethod6() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); Map<String, Object> json = new HashMap<>(); json.put("param_gender", "1962"); SearchResponse response = new SearchTemplateRequestBuilder(client) .setScript("{\n" + " \"query\" : {\n" + " \"match\" : {\n" + " \"year\" : \"{{param_gender}}\"\n" + " }\n" + " }\n" + "}") .setScriptType(ScriptType.INLINE) .setScriptParams(json) .setRequest(new SearchRequest()) .get() .getResponse(); println(response); System.out.println(response.getHits().getTotalHits()); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } /** * 输出结果SearchResponse * @param response */ public static void println(SearchResponse response){ System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"); System.err.println( "getFailedShards : " + response.getFailedShards() + "\n" + "getNumReducePhases : " + response.getNumReducePhases() + "\n" + "getScrollId : " + response.getScrollId() + "\n" + "getTookInMillis : " + response.getTookInMillis() + "\n" + "getTotalShards : " + response.getTotalShards() + "\n" + "getAggregations : " + response.getAggregations() + "\n" + "getProfileResults : " + response.getProfileResults() + "\n" + "getShardFailures : " + response.getShardFailures() + "\n" + "getSuggest : " + response.getSuggest() + "\n" + "getTook : " + response.getTook() + "\n" + "isTerminatedEarly : " + response.isTerminatedEarly() + "\n" + "isTimedOut : " + response.isTimedOut() + "\n" + "remoteAddress : " + response.remoteAddress() + "\n" + "status : " + response.status() + "\n" + "getHits : " + response.getHits() ); } /** * 输出结果SearchResponse * @param response */ public static void println(SearchHit searchHit){ System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"); System.err.println( "docId : " + searchHit.docId() + "\n" + "getId : " + searchHit.getId() + "\n" + "getIndex : " + searchHit.getIndex()+ "\n" + "getScore : " + searchHit.getScore() + "\n" + "getSourceAsString : " + searchHit.getSourceAsString() + "\n" + "getType : " + searchHit.getType() + "\n" + "getVersion : " + searchHit.getVersion() + "\n" + "fieldsOrNull : " + searchHit.fieldsOrNull() + "\n" + "getExplanation : " + searchHit.getExplanation() + "\n" + "getFields : " + searchHit.getFields() + "\n" + "highlightFields : " + searchHit.highlightFields() + "\n" + "hasSource : " + searchHit.hasSource() ); }}
二、DSL搜索
DSL就是实现类似schema发出的请求一样的,这方面的介绍主要是在https://www.elastic.co/guide/en/elasticsearch/reference/5.5/getting-started.html和http://www.yiibai.com/elasticsearch/elasticsearch_index_apis.html这两个地方,但是由于这里面的API是真的多,这里就介绍一部分,还有很多东西,可以有需要的时候去官网https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-query-dsl.html看看。
package test;import static org.elasticsearch.index.query.QueryBuilders.*;import java.net.InetAddress;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.transport.client.PreBuiltTransportClient;@SuppressWarnings({"resource","deprecation"})public class testDSL { static TransportClient client;//https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-query-dsl.html public static void main(String[] args) throws Exception { client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));// _matchAllQuery(); /** * 从这往下是全文检索的 */// _matchQuery();// _multiMatchQuery();// _commonTermsQuery();// _queryStringQuery();// _simpleQueryStringQuery(); /** * 从这往下主要运营与数字、日期、枚举等类型的检索 */// _termQuery();// _termsQuery();// _rangeQuery();// _existsQuery();// _prefixQuery();// _wildcardQuery();// _fuzzyQuery();// _typeQuery(); _idsQuery(); } /** * 方法一:获取所有 * @throws Exception */ public static void _matchAllQuery() throws Exception{ QueryBuilder qb = matchAllQuery(); dealQueryBuilder(qb); } /** * 方法二:指定单查询条件 * @throws Exception */ public static void _matchQuery() throws Exception{ QueryBuilder qb = matchQuery( "user" , "kimchy" ); dealQueryBuilder(qb); } /** * 方法三:指定多查询条件 * @throws Exception */ public static void _multiMatchQuery() throws Exception{ QueryBuilder qb = multiMatchQuery( "kimchy elasticsearch", "user", "message" ); dealQueryBuilder(qb); } /** * 方法四:感觉和方法二_matchQuery一样,不知道差别 * @throws Exception */ public static void _commonTermsQuery() throws Exception{ QueryBuilder qb = commonTermsQuery("user", "kimchy"); dealQueryBuilder(qb); } /** * 方法五:+包含 -除外,但是这个查询没有结果,很奇怪 * @throws Exception */ public static void _queryStringQuery() throws Exception{ QueryBuilder qb = queryStringQuery("+kimchy -elasticsearch"); dealQueryBuilder(qb); } /** * 方法六:+包含 -除外 * @throws Exception */ public static void _simpleQueryStringQuery() throws Exception{ QueryBuilder qb = simpleQueryStringQuery("+kimchy -elasticsearch"); dealQueryBuilder(qb); }//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- /** * 方法七_:termQuery * @throws Exception */ public static void _termQuery() throws Exception{ QueryBuilder qb = termQuery( "user", "kimchy" ); dealQueryBuilder(qb); } /** * 方法八:_termsQuery * @throws Exception */ public static void _termsQuery() throws Exception{ QueryBuilder qb = termsQuery("tags", "blue", "pill"); dealQueryBuilder(qb); } /** * 方法九:_rangeQuery * @throws Exception */ public static void _rangeQuery() throws Exception{ QueryBuilder qb = rangeQuery("price") .from(5) .to(10) .includeLower(true) .includeUpper(false); // A simplified form using gte, gt, lt or lte QueryBuilder _qb = rangeQuery("age") .gte("10") .lt("20"); dealQueryBuilder(qb); } /** * 方法十:_existsQuery * 匹配含有user字段的记录 * @throws Exception */ public static void _existsQuery() throws Exception{ QueryBuilder qb = existsQuery("user"); dealQueryBuilder(qb); } /** * 方法十一:_prefixQuery * 匹配user中前缀为fds的记录 * @throws Exception */ public static void _prefixQuery() throws Exception{ QueryBuilder qb = prefixQuery( "user", "fds" ); dealQueryBuilder(qb); } /** * 方法十二:_wildcardQuery * 通配符 * @throws Exception */ public static void _wildcardQuery() throws Exception{ QueryBuilder qb = wildcardQuery("user", "k?mc*"); dealQueryBuilder(qb); } /** * 方法十三:_fuzzyQuery * @throws Exception */ public static void _fuzzyQuery() throws Exception{ QueryBuilder qb = fuzzyQuery( "user", "kimzhy" ); dealQueryBuilder(qb); } /** * 方法十四:_typeQuery * @throws Exception */ public static void _typeQuery() throws Exception{ QueryBuilder qb = typeQuery("movie"); dealQueryBuilder(qb); } /** * 方法十五:_idsQuery * 类型是可选的 * @throws Exception */ public static void _idsQuery() throws Exception{ QueryBuilder qb = idsQuery("movie") .addIds("1", "4", "100"); dealQueryBuilder(qb); } /** * 这部分代码的复用性太高了,抽离出来。 * @param qb */ public static void dealQueryBuilder(QueryBuilder qb){ SearchResponse response = client.prepareSearch("movies").setQuery(qb).get(); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } /** * 输出结果SearchResponse * @param response */ public static void println(SearchHit searchHit){ System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"); System.err.println( "docId : " + searchHit.docId() + "\n" + "getId : " + searchHit.getId() + "\n" + "getIndex : " + searchHit.getIndex()+ "\n" + "getScore : " + searchHit.getScore() + "\n" + "getSourceAsString : " + searchHit.getSourceAsString() + "\n" + "getType : " + searchHit.getType() + "\n" + "getVersion : " + searchHit.getVersion() + "\n" + "fieldsOrNull : " + searchHit.fieldsOrNull() + "\n" + "getExplanation : " + searchHit.getExplanation() + "\n" + "getFields : " + searchHit.getFields() + "\n" + "highlightFields : " + searchHit.highlightFields() + "\n" + "hasSource : " + searchHit.hasSource() ); }}
三、分词、排序、高亮
package test;import java.net.InetAddress;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.transport.TransportClient;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.search.SearchHit;import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;import org.elasticsearch.search.sort.FieldSortBuilder;import org.elasticsearch.search.sort.SortBuilder;import org.elasticsearch.search.sort.SortBuilders;import org.elasticsearch.search.sort.SortOrder;import org.elasticsearch.transport.client.PreBuiltTransportClient;@SuppressWarnings({ "resource", "deprecation" })public class testUtil { public static void main(String[] args) throws Exception {// fenye(); sort();// highlighter(); } /** * 分页 * @throws Exception */ public static void fenye() throws Exception { TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); SearchResponse response = client.prepareSearch("movies") .setQuery(QueryBuilders.matchAllQuery()) .setFrom(10) .setSize(20) .execute().actionGet(); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } /** * 排序 * @throws Exception */ public static void sort() throws Exception { TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); SearchResponse response = client.prepareSearch("movies") .setQuery(QueryBuilders.matchAllQuery()) .addSort("postDate", SortOrder.ASC) .execute().actionGet(); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } /** * 高亮 * @throws Exception */ public static void highlighter() throws Exception{ TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300)); QueryBuilder matchQuery = QueryBuilders.matchQuery("user", "kimchy"); HighlightBuilder hiBuilder=new HighlightBuilder(); hiBuilder.preTags("<h2>"); hiBuilder.postTags("</h2>"); hiBuilder.field("user"); // 搜索数据 SearchResponse response = client.prepareSearch("movies") .setQuery(matchQuery) .highlighter(hiBuilder) .execute().actionGet(); for (SearchHit searchHit : response.getHits()) { println(searchHit); } } /** * 输出结果SearchResponse * @param response */ public static void println(SearchHit searchHit){ System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"); System.err.println( "docId : " + searchHit.docId() + "\n" + "getId : " + searchHit.getId() + "\n" + "getIndex : " + searchHit.getIndex()+ "\n" + "getScore : " + searchHit.getScore() + "\n" + "getSourceAsString : " + searchHit.getSourceAsString() + "\n" + "getType : " + searchHit.getType() + "\n" + "getVersion : " + searchHit.getVersion() + "\n" + "fieldsOrNull : " + searchHit.fieldsOrNull() + "\n" + "getExplanation : " + searchHit.getExplanation() + "\n" + "getFields : " + searchHit.getFields() + "\n" + "highlightFields : " + searchHit.highlightFields() + "\n" + "hasSource : " + searchHit.hasSource() ); }}
源码我放在http://download.csdn.net/detail/q15150676766/9920331这里了,有需要的可以去下载看看
阅读全文
0 0
- ElasticSearch学习笔记(九)Java AP实现搜索,排序,高亮,分页
- ElasticSearch学习笔记(八)Java AP实现增删改查
- Elasticsearch 5.1.1搜索高亮及Java API实现
- Elasticsearch 5.1.1搜索高亮及Java API实现
- Elasticsearch(五)elasticsearch高亮搜索
- ElasticSearch(九)-分布式搜索
- 分布式搜索elasticsearch java API 之 highlighting (对搜索结果的高亮显示)
- ElasticSearch学习笔记(六)分页,排序,指定字段和kibana的安装
- elasticsearch 5.5.0 java操作(新增索引、分页搜索)
- elasticsearch实现搜索拼音然后高亮内容
- elasticsearch JAVA客户端操作---搜索的过滤、分组高亮
- Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储]
- java学习笔记(九)
- Java学习笔记(九)
- Java学习笔记(九)
- Java学习笔记(九)
- java学习笔记(九)
- Java学习笔记(九)
- Lua中的异常处理pcall、xpcall、debug使用实例
- Django创建项目
- JS对Json数据的处理
- gradle Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.crea
- ConnectionResetError: [WinError 10054] 远程主机强迫关闭了
- ElasticSearch学习笔记(九)Java AP实现搜索,排序,高亮,分页
- 华为OJ——查找两个字符串a,b中的最长公共子串
- log4j的用法
- 百度坐标,火星坐标和WGS84之间转换Java代码
- Unity切换场景研究
- 网络编程
- Tomcat 正式环境下多个Context配置
- yx:Java生成excel
- AVAudioPlayer音频播放