05、ElasticSearch 实战:Java操作ElasticSearch执行查询

  1 package com.gxy.ESChap01;
  2 
  3 import java.net.InetAddress;
  4 
  5 import org.elasticsearch.action.search.SearchRequestBuilder;
  6 import org.elasticsearch.action.search.SearchResponse;
  7 import org.elasticsearch.client.transport.TransportClient;
  8 import org.elasticsearch.common.settings.Settings;
  9 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 10 import org.elasticsearch.index.query.QueryBuilder;
 11 import org.elasticsearch.index.query.QueryBuilders;
 12 import org.elasticsearch.search.SearchHit;
 13 import org.elasticsearch.search.SearchHits;
 14 import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
 15 import org.elasticsearch.search.sort.SortOrder;
 16 import org.elasticsearch.transport.client.PreBuiltTransportClient;
 17 import org.junit.After;
 18 import org.junit.Before;
 19 import org.junit.Test;
 20 
 21 public class ESQuery {
 22     private static String host="192.168.56.3"; // 服务器地址
 23     private static int port=9300; // 端口
 24     
 25     public static final String CLUSTER_NAME = "my-application"; //集群名称
 26     
 27     private TransportClient client=null;
 28     
 29     private static Settings settings= Settings.builder()
 30             .put("cluster.name",CLUSTER_NAME)
 31             .put("client.transport.sniff", true)
 32             .build();
 33     
 34     //获取客户端
 35     @SuppressWarnings({ "resource", "unchecked" })
 36     @Before
 37     public void getClient() throws Exception {
 38         try {
 39             client = new PreBuiltTransportClient(settings)
 40                     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host),port));
 41         } catch (Exception e) {
 42             // TODO Auto-generated catch block
 43             e.printStackTrace();
 44         }
 45     }
 46     
 47     //关闭客户端
 48     @After
 49     public void close() {
 50         if(client!=null) {
 51             client.close();
 52         }
 53     }
 54     
 55     /**
 56      * 查询所有
 57      */
 58     @Test
 59     public void searchAll() {
 60         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
 61         SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet();//查询所有
 62         SearchHits hits=sr.getHits();
 63         for(SearchHit hit:hits) {
 64             System.out.println(hit.getSourceAsString());
 65         }
 66     }
 67     /**
 68      * 分页查询
 69      */
 70     @Test
 71     public void searchPaging() {
 72         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
 73         SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(2).execute().actionGet();
 74         SearchHits hits=sr.getHits();
 75         for (SearchHit hit : hits) {
 76             System.out.println(hit.getSourceAsString());
 77         }
 78     }
 79     /**
 80      * 排序查询
 81      */
 82     @Test
 83     public void searchOrderBy() {
 84         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
 85         SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery())
 86                 .addSort("publishDate",SortOrder.DESC).execute().actionGet();
 87         SearchHits hits=sr.getHits();
 88         for (SearchHit hit : hits) {
 89             System.out.println(hit.getSourceAsString());
 90         }
 91     }
 92     /**
 93      * 数据列过滤查询
 94      */
 95     @Test
 96     public void searchInclude() {
 97         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
 98         SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery())
 99                 .setFetchSource(new String[] {"title","price"},null)
100                 .execute()
101                 .actionGet();
102         SearchHits hits=sr.getHits();
103         for (SearchHit hit : hits) {
104             System.out.println(hit.getSourceAsString());
105         }
106     }
107     /***
108      * 简单条件查询
109      */
110     @Test
111     public void searchByCondition() {
112         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
113         SearchResponse sr=srb.setQuery(QueryBuilders.matchQuery("title","铁"))
114                 .setFetchSource(new String[] {"title","price"},null)
115                 .execute()
116                 .actionGet();
117         SearchHits hits=sr.getHits();
118         for (SearchHit hit : hits) {
119             System.out.println(hit.getSourceAsString());
120         }
121     }
122     /**
123      * 条件查询高亮实现
124      */
125     @Test
126     public void searchHighlight() {
127         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
128         HighlightBuilder highlightBuilder=new HighlightBuilder();
129         highlightBuilder.preTags("<h2>");
130         highlightBuilder.postTags("</h2>");
131         highlightBuilder.field("title");
132         SearchResponse sr=srb.setQuery(QueryBuilders.matchQuery("title","战"))
133                 .highlighter(highlightBuilder)
134                 .setFetchSource(new String[] {"title","price"},null)
135                 .execute()
136                 .actionGet();
137         SearchHits hits=sr.getHits();
138         for (SearchHit hit : hits) {
139             System.out.println(hit.getSourceAsString());
140             System.out.println(hit.getHighlightFields());
141         }
142     }
143     /**
144      * 多条件查询  must
145      */
146     @Test
147     public void searchMutil() {
148         SearchRequestBuilder srb =client.prepareSearch("film").setTypes("dongzuo");
149         QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
150         QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "星球");
151         SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
152                 .must(queryBuilder)
153                 .must(queryBuilder2))
154                 .execute()
155                 .actionGet();
156         SearchHits hits=sr.getHits();
157         for (SearchHit hit : hits) {
158             System.out.println(hit.getSourceAsString());
159         }
160     }
161     
162     /**
163      * 多条件查询  mustNot
164      */
165     @Test
166     public void searchMutil2() {
167         SearchRequestBuilder srb =client.prepareSearch("film").setTypes("dongzuo");
168         QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
169         QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "武士");
170         SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
171                 .must(queryBuilder)
172                 .mustNot(queryBuilder2))
173                 .execute()
174                 .actionGet();
175         SearchHits hits=sr.getHits();
176         for (SearchHit hit : hits) {
177             System.out.println(hit.getSourceAsString());
178         }
179     }
180     
181     /**
182      * 多条件查询  should提高得分
183      * @throws Exception
184      */
185     @Test
186     public void searchMutil3()throws Exception{
187         SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
188         QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
189         QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "星球");
190         QueryBuilder queryBuilder3=QueryBuilders.rangeQuery("publishDate").gt("2018-01-01");
191         SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
192                 .must(queryBuilder)
193                 .should(queryBuilder2)
194                 .should(queryBuilder3))
195             .execute()
196             .actionGet(); 
197         SearchHits hits=sr.getHits();
198         for(SearchHit hit:hits){
199             System.out.println(hit.getScore()+":"+hit.getSourceAsString());
200         }
201     }
202     /***
203      * 多条件查询 range限制范围
204      */
205     @Test
206     public void searchMutil4() {
207         SearchRequestBuilder srb = client.prepareSearch("film").setTypes("dongzuo");
208         QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
209         QueryBuilder queryBuilder2=QueryBuilders.rangeQuery("price").lte(40);
210         SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
211                 .must(queryBuilder)
212                 .filter(queryBuilder2))
213                 .execute()
214                 .actionGet();
215         SearchHits hits=sr.getHits();
216         for (SearchHit hit : hits) {
217             System.out.println(hit.getSourceAsString());
218         }
219     }
220 }