目录

一、业务搜索核心功能

二、高级搜索匹配功能

三、搜索排序功能


elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览众山小的感觉,废话少数,现在开始!

一、业务搜索核心功能

1、返回指定字段

GET /nandao_scenic/_search
{"_source": ["title","city"], "query": {"term": {"city": {"value": "北京市"}}}
}

java 语言

public List<Scenic> getScenicField(String keyword) {SearchRequest searchRequest = new SearchRequest("scenic");//客户端请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建搜索buildersearchSourceBuilder.query(new TermQueryBuilder("city", keyword));//构建querysearchSourceBuilder.fetchSource(new String[]{"title", "city"}, null);//设定希望返回的字段数组//   searchSourceBuilder.from(20);// searchSourceBuilder.size(10);searchRequest.source(searchSourceBuilder);List<Scenic> resultList = new ArrayList<Scenic>();try {SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索return resultList;} catch (Exception e) {e.printStackTrace();}return null;}

2、结果计数

GET /nandao_scenic/_count
{"query": {"term": {"city": {"value": "北京市"}}}
}

java语言

 public long getCityCount() {CountRequest countRequest = new CountRequest("scenic");//客户端count请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建搜索buildersearchSourceBuilder.query(new TermQueryBuilder("city", "北京"));//构建querycountRequest.source(searchSourceBuilder);//设置查询try {CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);//执行countreturn countResponse.getCount();//返回count结果} catch (Exception e) {e.printStackTrace();}return 0;}

3、结果分页

GET /nandao_scenic/_search
{"from": 0,"size": 20, "query": {"term": {"city": {"value": "北京市"}}}
}

设置分页最大值:

PUT /nandao_scenic/_settings
{"index":{"max_result_window":10001}
}

es不适合深度分页,影响性能。

java语言

 public List<Scenic> getScenicField(String keyword) {SearchRequest searchRequest = new SearchRequest("scenic");//客户端请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建搜索buildersearchSourceBuilder.query(new TermQueryBuilder("city", keyword));//构建querysearchSourceBuilder.fetchSource(new String[]{"title", "city"}, null);//设定希望返回的字段数组searchSourceBuilder.from(20);searchSourceBuilder.size(10);searchRequest.source(searchSourceBuilder);List<Scenic> resultList = new ArrayList<Scenic>();try {SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索return resultList;} catch (Exception e) {e.printStackTrace();}return null;}

4、性能分析:开启

GET /nandao_scenic/_search
{"profile": "true", "query": {"term": {"city": {"value": "北京市"}}}
}

5、评分分析

GET /nandao_scenic/_explain/003
{"query": {"term": {"city": {"value": "北京市"}}}
}

二、高级搜索匹配功能

1、查询所有文档

GET /nandao_scenic/_search
{"_source": ["title","city"], "query": {"match_all": {"boost": 2}}
}

java客户端

public void matchAllSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery().boost(2.0f);//新建match_all查询,并设置boost值为2.0searchSourceBuilder.query(matchAllQueryBuilder);searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}public void printResult(SearchRequest searchRequest) {try {SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行搜索SearchHits searchHits = searchResponse.getHits();//获取搜索结果集for (SearchHit searchHit : searchHits) {//遍历搜索结果集String index = searchHit.getIndex();//获取索引名称String id = searchHit.getId();//获取文档_idFloat score = searchHit.getScore();//获取得分String source = searchHit.getSourceAsString();//获取文档内容System.out.println("index=" + index + ",id=" + id + ",score=" + score + ",source=" + source);//打印数据}} catch (Exception e) {e.printStackTrace();}}

2、term 级别查询

2.1、term 查询

GET /nandao_scenic/_search
{"query": {"term": {"city": {"value": "北京市"}}}
}

2.2、terms查询

GET /nandao_scenic/_search
{"query": {"terms": {"city": ["北京市","河南"]}}
}

java客户端

 public void termsSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//创建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.termsQuery("city", "北京", "天津"));//构建terms查询searchRequest.source(searchSourceBuilder);//设置查询请求printResult(searchRequest);//打印搜索结果}

2.3、range查询

GET /nandao_scenic/_search
{"query": {"range": {"price": {"gte":50,"lte":100}}}
}

java语言客户端

 public void rangeSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//创建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构建range查询QueryBuilder queryBuilder = QueryBuilders.rangeQuery("create_time").gte("20220115120000").lte("20220116120000");searchSourceBuilder.query(queryBuilder);searchRequest.source(searchSourceBuilder);//设置查询请求printResult(searchRequest);//打印搜索结果}

2. 4、exists 查询

GET /nandao_scenic/_search
{"query": {"exists": {"field": "tag"}}
}

java语言

  public void existsSearch() {SearchRequest searchRequest = new SearchRequest("scenic");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.existsQuery("tag"));searchRequest.source(searchSourceBuilder);printResult(searchRequest);}

3、布尔类型

3.1、must查询

GET /nandao_scenic/_search
{"query": {"bool": {"must": [{"term": {"city": {"value": "北京市"}}},{"range": {"price": {"gte": 10,"lte": 220}}}]}}
}

java语言

  public void mustSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();TermQueryBuilder termQueryIsReady = QueryBuilders.termQuery("city", "北京");//构建城市term查询RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price").gte(350).lte(400);//构建价格range查询boolQueryBuilder.must(termQueryIsReady).must(rangeQueryBuilder);//进行关系“与”查询searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

3.2、should查询

GET /nandao_scenic/_search
{"query": {"bool": {"should": [{"term": {"city": {"value": "北京市"}}},{"term": {"city": {"value": "北京市"}}}]}}
}

java语言

public void shouldSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();TermQueryBuilder termQueryIsReady = QueryBuilders.termQuery("city", "北京");//构建城市为“北京”的term查询TermQueryBuilder termQueryWritter = QueryBuilders.termQuery("city", "天津");//构建城市为“天津”的term查询boolQueryBuilder.should(termQueryIsReady).should(termQueryWritter);//进行关系“或”查询searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

3.3、must not 查询

GET /nandao_scenic/_search
{"query": {"bool": {"must_not": [{"term": {"city": {"value": "北京市"}}},{"term": {"city": {"value": "河南"}}}]}}
}

java客户端

    public void mustNotSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();TermQueryBuilder termQueryIsReady = QueryBuilders.termQuery("city", "北京");//构建城市为“北京”的term查询TermQueryBuilder termQueryWritter = QueryBuilders.termQuery("city", "天津");//构建城市为“天津”的term查询boolQueryBuilder.mustNot(termQueryIsReady).mustNot(termQueryWritter);//进行关系“必须不”查询searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

3.4、filter 查询

GET /nandao_scenic/_search
{"query": {"bool": {"filter": [{"term": {"city": {"value": "北京市"}}},{"term": {"full": true}}]}}
}

java客户端

public void filterSearch() {SearchRequest searchRequest = new SearchRequest("scenic");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.filter(QueryBuilders.termQuery("city", "北京"));boolQueryBuilder.filter(QueryBuilders.termQuery("full", false));searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);printResult(searchRequest);}

4、Constant Scope 查询

GET /nandao_scenic/_search
{"_source": ["city"], "query": {"constant_score": {"filter": {"match":{"city":"北京市"}}}}
}

java语言

public void constantScoreSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();ConstantScoreQueryBuilder constantScoreQueryBuilder = new ConstantScoreQueryBuilder(QueryBuilders.termQuery("amenities", "停车场"));//构建城市为“北京”的term查询searchSourceBuilder.query(constantScoreQueryBuilder);constantScoreQueryBuilder.boost(2.0f);searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

5、Function score 查询

GET /nandao_scenic/_search
{"_source": ["city"], "query": {"function_score": {"query": {"term": {"city": {"value": "北京市"}}},"functions": [{"random_score": {}}],"score_mode": "sum"}}
}

java语言

public void functionScoreSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//创建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQuery = QueryBuilders.termQuery("city", "北京");//构建term查询ScoreFunctionBuilder<?> scoreFunction = ScoreFunctionBuilders.randomFunction();//构建随机函数//构建function_score查询FunctionScoreQueryBuilder funcQuery = QueryBuilders.functionScoreQuery(termQuery, scoreFunction).boostMode(CombineFunction.SUM);searchSourceBuilder.query(funcQuery);searchRequest.source(searchSourceBuilder);//设置查询请求printResult(searchRequest);//打印搜索结果}

6、全文搜索

6.1、match 查询:只要包含一个字就能搜出来

GET /nandao_scenic/_search
{"_source": ["title"], "query": {"match": {"title": "水山寺"}}
}

java客户端

  public void matchSearch() {SearchRequest searchRequest = new SearchRequest();//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchQuery("title", "山水寺").operator(Operator.AND));//新建match查询,并设置operator值为andsearchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

6.2、multi_match 查询

GET /nandao_scenic/_search
{"_source": ["title","city"], "query": {"multi_match": {"query": "山市","fields": ["city","title"]}}
}

java客户端

 public void multiMatchSearch() {SearchRequest searchRequest = new SearchRequest();//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.multiMatchQuery("山市", "title", "city"));//新建multi_match查询,从"title"和"amenities"字段查询"假日"searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

6.3、multi_phrase 查询

GET /nandao_scenic/_search
{"query": {"match_phrase": {"title": "台山"}}
}

java语言

 public void matchPhraseSearch() {SearchRequest searchRequest = new SearchRequest();//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchPhraseQuery( "title", "台山").slop(2)); searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

7、基于地理位置查询

GET /nandao_scenic/_search
{"_source": ["title","city"],"query": {"geo_distance": {"distance": "5km","location":{"lat":"34.333","lon":"23.56"}}}
}

java 客户端

public void geoDistanceSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//新建geo_distance查询,设置基准点坐标和周边距离searchSourceBuilder.query(QueryBuilders.geoDistanceQuery("location").distance(5, DistanceUnit.KILOMETERS).point(40.026919, 116.47473));searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

多边形:

GET /nandao_scenic/_search
{"query": {"geo_polygon": {"location":{"points":[{"lat":"39.959829","lon":"116.417088"},{"lat":"39.960272","lon":"116.432035"},{"lat":"39.965802","lon":"116.421399"}]}}}
}

java语言

  public void geoPolygonSearch() {SearchRequest searchRequest = new SearchRequest("scenic");//新建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//新建geo_distance查询,设置基准点坐标和周边距离List<GeoPoint> geoPointList = new ArrayList<GeoPoint>();//新建多边形顶点列表//添加多边形顶点geoPointList.add(new GeoPoint(39.959829, 116.417088));geoPointList.add(new GeoPoint(39.960272, 116.432035));geoPointList.add(new GeoPoint(39.965802, 116.421399));searchSourceBuilder.query(QueryBuilders.geoPolygonQuery("location", geoPointList));//新建geo_polygon查询searchRequest.source(searchSourceBuilder);//设置查询printResult(searchRequest);//打印结果}

8、实战场景之一:京东搜索商品,前缀查询

PUT /nandao_scenic_sug
{"mappings": {"properties": {"query_word":{"type": "completion"}}}
}

查询

GET /nandao_scenic_sug/_search
{"suggest": {"scenic_zh_sug": {"prefix":"北京","completion": {"field": "query_word"}}}
}

java语言

 public void suggestSearch() throws IOException {SearchRequest searchRequest = new SearchRequest("nandao_scenic_sug");//创建搜索请求,指定索引名称为scenic_sugSearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建completion类型搜索建议CompletionSuggestionBuilder comSuggest = SuggestBuilders.completionSuggestion("query_word").prefix("北京");SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("scenic_zh_sug", comSuggest);//添加搜索建议,"scenic_zh_sug"为自定义名称searchSourceBuilder.suggest(suggestBuilder);//设置suggest请求searchRequest.source(searchSourceBuilder);//设置查询请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);//进行搜索,获取搜索结果CompletionSuggestion suggestion = response.getSuggest().getSuggestion("scenic_zh_sug");//获取suggest结果System.out.println("sug result:");//遍历suggest结果,并进行打印for (CompletionSuggestion.Entry.Option option : suggestion.getOptions()) {System.out.println("sug:" + option.getText().string());}}

三、搜索排序功能

1、按照普通字段排序

GET /nandao_scenic/_search
{"_source": ["title","city","price"],"query": {"match": {"title": "山"}},"sort": [{"price": {"order": "desc"},"city": {"order": "desc"}}]
}

java客户端

public void commonSort() {SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchQuery("title", "山"));//构建match查询searchRequest.source(searchSourceBuilder);//设置查询请求searchSourceBuilder.sort("price", SortOrder.DESC);//设置按照价格降序searchSourceBuilder.sort("praise", SortOrder.DESC);//设置按照口碑值降序printResult(searchRequest);//打印搜索结果}

2、按照地理位置排序

GET /nandao_scenic/_search
{"_source": ["title","city","location"],"query": {"geo_distance": {"distance": "5km","location":{"lat":"34.333","lon":"23.56"}}},"sort": [{"geo_distance": {"location":{"lat":"34.333","lon":"23.56"},"order": "desc","unit":"km","distance_type":"plane"}}]
}

java客户端

 public void geoDistanceSearchSort() throws IOException {SearchRequest searchRequest = new SearchRequest("nandao_scenic");//创建搜索请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//创建geo_distance查询,搜索距离中心点5公里范围内的酒店searchSourceBuilder.query(QueryBuilders.geoDistanceQuery("location").distance(5, DistanceUnit.KILOMETERS).point(39.915143, 116.4039));//创建geo_distance_sort排序,设定按照与中心点的距离升序排序GeoDistanceSortBuilder geoDistanceSortBuilder = SortBuilders.geoDistanceSort("location", 39.915143, 116.4039).point(39.915143, 116.4039).unit(DistanceUnit.KILOMETERS).order(SortOrder.ASC);searchSourceBuilder.sort(geoDistanceSortBuilder);//设置排序规则searchRequest.source(searchSourceBuilder);//设置查询//开始搜索SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits searchHits = searchResponse.getHits();//获取搜索结果System.out.println("search result distance sort:");//开始遍历搜索结果for (SearchHit searchHit : searchHits) {//得到酒店距离中心点的距离double geoDistance = (double) searchHit.getSortValues()[0];//以Map形式获取文档_source内容Map<String, Object> sourceMap = searchHit.getSourceAsMap();Object title = sourceMap.get("title");Object city = sourceMap.get("city");//打印结果System.out.println("title=" + title + ",city=" + city + ",geoDistance:" + geoDistance);}}

到此,es高级搜索功能分享完毕,大家一定要多多练习,定会很快掌握,下篇我们分享文本搜索相关功能,敬请期待!

elasticsearch高级搜索功能多维度分享相关推荐

  1. Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)

    简介  这篇文章主要介绍了Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)(示例代码)以及相关的经验技巧,文章约21106字,浏览量320,点赞数5,值得参考! ...

  2. 找回淘宝的“高级搜索”功能

    在淘宝找东西的时候遇到一个问题,当需要"包含关键字A但是不包含关键字B"的搜索结果的时候,形如"A-B"的搜索方法似乎无效.然后不知道从什么时候开始,淘宝把自己 ...

  3. gmail 过滤器_如何使用Gmail的高级搜索功能和创建过滤器

    gmail 过滤器 Gmail's a Google product, so of course it has powerful search features. But some of Gmail' ...

  4. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎 如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特点 ...

  5. 百度中的高级搜索功能

    在百度中,右边的"高级"里,可以选择要搜索的内容格式,譬如(PDF,DOC) 发现该功能在搜索论文资料时很管用,特别象台湾的论文,连万方里也没有,在上面却能搜索到.

  6. web页面之搜索、高级搜索功能

    功能概述 web页面开发中,常见根据输入关键字搜索查询信息,如淘宝网.百度等的搜索,同时还附有包含多输入域条件的高级查询,这样的页面效果很常见.下面介绍一下我的开发方法. 页面效果 待补充. 源码构件 ...

  7. 用postman快速学习ElasticSearch的搜索功能

    前言 ElasticSearch(以下简称ES)是一个基于Lucene构建的开源(open-source),分布式(distributed),RESTful,实时(real-time)的搜索与分析(a ...

  8. adobe pdf 高级搜索功能

    为了搜索多个pdf,摘自帮助文档pdfhelp 1. 打开窗口 2.基本查询 简单查询 3.高级查询 如下图 附:布尔目录

  9. 织梦++高级搜索php,织梦多条件筛选功能实现(dede联动搜索) - DeDecms

    织梦多条件筛选功能实现(dede联动搜索) 用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,然后用ajax去post替换掉本来的结果就可以了. 其实筛选的话,主要有两个问题需要解决,一个 ...

最新文章

  1. jstl c:choose、c:when和c:otherwise标签
  2. 破4!《我想进大厂》之Java基础夺命连环16问
  3. 在Aptana下安装Zen coding
  4. __getitem__()
  5. CentOS 7.2 安装教程
  6. 从性能角度选购Adroid智能手机,双核、大屏与游戏的取舍
  7. JZOJ 3786. 【NOI2015模拟8.19】图
  8. 簡單編譯內核 linux kernel gnu
  9. tornado 学习注意事项--00
  10. VB.NET,C#.NET调用Web Service,利用visual studio 的实现方法
  11. 了解一些FMS的基本概念
  12. 解除微信授权的html5网页,微信授权登录网页管理在哪里看?如何取消授权
  13. VOC数据集格式介绍
  14. 搭建asp会议签到系统 第三章 会议签到
  15. mysql设置不用科学记数法,关闭科学记数法MySQL
  16. slf4j报错:SLF4J:Failed to load class org.slf4j.impl.StaticLoggerBinder.Defaulting to no-operat有效解决办法
  17. 三星折叠屏手机爆火,但国内市场已经“不需要”
  18. 如何判断ABAP程序前台还是后台运行[sy-batch]
  19. 车路协同-智慧出行(智慧交通解决方案)
  20. dlg.DoModal();不响应

热门文章

  1. 川土微CA-IF1051 CAN收发器通过AEC-Q100 Grade 1认证
  2. 索尼 a7 IV 和佳能 EOS R6 哪个好
  3. 关于升级win10 右键卡顿的解决方法
  4. Java分离中文姓名姓氏和名字
  5. linux test命令测试标志
  6. 对视频的分辨率大小进行裁剪
  7. 时间序列数据的分段线性表示
  8. 我的电脑开机后桌面上没有图标
  9. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
  10. 教资笔记(综合素质篇)