elasticsearch查询篇
前言
elasticsearch查询篇
1、准备数据
POST http://192.168.1.111:9200/film/_mapping/dongzuo/
{
“properties”: {
“title”: {
“type”: “text”
},
“publishDate”: {
“type”: “date”
},
“content”: {
“type”: “text”
},
“director”: {
“type”: “keyword”
},
“price”: {
“type”: “float”
}
}
}
title 电影名称 publishDate 发布日期 content 简介 director导演 price 票价
查询所有
/**
* 多条件查询
* @throws Exception
*/
@Test
public void searchMutil()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "战");
QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "星球");
SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery()
.must(queryBuilder)
.must(queryBuilder2))
.execute()
.actionGet();
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
/**
* 条件查询高亮实现
* @throws Exception
*/
@Test
public void searchHighlight()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
HighlightBuilder highlightBuilder=new HighlightBuilder();
highlightBuilder.preTags("<h2>");
highlightBuilder.postTags("</h2>");
highlightBuilder.field("title");
SearchResponse sr=srb.setQuery(QueryBuilders.matchQuery("title", "战"))
.highlighter(highlightBuilder)
.setFetchSource(new String[]{"title","price"}, null)
.execute()
.actionGet(); // 分页排序所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
System.out.println(hit.getHighlightFields());
}
}
/**
* 条件查询
* @throws Exception
*/
@Test
public void searchByCondition()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
SearchResponse sr=srb.setQuery(QueryBuilders.matchQuery("title", "战"))
.setFetchSource(new String[]{"title","price"}, null)
.execute()
.actionGet(); // 分页排序所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
/**
* 数据列过滤
* @throws Exception
*/
@Test
public void searchInclude()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery())
.setFetchSource(new String[]{"title","price"}, null)
.execute()
.actionGet(); // 分页排序所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
/**
* 排序查询
* @throws Exception
*/
@Test
public void searchOrderBy()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery())
.addSort("publishDate", SortOrder.DESC)
.execute()
.actionGet(); // 分页排序所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
/**
* 分页查询
* @throws Exception
*/
@Test
public void searchPaging()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(4).execute().actionGet(); // 查询所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
/**
* 查询所有
* @throws Exception
*/
@Test
public void searchAll()throws Exception{
SearchRequestBuilder srb=client.prepareSearch("film").setTypes("dongzuo");
SearchResponse sr=srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
SearchHits hits=sr.getHits();
for(SearchHit hit:hits){
System.out.println(hit.getSourceAsString());
}
}
原理解说
ES核心就是提高搜索的性能,在传统的数据库中,一个字段存一个值。然而,支持一个字段多个值的最佳数据结构是倒排索引。
注意:需要本文源代码可关注微信号艳辉网 回复关键字‘java136’获取。