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 }