博客信息

Elasticsearch多条件查询

发布时间:『 2019-10-15 05:04』  博客类别:索引框架  阅读(971)

注意:博主在写这篇博客的时候,elasticsearch集群中的vm主节点ip又发生了改变,由原来的192.168.195.130换成了192.168.195.131,咱们换个IP接着讲elasticsearch

具体情况如下图

小李飞刀_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"]
  }
}


小李飞刀_elasticsearch

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

 

elasticsearch简单条件查询restful api以及java代码实现

 

restful api实现:

 

Post http://192.168.195.131:9200/film/new/_search/

{
  "query":{
     "match":{"title":"战"}
  }
}


小李飞刀_elasticsearch


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

 

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":{}}
   }
}


小李飞刀_elasticsearch


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

 

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":"上"}}
	  ]
    }
  }
}


小李飞刀_elasticsearch

来两个条件,然后就会索引出一条数据

小李飞刀_elasticsearch

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());
    }
}


小李飞刀_elasticsearch

 

案例二:

must_not使用内容里不含有

{
  "query": {
    "bool": {
      "must_not": {
        "match": {
          "content": "心"
        }
      },
      "must": {
        "match": {
          "title": "蜘蛛"
        }
      }
    }
  }
}

 

一个查询条件查询结果如下

小李飞刀_elasticsearch

 

两个查询条件查询结果如下

小李飞刀_elasticsearch

 

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());
    }
}


小李飞刀_elasticsearch

 

案例三:

should使用 提高得分;

 

前面

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "心"
          }
        }
      ]
    }
  }
}

得分如下

小李飞刀_elasticsearch

修改条件,得分如下

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "content": "心"
        }
      },
      "should": [
        {
          "match": {
            "title": "青云"
          }
        },
        {
          "range": {
            "publishDate": {
              "gte": "2019-08-01"
            }
          }
        }
      ]
    }
  }
}


小李飞刀_elasticsearch


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());
    }
}


小李飞刀_elasticsearch

案例四:

filter过滤;票价必须少于40

{
  "query": {
    "bool": {
      "must_not": {
        "match": {
          "content": "心"
        }
      },
      "filter": {
        "range": {
          "price": {
            "lte": "40"
          }
        }
      }
    }
  }
}

 

执行结果:

小李飞刀_elasticsearch

 

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());
    }
}


小李飞刀_elasticsearch


over......


关键字:     索引框架       elasticsearch       组合查询       高亮显示  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有