@RunWith(SpringRunner.class)
@SpringBootTest
public class EsDemoApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 系统索引
*/
private final static String ES_INDEX="content";
/**
* 高亮前缀字符串
*/
private final static String PRE_TAGS = "<em>";
/**
* 高亮后缀字符串
*/
private final static String POST_TAGS = "</em>";
/**
* 查询
* @throws IOException
*/
@org.junit.Test
public void findById() throws IOException {
GetRequest getRequest = new GetRequest(ES_INDEX,"100");
GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
Content content = JSON.parseObject(response.getSourceAsString(),Content.class);
System.out.println(content);
Assert.assertNotNull(content);
}
/**
* 新增或删除
* @throws ParseException
* @throws IOException
*/
@org.junit.Test
public void insertOrUpdateOne() throws ParseException, IOException {
String setDate = DateUtils.localToUTC(new Date());
long times = System.currentTimeMillis();
Content content = new Content(131l,"测试插入索引文档_" + times,"测试插入文档","张三","单元测试向Elasticsearch中插入文档","<p>单元测试向Elasticsearch中插入文档</p>",setDate,1);
IndexRequest request = new IndexRequest(ES_INDEX);
request.id(content.getId().toString());
request.source(JSON.toJSONString(content), XContentType.JSON);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
Assert.assertNotNull(response);
System.out.println(response);
}
/**
* 批量插入
* @throws IOException
* @throws ParseException
*/
@org.junit.Test
public void batchInsert() throws ParseException, IOException {
List<Content> list = new ArrayList<>();
for(long i = 132;i<200;i++){
Content content = new Content( i,"测试插入索引文档_" + i,"测试插入文档","张三" + i,"单元测试向Elasticsearch中插入文档","<p>单元测试向Elasticsearch中插入文档</p>",DateUtils.localToUTC(new Date()),1);
list.add(content);
}
BulkRequest request = new BulkRequest();
list.forEach(item -> request.add(new IndexRequest(ES_INDEX).id(item.getId().toString())
.source(JSON.toJSONString(item), XContentType.JSON)));
BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
Assert.assertNotNull(responses);
System.out.println(responses);
}
/**
* 批量删除
*/
@org.junit.Test
public void deleteBatch() throws IOException {
List<Integer> idList = new ArrayList(){
{
add(196);
add(197);
add(198);
add(199);
}
};
BulkRequest request = new BulkRequest();
idList.forEach(item -> request.add(new DeleteRequest(ES_INDEX,item.toString())));
BulkResponse responses = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(responses);
Assert.assertNotNull(responses);
}
/**
* 搜索
* @throws ParseException
* @throws IOException
* @throws IllegalAccessException
* @throws NoSuchMethodException
* @throws InvocationTargetException
*/
@org.junit.Test
public void search() throws ParseException, IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
/** must完全匹配 **/
/** stat = 1 **/
QueryBuilder queryStatBuilder = QueryBuilders.termQuery("stat",1);
boolQueryBuilder.must().add(queryStatBuilder);
/** id 范围在50到100 **/
QueryBuilder queryIdBuilder = QueryBuilders.rangeQuery("id").from(50).to(100);
boolQueryBuilder.must().add(queryIdBuilder);
/** should应该匹配 **/
/**查找标题、短标题、内容、简介以及作者中包含宜昌的内容**/
QueryBuilder queryTitleBuilder = QueryBuilders.matchQuery("title","宜昌").boost(5.0f);
boolQueryBuilder.should().add(queryTitleBuilder);
QueryBuilder queryShortTitleBuilder = QueryBuilders.matchQuery("shortTitle","宜昌").boost(5.0f);
boolQueryBuilder.should().add(queryShortTitleBuilder);
QueryBuilder queryContentBuilder = QueryBuilders.matchQuery("content","宜昌").boost(3.0f);
boolQueryBuilder.should().add(queryContentBuilder);
QueryBuilder queryDescriptionBuilder = QueryBuilders.matchQuery("description","宜昌").boost(2.0f);
boolQueryBuilder.should().add(queryDescriptionBuilder);
QueryBuilder queryAuthorBuilder = QueryBuilders.matchQuery("author","宜昌").boost(1.0f);
boolQueryBuilder.should().add(queryAuthorBuilder);
/** 设置最小匹配数为2* */
boolQueryBuilder.minimumShouldMatch(2);
/** must_not不能匹配 **/
Date dtStart = DateUtils.parseDate("2019-10-01 00:00:00");
String from = DateUtils.localToUTC(dtStart);
Date dtTo = DateUtils.parseDate("2019-11-28 00:00:00");
String to = DateUtils.localToUTC(dtTo);
QueryBuilder querySetDateBuilder = QueryBuilders.rangeQuery("setdate").from(from).to(to);
boolQueryBuilder.mustNot().add(querySetDateBuilder);
SearchSourceBuilder builder = new SearchSourceBuilder();
/** 设置高亮字段 **/
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightTitle =new HighlightBuilder.Field("title");
highlightBuilder.field(highlightTitle);
HighlightBuilder.Field highlightContent = new HighlightBuilder.Field("content");
highlightBuilder.field(highlightContent);
highlightBuilder.preTags(PRE_TAGS);
highlightBuilder.postTags(POST_TAGS);
builder.from(0)
.size(2)
.query(boolQueryBuilder)
.highlighter(highlightBuilder)
.sort("setdate", SortOrder.DESC);
SearchRequest request = new SearchRequest(ES_INDEX);
request.source(builder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHit[] hits = response.getHits().getHits();
Assert.assertNotNull(response);
System.out.println(response);
for (SearchHit hit : hits) {
Content c = JSON.parseObject(hit.getSourceAsString(),Content.class);
for (HighlightField field : hit.getHighlightFields().values()) {
//给高亮字段重新赋值
PropertyUtils.setProperty(c, field.getName(), concat(field.fragments()));
}
System.out.println(c);
}
}
private String concat(Text[] texts) {
StringBuffer sb = new StringBuffer();
for (Text text : texts) {
sb.append(text.toString());
}
return sb.toString();
}
/**
* 根据条件删除
* @throws IOException
*/
@org.junit.Test
public void deleteByQuery() throws IOException {
QueryBuilder builder = QueryBuilders.termQuery("stat",2);
DeleteByQueryRequest request = new DeleteByQueryRequest(ES_INDEX);
request.setQuery(builder);
//设置批量操作数量,最大为10000
request.setBatchSize(10000);
request.setConflicts("proceed");
BulkByScrollResponse response = restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
Assert.assertNotNull(response);
System.out.println(response);
}
/**
* 精确查询
* @throws IOException
*/
@org.junit.Test
public void termQuery() throws IOException {
String queryTitle = "机关参加第五届全省职工排舞大赛喜获地方团体B组二等奖";
SearchRequest request = new SearchRequest(ES_INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("title.keyword",queryTitle));
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
request.source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
Assert.assertNotNull(response);
if(response.getHits().getHits() != null && response.getHits().getHits().length > 0){
for(SearchHit hit : response.getHits().getHits()){
System.out.println(hit);
}
}
}
/**
* 匹配前缀查询
* @throws IOException
*/
@Test
public void searchPrefix() throws IOException {
String queryTitle = "机关";
SearchRequest request = new SearchRequest(ES_INDEX);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.prefixQuery("title.keyword",queryTitle));
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);
request.source(searchSourceBuilder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
Assert.assertNotNull(response);
if(response.getHits().getHits() != null && response.getHits().getHits().length > 0){
for(SearchHit hit : response.getHits().getHits()){
System.out.println(hit);
}
}
}
}