注意:博主在写这篇博客的时候,elasticsearch集群中的vm主节点ip又发生了改变,由原来的192.168.195.130换成了192.168.195.131,咱们换个IP接着讲elasticsearch;
具体情况如下图
elasticsearch数据列过滤restful api以及java代码实现
restful api实现:
Post http://192.168.195.131:9200/film/new/_search/
{ "from": 0, "size": 2, "_source":{ "include":["title","price"] } }
Java代码实现:
/** * 数据列过滤 * @throws Exception */ @Test public void searchInclude()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); 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()); } }
elasticsearch简单条件查询restful api以及java代码实现
restful api实现:
Post http://192.168.195.131:9200/film/new/_search/
{ "query":{ "match":{"title":"战"} } }
Java代码实现:
/** * 条件查询 * @throws Exception */ @Test public void searchByCondition()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); 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()); } }
elasticsearch条件查询高亮实现restful api以及java代码实现
restful api实现:
Post http://192.168.195.131:9200/film/new/_search/
{ "query":{ "match":{"title":"战"} }, "_source":{ "include":["title","price"] }, "highlight":{ "fields":{"title":{}} } }
java代码实现:
/** * 条件查询高亮实现 * @throws Exception */ @Test public void searchHighlight()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); HighlightBuilder highlightBuilder=new HighlightBuilder(); highlightBuilder.preTags("<h2><span style='color:red;'>"); highlightBuilder.postTags("</span></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()); } }
elasticsearch组合多条件查询实现restful api以及java代码实现
实际开发中,基本都是组合多条件查询。
elasticsearch提供bool来实现这种需求;
主要参数:
must
文档 必须 匹配这些条件才能被包含进来。
must_not
文档 必须不 匹配这些条件才能被包含进来。
should
如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
这里多搞几个实例让大伙体验下;
Post http://192.168.195.131:9200/film/new/_search/
案例一:
最简单的 模糊查询内容含有“心”:
{ "query": { "bool": { "must":[ {"match":{"content":"心"}}, {"match":{"title":"上"}} ] } } }
来两个条件,然后就会索引出一条数据
Java代码实现
/** * 多条件查询 * @throws Exception */ @Test public void searchMutil()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); 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()); } }
案例二:
must_not使用,内容里不含有“心”
{ "query": { "bool": { "must_not": { "match": { "content": "心" } }, "must": { "match": { "title": "蜘蛛" } } } } }
一个查询条件查询结果如下
两个查询条件查询结果如下
Java代码实现
/** * 多条件查询 * @throws Exception */ @Test public void searchMutil2()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("title", "蜘蛛"); QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("content", "心"); SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery() .must(queryBuilder) .mustNot(queryBuilder2)) .execute() .actionGet(); SearchHits hits=sr.getHits(); for(SearchHit hit:hits){ System.out.println(hit.getSourceAsString()); } }
案例三:
should使用 提高得分;
前面
{ "query": { "bool": { "must": [ { "match": { "content": "心" } } ] } } }
得分如下
修改条件,得分如下
{ "query": { "bool": { "must": { "match": { "content": "心" } }, "should": [ { "match": { "title": "青云" } }, { "range": { "publishDate": { "gte": "2019-08-01" } } } ] } } }
Java代码实现:
/** * 多条件查询 * @throws Exception */ @Test public void searchMutil3()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("content", "心"); QueryBuilder queryBuilder2=QueryBuilders.matchPhraseQuery("title", "青云"); QueryBuilder queryBuilder3=QueryBuilders.rangeQuery("publishDate").gt("2019-08-01"); SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery() .must(queryBuilder) .should(queryBuilder2) .should(queryBuilder3)) .execute() .actionGet(); SearchHits hits=sr.getHits(); for(SearchHit hit:hits){ System.out.println(hit.getScore()+":"+hit.getSourceAsString()); } }
案例四:
filter过滤;票价必须少于40
{ "query": { "bool": { "must_not": { "match": { "content": "心" } }, "filter": { "range": { "price": { "lte": "40" } } } } } }
执行结果:
Java代码实现如下:
/** * 多条件查询 * @throws Exception */ @Test public void searchMutil4()throws Exception{ SearchRequestBuilder srb=client.prepareSearch("film").setTypes("new"); QueryBuilder queryBuilder=QueryBuilders.matchPhraseQuery("content", "心"); QueryBuilder queryBuilder2=QueryBuilders.rangeQuery("price").lte(40); SearchResponse sr=srb.setQuery(QueryBuilders.boolQuery() .mustNot(queryBuilder) .filter(queryBuilder2)) .execute() .actionGet(); SearchHits hits=sr.getHits(); for(SearchHit hit:hits){ System.out.println(hit.getSourceAsString()); } }
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有