Elasticsearch Query DSL
Query Content:查询上下文,含query参数,既要确定文档是否匹配,还要计算匹配度多少,即_score字段的相关性得分
Filter Content:过滤上下文,如在bool查询中含filter或must_not参数,只关心文档是否和查询匹配,常用过滤器将由ES自动缓存,以提高性能
1. Trem-level queries:术语级查询
(1) term query:词条查询,用于匹配包含完全相同值的文档,不要查询text字段,因为被分词了,改用match查询即可,与数据库 = 对应,注意:term、match、match_phrase、match_phrase_prefix的区别
A. kibana操作
B. java编写
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("os.name", "Ubuntu");
(2)terms query:多词条查询,精确匹配字段值的一个或多个文档,与term类似,可以支持字符串、数值、日期、布尔、数组及对象等类型
A. kibana操作
B. java编写
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("os.name", "Ubuntu", "CentOS Linux");
C. 数组与对象等复杂数据类型:可以匹配一个文档中该字段包含指定值之一的文档;如数组[1,2,3]可以匹配某个索引字段值为[1,2]或[3]或[1,5]的文档。
(3) wildcard query:通配符查询,返回与通配符模式匹配的文档,?代表匹配任何单个字符,*代表零个或多个字符,通配符不要用在开头,会降低搜索性能,与MySQL中like对应
A. kibana操作
B. java编写
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("os.name", "CentOS*");
(4) prefix query:前缀查询,返回在提供的字段中包含特定前缀的文档
A. kibana操作
B. java编写
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("os.name", "CentOS");
(5) fuzzy query:模糊查询,返回包含与搜索字词相似的字词的文档
A. kibana操作
B. java编写
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("os.name", "OS");
(6) range query:范围查询,返回包含提供范围内的术语的文档,注意日期格式,与MySQL中between and对应
A. kibana操作
B. java编写
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("timestamp").gte("2020-01-09 03:45:01.622").lte("2020-01-09 03:46:01");
(7) ids query:ID查询,根据其ID集返回文档,与MySQL中in对应
A. kibana操作
B. java编写
IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery();
idsQueryBuilder.addIds("MSmnh28BAFJfMDTmjVXf", "Mymnh28BAFJfMDTmjVXf");
(8) exists query:存在某字段的值,与MySQL中is not null对应
注意:字段用作script脚本时,为空会报错;索引不存在时,聚合值为null,所以需要用到这个exists
A. kibana操作
B. java编写
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("group");
2. Compound queries:复合查询
A. Boolean:布尔查询,它是使用一个或多个布尔子句构建的,与文档匹配的查询,这些文档与其他查询的布尔组合查询
must | 根据条件过滤文档,返回的文档必须要满足must子句的条件,会影响相关性算分值,相当于mysq中的and |
must_not | 根据条件过滤文档,返回的文档必须不包含must_not子句的条件,子句在Filter Content中执行,相当于mysql中not |
should | 根据条件过滤文档,返回的文档应该包含should子句的条件,会影响相关性算分值,相当于mysql中的or |
filter | 子句必须包含在匹配的文档中,查询的分数被忽略,子句在Filter Content执行,并且子句被考虑用于上下文 |
3. Full text queries:全文查询
A. Simple query string:简单查询字符串查询,使用有限但容错语法的解析器,根据提供的查询字符串返回文档;
参数含义:
query:要解析并用于搜索的查询字符串;
fields:要搜索的字段数组;
default_operator:用于解释查询字符串中的文本的默认布尔逻辑,有效值有OR(默认值)和AND;
analyze_wildcard:设置为true,则查询尝试分析查询字符串中的通配符术语,默认为false;
analyzer:分析器,用于将查询字符串中的文本转换为标记,如果未映射任何分析器,则使用索引的默认分析器;
QueryBuilders.simpleQueryStringQuery("hao123").field("title")
4. Specialized queries:专用查询
(1)Script:是ES支持的一种专门用于复杂场景下支持自定义编程的强大脚本功能,由于脚本编译比较消耗性能,可以把脚本保存在缓存中。
可参考:ES Query DSL官网地址