java的搜索引擎_java中的ElasticSearch搜索引擎介绍。

1 /**

2 * 通过ID获取数据3 *4 *@paramindex 索引,类似数据库5 *@paramtype 类型,类似表6 *@paramid 数据ID7 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)8 *@return

9 */

10 public MapsearchDataById(String index, String type, String id, String fields) {11 GetRequestBuilder getRequestBuilder =client.prepareGet(index, type, id);12 if(StringUtils.isNotEmpty(fields)) {13 getRequestBuilder.setFetchSource(fields.split(","), null);14 }15 GetResponse getResponse =getRequestBuilder.execute().actionGet();16 returngetResponse.getSource();17 }18

19 /**

20 * 使用分词查询21 *22 *@paramindex 索引名称23 *@paramtype 类型名称,可传入多个type逗号分隔24 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)25 *@parammatchStr 过滤条件(xxx=111,aaa=222)26 *@return

27 */

28 public List>searchListData(String index, String type, String fields, String matchStr) {29 return searchListData(index, type, 0, 0, null, fields, null, false, null, matchStr);30 }31

32 /**

33 * 使用分词查询34 *35 *@paramindex 索引名称36 *@paramtype 类型名称,可传入多个type逗号分隔37 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)38 *@paramsortField 排序字段39 *@parammatchPhrase true 使用,短语精准匹配40 *@parammatchStr 过滤条件(xxx=111,aaa=222)41 *@return

42 */

43 public List> searchListData(String index, String type, String fields, String sortField, booleanmatchPhrase, String matchStr) {44 return searchListData(index, type, 0, 0, null, fields, sortField, matchPhrase, null, matchStr);45 }46

47

48 /**

49 * 使用分词查询50 *51 *@paramindex 索引名称52 *@paramtype 类型名称,可传入多个type逗号分隔53 *@paramsize 文档大小限制54 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)55 *@paramsortField 排序字段56 *@parammatchPhrase true 使用,短语精准匹配57 *@paramhighlightField 高亮字段58 *@parammatchStr 过滤条件(xxx=111,aaa=222)59 *@return

60 */

61 public List> searchListData(String index, String type, Integer size, String fields, String sortField, booleanmatchPhrase, String highlightField, String matchStr) {62 return searchListData(index, type, 0, 0, size, fields, sortField, matchPhrase, highlightField, matchStr);63 }64

65

66 /**

67 * 使用分词查询68 *69 *@paramindex 索引名称70 *@paramtype 类型名称,可传入多个type逗号分隔71 *@paramstartTime 开始时间72 *@paramendTime 结束时间73 *@paramsize 文档大小限制74 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)75 *@paramsortField 排序字段76 *@parammatchPhrase true 使用,短语精准匹配77 *@paramhighlightField 高亮字段78 *@parammatchStr 过滤条件(xxx=111,aaa=222)79 *@return

80 */

81 public List> searchListData(String index, String type, long startTime, long endTime, Integer size, String fields, String sortField, booleanmatchPhrase, String highlightField, String matchStr) {82 SearchRequestBuilder searchRequestBuilder =client.prepareSearch(index);83 if(StringUtils.isNotEmpty(type)) {84 searchRequestBuilder.setTypes(type.split(","));85 }86 BoolQueryBuilder boolQuery =QueryBuilders.boolQuery();87

88 if (startTime > 0 && endTime > 0) {89 boolQuery.must(QueryBuilders.rangeQuery("processTime")90 .format("epoch_millis")91 .from(startTime)92 .to(endTime)93 .includeLower(true)94 .includeUpper(true));95 }96

97 //搜索的的字段

98 if(StringUtils.isNotEmpty(matchStr)) {99 for (String s : matchStr.split(",")) {100 String[] ss = s.split("=");101 if (ss.length > 1) {102 if (matchPhrase ==Boolean.TRUE) {103 boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));104 } else{105 boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));106 }107 }108 }109 }110

111 //高亮(xxx=111,aaa=222)

112 if(StringUtils.isNotEmpty(highlightField)) {113 HighlightBuilder highlightBuilder = newHighlightBuilder();114

115 //highlightBuilder.preTags("");//设置前缀116 //highlightBuilder.postTags("");//设置后缀117

118 //设置高亮字段

119 highlightBuilder.field(highlightField);120 searchRequestBuilder.highlighter(highlightBuilder);121 }122

123 searchRequestBuilder.setQuery(boolQuery);124

125 if(StringUtils.isNotEmpty(fields)) {126 searchRequestBuilder.setFetchSource(fields.split(","), null);127 }128 searchRequestBuilder.setFetchSource(true);129

130 if(StringUtils.isNotEmpty(sortField)) {131 searchRequestBuilder.addSort(sortField, SortOrder.DESC);132 }133

134 if (size != null && size > 0) {135 searchRequestBuilder.setSize(size);136 }137

138 //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询139 //logger.info("\n{}", searchRequestBuilder);

