注意:博主在写这篇博客的时候,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晓码阁 版权所有