ElasticSearch關鍵字查詢,將關鍵字分詞后查詢,多個字段,查詢出來字段高亮顯示。
查詢方法如下:
public List<NewsInfo> searcher2(String key, String indexId, String type) {
List<NewsInfo> newsInfos= new ArrayList<NewsInfo>();
try {
// 創建查詢索引,參數productindex表示要查詢的索引庫為productindex
SearchRequestBuilder searchRequestBuilder = client
.prepareSearch(indexId);
// 設置查詢索引類型,setTypes("productType1", "productType2","productType3");
// 用來設定在多個類型中搜索
searchRequestBuilder.setTypes(type);
// 設置查詢類型 1.SearchType.DFS_QUERY_THEN_FETCH = 精確查詢 2.SearchType.SCAN
// = 掃描查詢,無序
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
// 設置查詢關鍵詞
// searchRequestBuilder
// .setQuery(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("title", key))
// .should(QueryBuilders.termQuery("content", key)));
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
queryBuilder.analyzer("ik_smart");
queryBuilder.field("title").field("content");
searchRequestBuilder.setQuery(queryBuilder);
// 分頁應用
searchRequestBuilder.setFrom(1).setSize(3000);
// 設置是否按查詢匹配度排序
searchRequestBuilder.setExplain(true);
// 按照字段排序
searchRequestBuilder.addSort("publish_time", SortOrder.DESC);
// 設置高亮顯示
searchRequestBuilder.addHighlightedField("title");
searchRequestBuilder.addHighlightedField("content");
searchRequestBuilder
.setHighlighterPreTags("<span style=\"color:red\">");
searchRequestBuilder.setHighlighterPostTags("</span>");
// searchRequestBuilder.setHighlighterPreTags("<em>");
// searchRequestBuilder.setHighlighterPostTags("<em>");
// 執行搜索,返回搜索響應信息
SearchResponse response = searchRequestBuilder.execute()
.actionGet();
// 獲取搜索的文檔結果
SearchHits searchHits = response.getHits();
SearchHit[] hits = searchHits.getHits();
// ObjectMapper mapper = new ObjectMapper();
for (int i = 0; i < hits.length; i++) {
SearchHit hit = hits[i];
// 將文檔中的每一個對象轉換json串值
String json = hit.getSourceAsString();
// 將json串值轉換成對應的實體對象
NewsInfo newsInfo = JsonUtils
.readToObject(json, NewsInfo.class);
// 獲取對應的高亮域
Map<String, HighlightField> result = hit.highlightFields();
// 從設定的高亮域中取得指定域
HighlightField titleField = result.get("title");
if (titleField !=null) {
// 取得定義的高亮標簽
Text[] titleTexts = titleField.fragments();
// 為title串值增加自定義的高亮標簽
String title = "";
for (Text text : titleTexts) {
title += text;
}
newsInfo.setTitle(title);
}
// 從設定的高亮域中取得指定域
HighlightField contentField = result.get("content");
if (contentField !=null) {
// 取得定義的高亮標簽
Text[] contentTexts = contentField.fragments();
// 為title串值增加自定義的高亮標簽
String content = "";
for (Text text : contentTexts) {
content += text;
}
// 將追加了高亮標簽的串值重新填充到對應的對象
newsInfo.setContent(content);
}
newsInfos.add(newsInfo);
// System.out.println(newsInfo.toString());
// 打印高亮標簽追加完成后的實體對象
}
// 防止出現:遠程主機強迫關閉了一個現有的連接
// Thread.sleep(10000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return newsInfos;
}
多字段查詢方法:
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
queryBuilder.analyzer("ik_smart");
queryBuilder.field("title").field("content");
searchRequestBuilder.setQuery(queryBuilder);