首先我们要了解什么是ES?
ES(Elasticsearch)是一个开源的分布式搜索和分析引擎,构建在Apache Lucene之上。它提供了高效、可扩展、实时的全文搜索和分析功能。
Elasticsearch具有以下特点:
- 分布式架构:Elasticsearch可以在多个节点间分布数据,实现水平扩展和高可用性。
- 实时引擎:Elasticsearch可以实时索引和查询数据,使数据变化能够立即反映在搜索结果中。
- 多样的查询功能:Elasticsearch支持全文搜索、词项匹配、范围查询、聚合等多种查询方式,能够满足各种复杂的搜索需求。
- 分布式搜索:Elasticsearch将数据分布在多个分片上,并且可以并行搜索,提高搜索速度。
- 多种数据类型支持:Elasticsearch支持各种数据类型,包括文本、数值、日期、地理信息等,使得可以处理各种类型的数据。
- 可扩展性:Elasticsearch可以通过增加节点来扩展处理能力,并且能够自动进行数据重新分布。
- 插件生态系统:Elasticsearch具有丰富的插件生态系统,可以扩展其功能,如Kibana(数据可视化工具)、Logstash(数据收集和处理工具)等。
通过以上特点,Elasticsearch已经被广泛应用于各种场景,如全文搜索、日志分析、实时监控等。
当我们使用ES进行查询时,构造条件应该如何选择和使用?
我们要先明确需求,根据需求来进行选择
-
查询所有
Querybuilders.matchAllQuery()
-
查询单个
Querybuilders.matchQuery("name","张")
-
查询多个字段匹配某一个值
Querybuilders.multiMatchQuery("红","name","details")
-
模糊匹配
Querybuilders.wildcardQuery("name","张")
有时会涉及到BoolQueryBuilder的复合查询
-
使用must方法构建(多个and使用多个must)
boolQueryBuilder.must(Querybuilders.matchQuery("name","张"));
-
使用should方法构建(多个or使用多个should)
boolQueryBuilder.should(Querybuilders.matchQuery("name","张"));
-
等值查询(不分词进行查询)
boolQueryBuilder.must(Querybuilders.termQuery("name","张三"));
-
范围查询
boolQueryBuilder.must(Querybuilders.rangeQuery("age").get(18).lte(35));
按时间范围查询:
boolQueryBuilder.must(Querybuilders.rangeQuery("time").from(开始时间).to(结束时间));
-
精确查询(依次匹配多个数据)
boolQueryBuilder.must(Querybuilders.termsQuery("id","25","26"));