140

141 SearchResponse searchResponse =searchRequestBuilder.execute().actionGet();142

143 long totalHits =searchResponse.getHits().totalHits;144 long length =searchResponse.getHits().getHits().length;145

146 //logger.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

147

148 if (searchResponse.status().getStatus() == 200) {149 //解析对象

150 returnsetSearchResponse(searchResponse, highlightField);151 }152 return null;153 }154

155 /**

156 * 使用分词查询,并分页157 *158 *@paramindex 索引名称159 *@paramtype 类型名称,可传入多个type逗号分隔160 *@paramcurrentPage 当前页161 *@parampageSize 每页显示条数162 *@paramstartTime 开始时间163 *@paramendTime 结束时间164 *@paramfields 需要显示的字段,逗号分隔(缺省为全部字段)165 *@paramsortField 排序字段166 *@parammatchPhrase true 使用,短语精准匹配167 *@paramhighlightField 高亮字段168 *@parammatchStr 过滤条件(xxx=111,aaa=222)169 *@return

170 */

171 public EsPage searchDataPage(String index, String type, int currentPage, int pageSize, long startTime, long endTime, String fields, String sortField, booleanmatchPhrase, String highlightField, String matchStr) {172 SearchRequestBuilder searchRequestBuilder =client.prepareSearch(index);173 if(StringUtils.isNotEmpty(type)) {174 searchRequestBuilder.setTypes(type.split(","));175 }176 searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);177

178 //需要显示的字段,逗号分隔(缺省为全部字段)

179 if(StringUtils.isNotEmpty(fields)) {180 searchRequestBuilder.setFetchSource(fields.split(","), null);181 }182

183 //排序字段

184 if(StringUtils.isNotEmpty(sortField)) {185 searchRequestBuilder.addSort(sortField, SortOrder.DESC);186 }187

188 BoolQueryBuilder boolQuery =QueryBuilders.boolQuery();189

190 if (startTime > 0 && endTime > 0) {191 boolQuery.must(QueryBuilders.rangeQuery("@timestamp")192 .format("epoch_millis")193 .from(startTime)194 .to(endTime)195 .includeLower(true)196 .includeUpper(true));197 }198

199 //查询字段

200 if(StringUtils.isNotEmpty(matchStr)) {201 for (String s : matchStr.split(",")) {202 String[] ss = s.split("=");203 if (ss.length > 1) {204 if (matchPhrase ==Boolean.TRUE) {205 boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));206 } else{207 boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));208 }209 }210 }211 }212

213 //高亮(xxx=111,aaa=222)

214 if(StringUtils.isNotEmpty(highlightField)) {215 HighlightBuilder highlightBuilder = newHighlightBuilder();216

217 //highlightBuilder.preTags("");//设置前缀218 //highlightBuilder.postTags("");//设置后缀219

220 //设置高亮字段

221 highlightBuilder.field(highlightField);222 searchRequestBuilder.highlighter(highlightBuilder);223 }224

225 searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());226 searchRequestBuilder.setQuery(boolQuery);227

228 //分页应用

229 searchRequestBuilder.setFrom(currentPage).setSize(pageSize);230

231 //设置是否按查询匹配度排序

232 searchRequestBuilder.setExplain(true);233

234 //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询235 //logger.info("\n{}", searchRequestBuilder);236

237 //执行搜索,返回搜索响应信息

238 SearchResponse searchResponse =searchRequestBuilder.execute().actionGet();239

240 long totalHits =searchResponse.getHits().totalHits;241 long length =searchResponse.getHits().getHits().length;242

243 //logger.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

244

245 if (searchResponse.status().getStatus() == 200) {246 //解析对象

247 List> sourceList =setSearchResponse(searchResponse, highlightField);248

249 return new EsPage(currentPage, pageSize, (int) totalHits, sourceList);250 }251 return null;252 }253

254 /**

255 * 高亮结果集 特殊处理256 *257 *@paramsearchResponse258 *@paramhighlightField259 */

260 private List>setSearchResponse(SearchResponse searchResponse, String highlightField) {261 List> sourceList = new ArrayList>();262 StringBuffer stringBuffer = newStringBuffer();263

264 for(SearchHit searchHit : searchResponse.getHits().getHits()) {265 searchHit.getSource().put("id", searchHit.getId());266

267 if(StringUtils.isNotEmpty(highlightField)) {268

269 System.out.println("遍历 高亮结果集,覆盖 正常结果集" +searchHit.getSource());270 Text[] text =searchHit.getHighlightFields().get(highlightField).getFragments();271

272 if (text != null) {273 for(Text str : text) {274 stringBuffer.append(str.string());275 }276 //遍历 高亮结果集,覆盖 正常结果集

277 searchHit.getSource().put(highlightField, stringBuffer.toString());278 }279 }280 sourceList.add(searchHit.getSource());281 }282 returnsourceList;283 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值