说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。
1、termQuery 方法
- 用途:用于精确匹配某个字段的完全相等的值。这在查询如文档的 ID、状态码等具有明确取值的字段时非常有用。
- 参数说明:
- field:这是一个字符串参数,用于指定要进行精确匹配查询的字段名称。例如,在一个存储产品信息的索引中,如果要查询产品 ID,这个参数可能是 "product_id"。
- value:这是要与指定字段进行精确匹配的值。它的类型根据字段类型而定。例如,如果查询的是字符串类型的产品 ID,那么这个值就是一个字符串,如 "12345"。
- 示例代码:
- 假设在一个名为 "products" 的索引中查询产品 ID 为 "ABC123" 的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; TermQuery.Builder term = QueryBuilders.term(); term.field("product_id"); term.value("ABC123"); // 生成dsl SearchRequest.Builder searchBuilder = new SearchRequest.Builder(); searchBuilder.query(value); searchBuilder.from(0); searchBuilder.size(10); String dsl = JsonpUtils.toJsonString(searchBuilder.build(), new JacksonJsonpMapper());
2、termsQuery 方法
- 用途:用于查询某个字段匹配多个精确值中的一个,类似于 SQL 中的 IN 操作。可以一次查询某个字段是否匹配给定的多个值中的任意一个。
- 参数说明:
- field:要查询的字段名称,与 termQuery 中的 field 类似,是一个字符串,用于指定字段。
- value:一个可迭代对象(如 List、Set 等),其中包含了多个要匹配的精确值。这些值的类型需要与字段的类型相匹配。
- 示例代码:
- 查询产品状态为 "active" 或 "inactive" 的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; List<FieldValue> fieldValues = Arrays.asList(FieldValue.of("active"), FieldValue.of("inactive")); TermsQueryField termsQueryField = TermsQueryField.of(t -> t.value(fieldValues)); TermsQuery.Builder terms = QueryBuilders.terms(); terms.field("product_status"); terms.terms(termsQueryField); Query query = terms.build()._toQuery();
- 备注:在根据文档主键(_id)进行精确查询时,强烈建议使用IdsQuery。
3、matchQuery 方法
- 用途:进行全文本搜索,它会对查询字符串进行分词处理,然后与索引中的文本字段进行匹配。这是在进行文本内容搜索时最常用的方法之一。
- 参数说明:
- field:要查询的文本字段名称,用于指定在哪个字段中进行全文搜索。
- query:要匹配的文本内容,这个字符串会被分析器进行分词后再与索引中的文档进行匹配。
- zeroTermsQuery:用于查询没有匹配任何文档的查询类型。可以用来定义在这种情况下应该返回什么样的结果。比如,可以配置它返回所有的文档(All),或者返回一个自定义的默认结果集,如最热门的文档或者最新的文档等。默认为None。
- 示例代码:
- 在一个包含文章内容的索引中查询包含 "机器学习算法" 的文章。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MatchQuery.Builder match = QueryBuilders.match(); match.field("article_content"); match.query("机器学习算法"); match.zeroTermsQuery(ZeroTermsQuery.None); Query query = match.build()._toQuery();
4、multiMatchQuery 方法
- 用途:用于在多个字段中进行全文本搜索,当不确定文本在哪个字段中时很有用。可以同时在多个相关的文本字段中查找给定的文本内容。
- 参数说明:
- fields:一个包含多个要查询的文本字段名称的数组。这些字段将同时被用于全文搜索。
- query:要匹配的文本内容,和 matchQuery 中的 query 一样,会被分词后与索引中的文档进行匹配。
- 示例代码:
- 在一个包含产品信息的索引中,查询在产品名称或产品描述中包含 "智能手表" 的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MultiMatchQuery.Builder multiMatch = QueryBuilders.multiMatch(); multiMatch.fields("product_name", "product_description"); multiMatch.query("智能手表"); multiMatch.zeroTermsQuery(ZeroTermsQuery.None); Query query = multiMatch.build()._toQuery();
5、rangeQuery 方法
- 用途:用于查询在某个数值范围或日期范围内的文档,比如查询价格区间、时间区间等。
- 参数说明:
- field:要查询范围的字段名称,用于指定是哪个字段的范围查询。
- gte:范围的起始值(包含),类型根据字段类型而定,对于数值字段是数值类型,对于日期字段是日期类型。
- lte:范围的结束值(包含),同样类型根据字段类型而定。
- gt:范围的起始值(不包含)。
- lt:范围的结束值(不包含)。
- relation:参数为RangeRelation,主要用于在范围查询(
RangeQuery
)中定义范围关系,也就是确定一个值与查询范围之间的关系是怎样的,有三个值:范围内(Within)、包含(Contains)、交叉(Intersects)。
- 示例代码:
- 查询价格在 100 到 200 之间(包含边界值)的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; // 支持Number、Date、Term NumberRangeQuery productPrice = NumberRangeQuery.of(n -> n.field("product_price").gt(100d).lt(200d) ); DateRangeQuery.Builder dateRangeQuery = new DateRangeQuery.Builder(); TermRangeQuery.Builder termRangeQuery = new TermRangeQuery.Builder(); RangeQuery.Builder range = QueryBuilders.range(); range.number(productPrice); range.term(termRangeQuery.build()); range.date(dateRangeQuery.build()); Query query = range.build()._toQuery();
6、existsQuery 方法
- 用途:用于查询某个字段存在的文档,忽略该字段值是什么。这在检查文档是否包含特定字段时很有用。
- 参数说明:
- field:要检查是否存在的字段名称,是一个字符串。
- 示例代码:
- 查询包含评论内容字段(comment_content)的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; ExistsQuery.Builder exists = QueryBuilders.exists(); exists.field("comment_content"); Query query = exists .build()._toQuery();
7、boolQuery 方法
- 用途:用于组合多个查询条件,通过布尔逻辑(must、should、must_not)来构建复杂的查询。这是构建复杂搜索逻辑的关键方法。
- 参数说明:
- must:一个包含多个查询条件的列表,这些条件必须都满足(相当于逻辑与)。列表中的元素是 Query 类型的对象。
- should:一个包含多个查询条件的列表,这些条件满足其中一个或多个即可(相当于逻辑或)。同样,列表中的元素是 Query 类型的对象。
- must_not:一个包含多个查询条件的列表,这些条件都不能满足(相当于逻辑非)。列表中的元素也是 Query 类型的对象。
- filter:filter查询就是用于精确过滤文档,它只关注文档是否符合条件,将匹配的文档包含在结果中。他们都不进行打分、排序或相关性计算,只担心是否匹配。
- 示例代码:
- 查询价格大于 100 且产品名称包含 "智能手机" 或者产品描述包含 "高清屏幕" 的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Query range = QueryBuilders.range(r -> r.number(NumberRangeQuery.of(n -> n.gt(100d)))); Query match = QueryBuilders.match(m -> m.field("product_name").query("智能手机")); Query match2 = QueryBuilders.match(m -> m.field("product_description").query("高清屏幕")); BoolQuery.Builder bool = QueryBuilders.bool(); bool.must(range,QueryBuilders.bool().should(match,match2).build()._toQuery()); Query query = bool.build()._toQuery();
8、fuzzyQuery 方法
- 用途:用于模糊查询,它允许一定程度的拼写错误或近似匹配,基于编辑距离来判断。这在处理用户可能输入错误的查询文本时很有用。
- 参数说明:
- field:要查询的字段名称,用于指定在哪个字段进行模糊查询。
- value:要匹配的近似值,是一个字符串。
- fuzziness:允许的编辑距离,默认是 AUTO,可以是具体的数字(如 2,表示允许两个字符的编辑距离)。
- 示例代码:
- 查询可能拼写有误的产品名称,比如 "shouji"(正确是 "手机")。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Query query = QueryBuilders.fuzzy(f -> f.field("product_name").value("shouji").fuzziness("2"));
9、prefixQuery 方法
- 用途:用于查询某个字段以指定前缀开头的文档。这在搜索以特定字符序列开头的内容时很有用。
- 参数说明:
- field:要查询的字段名称,用于指定字段。
- prefix:要匹配的前缀,是一个字符串。
- 示例代码:
- 查询以 "华为" 开头的产品名称的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Query query = QueryBuilders.prefix(p -> p.field("product_name").value("华为"));
10、wildcardQuery 方法
- 用途:用于通配符查询,支持 *(代表多个字符)和 ?(代表一个字符)。这在处理不确定部分内容的搜索时很有用。
- 参数说明:
- field:要查询的字段名称,用于指定字段。
- value:包含通配符的要匹配的值,是一个字符串。
- 示例代码:
- 查询产品名称包含 "手机" 字样,后面可以跟任意字符的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Query query = QueryBuilders.wildcard(w->w.field("product_name").value("*手机*"));
11、MatchPhraseQuery方法
- 用途:用于进行精确短语匹配的查询方法。它的主要目的是找到文档中包含与查询短语完全相同顺序的词的文本内容。与
match
查询不同,match
查询会对查询词进行分词后分别匹配文档中的词,而MatchPhraseQuery
重点关注短语的完整性和词序。 - 参数说明:
- field:用于指定要在哪个字段中进行短语匹配。
- query:这个参数用于指定要匹配的短语内容,是一个字符串。
- slop:用于指定短语中词的移动 “距离”,也就是允许词与词之间间隔多少个其他词仍然被视为匹配。默认值是 0,表示词必须是连续出现的。
- 示例代码:
- 在
book_summary
字段中查找包含 “深度学习架构” 短语。 -
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Query query = MatchPhraseQuery matchPhraseQuery = MatchPhraseQuery.of(q -> q.field("book_summary").query("深度学习架构"));
- 在
12、NestedQuery方法
- 用途:用于处理嵌套对象(nested object)查询的方法。在 Elasticsearch 中,嵌套对象是指一个对象类型的字段,其内部包含多个子字段,并且这些子字段之间存在关联关系。
- 参数说明:
- query:用于指定在嵌套对象内部进行的查询内容。这个查询可以是任何合法的 Elasticsearch 查询类型,如
term
查询、match
查询等。它定义了如何在嵌套对象的字段中查找匹配的文档。 - path:用于指定嵌套对象在文档中的路径。它是一个字符串,清晰地表明了从文档根节点到嵌套对象的路径。
- scoreMode:用于指定如何计算包含嵌套对象的文档的相关性得分。它有多种取值,如
Avg
(平均)、Max
(最大值)、None
(不计算得分)等。
- query:用于指定在嵌套对象内部进行的查询内容。这个查询可以是任何合法的 Elasticsearch 查询类型,如
- 示例代码:
- 在产品评论中查找包含 “质量很好” 并且评分大于 4 的评论对应的产品的示例。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool(); boolQueryBuilder.must(QueryBuilders.match(m->m.field("reviews.content").query("质量很好"))); boolQueryBuilder.must(QueryBuilders.range(r->r.number(n->n.field("reviews.rating").gt(4d)))); NestedQuery nestedQuery = NestedQuery.of(n -> n.path("reviews").query(boolQueryBuilder.build()._toQuery()).scoreMode(ChildScoreMode.Avg)); Query query = nestedQuery._toQuery();
13、MatchPhrasePrefixQuery
- 用途:用于进行模糊的短语匹配,特别是在短语的最后一个词上允许前缀匹配。它不仅关注短语中词的顺序,还允许最后一个词以给定的前缀开始。
- 参数说明:
- field:用于指定要在哪个字段中进行短语前缀匹配。
- query:这个参数用于指定要匹配的短语内容。它是一个字符串,代表用户期望在指定字段中找到的短语前缀部分。
- maxExpansions:用于限制最后一个词(进行前缀匹配的词)的扩展数量。当进行前缀匹配时,Elasticsearch 会根据索引中的词汇来扩展匹配的词项。这个参数指定了最多扩展多少个词项。
- 示例代码:
- 在
book_title
字段中查找以 “人工智能基础” 开头的书籍。 -
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MatchPhrasePrefixQuery matchPhrasePrefixQuery = MatchPhrasePrefixQuery.of(q -> q.field("book_title").query("人工智能基础")); Query query = matchPhrasePrefixQuery._toQuery();
- 在
14、MatchBoolPrefixQuery
- 用途:用于进行多词模糊前缀匹配的查询方法。它能够对输入的多个词进行分析,每个词都可以被当作一个前缀来匹配文档中的相应字段内容,并且通过布尔逻辑来综合确定最终匹配的文档。这种查询方式在实现灵活的搜索建议、自动补全以及处理用户输入不太精确的搜索词时非常有用,能够扩大搜索范围,找到更多可能相关的文档。
- 参数说明:
- field:用于指定要在哪个字段中进行匹配操作。
- query:该参数用于指定要进行匹配的查询字符串。它是一个字符串,包含了用户输入的一个或多个词(词与词之间可以有空格等分隔),这些词都会被当作前缀去匹配相应字段中的内容。
- analyzer:用于指定分析器,分析器会对
query
参数中的字符串进行分词等预处理操作。如果不指定,Elasticsearch 会使用对应字段默认配置的分析器。 - fuzziness:用于设置模糊匹配的程度,也就是允许词项之间有一定的编辑距离(比如拼写错误、少个字母或多个字母等情况)来进行匹配。
- prefixLength:用于指定词项作为前缀时的最小长度。比如设置为 2,意味着只有长度大于等于 2 的词项部分才会被当作前缀去进行匹配。通过设置这个参数,可以避免一些过短、无意义的前缀匹配,对查询结果的精准性进行一定控制。
- maxExpansions:用于限制每个词项作为前缀进行扩展匹配时的最大扩展数量。
- 示例代码:
- 在产品名称字段中查找与用户不太准确输入的 “智能手 高清屏” 相关产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MatchBoolPrefixQuery matchBoolPrefixQuery = MatchBoolPrefixQuery.of(q -> q.field("product_name").query("智能手 高清屏")); Query query = matchBoolPrefixQuery._toQuery();
15、QueryStringQuery
- 用途:它允许用户使用类似于查询语言的语法在一个或多个字段中进行灵活的文本搜索。这种查询方式可以处理包含逻辑运算符(如 AND、OR、NOT)、通配符(如 *、?)、模糊匹配、字段指定等多种复杂的查询需求,能够根据用户输入的复杂查询字符串进行全面的文本匹配。
- 参数说明:
- fields:用于指定要在哪些字段中进行查询。它可以是一个数组类型的参数,包含多个字段名。
- query:用于接收用户输入的查询字符串。这个字符串可以包含各种查询语法。
- analyzer:用于指定分析器。分析器会对
query
参数中的字符串进行分词、词干提取、停用词处理等操作。如果不指定,Elasticsearch 会使用默认的分析器来处理查询字符串。 - defaultOperator:用于指定逻辑运算符的默认行为。它可以取值为
Operator.And
或者Operator.Or
。 - lenient:是一个布尔值参数,用于指定查询是否宽松。当设置为
true
时,查询在遇到一些数据类型不匹配或者其他轻微错误时,仍然会尝试继续执行查询,而不是直接抛出异常。不过,使用宽松模式可能会导致一些意外的查询结果或者性能问题,需要谨慎使用。
- 示例代码:
- 在书籍标题和摘要中查找包含 “人工智能” 或者 “机器学习” 相关内容。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; QueryStringQuery queryStringQuery = QueryStringQuery.of(q -> q.query("book_title:人工智能 OR book_summary:机器学习")); Query query = queryStringQuery._toQuery();
16、MoreLikeThisQuery
- 用途:用于查找与给定文档或文本相似的其他文档的查询方法。它基于文档内容的相似度来进行搜索,通过分析文档中的词项、词频、字段权重等因素,找到在内容上具有相似性的其他文档。这种查询在推荐系统、相似内容查找等场景中非常有用。
- 参数说明:
- fields:用于指定要比较相似度的字段。这是一个字符串数组参数,其中每个元素是文档中的一个字段名。
- like:这是一个核心参数,用于指定参考的文档或文本内容来查找相似文档。它可以有多种形式,比如可以是一个已经存在于索引中的文档的 ID,或者是一个包含文本内容的字符串等。如果是基于已有文档的 ID,Elasticsearch 会从索引中获取该文档的内容来进行相似度计算;如果是文本内容,就直接使用这个文本内容进行相似度分析。
- minTermFreq:用于设置词项在文档中出现的最小频率。只有频率高于这个值的词项才会被用于相似度计算。
- maxQueryTerms:用于限制用于构建查询的最大词项数量。在相似度计算过程中,会根据参考文档或文本内容提取词项来构建查询,这个参数规定了最多提取多少个词项。通过限制词项数量,可以控制查询的复杂度和性能,避免生成过于复杂的查询。例如,设置为
10
,则最多使用10
个词项来构建查询。例如,设置为2
,则只考虑在文档中出现次数大于等于2
的词项。 - minDocFreq:用于设置词项在索引的文档集合中出现的最小文档频率。只有在足够数量的文档中出现的词项才会被用于相似度计算。例如,设置为
3
,则只考虑在至少3
个文档中出现过的词项。 - boostTerms:用于提升某些词项在相似度计算中的重要性。这是一个布尔值参数,当设置为
true
时,会对用于相似度计算的词项根据它们在文档中的频率进行提升。频率越高的词项,在相似度计算中的权重越高,这样可以使更具代表性的词项对相似度结果产生更大的影响。
- 示例代码:
- 在
book_title
字段中查找以 “人工智能基础” 开头的书籍。 -
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MoreLikeThisQuery moreLikeThisQuery = MoreLikeThisQuery.of(m -> m.fields("article_title", "article_content").like(Like.of(l->l.text("这是一篇参考文章的内容"))).minTermFreq(2).maxQueryTerms(10)); Query query = moreLikeThisQuery._toQuery();
- 在
17、MatchNoneQuery
- 用途:它用于构建一个不匹配任何文档的查询。例如,当你想要模拟一个没有任何结果的搜索场景,或者在构建复杂的筛选逻辑时,需要明确表示某个子条件不应该匹配任何文档,就可以使用
MatchNoneQuery
。 - 示例代码:
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; MatchNoneQuery.Builder matchNone = QueryBuilders.matchNone(); Query query = matchNone.build()._toQuery();
18、RegexpQuery
- 用途:一种基于正则表达式进行文本匹配的查询方法。它允许用户使用正则表达式的语法来定义复杂的文本匹配模式,从而在文档的指定字段中查找符合该模式的内容。这种查询方式提供了高度灵活的文本搜索能力,能够处理各种复杂的文本匹配需求,例如查找具有特定格式的文本、包含特定模式的字符串等。
- 参数说明:
- field:用于指定要在哪个字段中进行正则表达式匹配。
- value:用于指定正则表达式的内容。它是一个字符串,遵循正则表达式的语法规则。
- flags:用于设置正则表达式的标志位,这些标志位可以改变正则表达式的匹配行为。例如,
CASE_INSENSITIVE
标志可以使正则表达式匹配时忽略大小写,MULTILINE
标志可以使^
和$
分别匹配每行的开头和结尾(而不是整个文本的开头和结尾)等。这些标志位可以通过java.util.regex.Pattern
类中定义的常量来指定。
- 示例代码:
- 在书籍标题字段中查找以 “数据” 开头的书籍。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; RegexpQuery regexpQuery = RegexpQuery.of(r -> r.field("book_title").value("^数据.*")); Query query = regexpQuery._toQuery();
19、TermsSetQuery
- 用途:用于在文档的某个字段中查找包含一组特定词项组合的文档。它与简单的
terms
查询不同,terms
查询只要求文档字段匹配一组词项中的任意一个词项即可,而TermsSetQuery
要求文档字段必须包含指定的词项组合,并且可以设置匹配的最小词项数量,提供了更严格的匹配条件,适用于需要精确匹配一组相关词项的场景。 - 参数说明:
- field:用于指定要在哪个字段中进行词项组合匹配。
- terms:用于指定要匹配的词项集合。它是一个包含字符串的列表,代表了需要在指定字段中查找的一组词项。
- minimumShouldMatchField:用于指定一个字段,该字段的值将决定
terms
参数中词项至少需要匹配的数量。这为匹配条件增加了动态性。例如,可以有一个num_required_features
字段,其值表示文档应该匹配的最少特征数量。如果这个字段的值为 2,那么文档的指定字段(由field
参数指定)至少要包含terms
参数中的 2 个词项才能匹配成功。 - minimumShouldMatchScript:用于指定一个脚本,该脚本的返回值将决定
terms
参数中词项至少需要匹配的数量。
- 示例代码:
- 查找产品价格大于 1000 且产品特征至少包含 “高清屏幕” 和 “快速充电” 这两个特征的产品。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; List<String> termsList = Arrays.asList("高清屏幕", "快速充电"); Script script = Script.of(s -> s.source("doc['product_price'].value > 1000? 2 : 1")); TermsSetQuery termsSetQuery = TermsSetQuery.of(t -> t.field("product_features").terms(termsList).minimumShouldMatchScript(script)); Query query = termsSetQuery._toQuery();
20、SimpleQueryStringQuery
- 用途:用于文本搜索的查询方法,它提供了一种比
QueryStringQuery
更简单、更容错的查询方式。它的语法相对简洁,自动处理一些复杂的查询语法细节,并且对用户输入的错误或不规范的查询字符串具有更好的容忍性,适用于实现简单快速的文本搜索功能。 - 参数说明:
- fields:用于指定要在哪些字段中进行查询。它是一个数组类型的参数,包含多个字段名。
- query:用于接收用户输入的查询字符串。这个字符串可以包含关键词、部分短语等简单的文本内容。
- flags:用于控制查询字符串的解析方式,它是一个枚举类型(
SimpleQueryStringFlag
)的参数,可以通过组合多个标志来设置不同的解析规则。例如,AND
标志表示查询字符串中的词项之间默认使用AND
逻辑连接;OR
标志表示默认使用OR
逻辑连接;PHRASE
标志表示将整个查询字符串当作一个短语来处理等。 - analyzer:用于指定分析器。分析器会对
query
参数中的字符串进行分词、词干提取、停用词处理等操作。如果不指定,Elasticsearch 会使用默认的分析器来处理查询字符串。
- 示例代码:
- 在文章标题和内容中查找包含 “机器学习” 相关内容。
-
java">import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; SimpleQueryStringQuery simpleQueryStringQuery = SimpleQueryStringQuery.of(q -> q.query("机器学习").fields("article_title", "article_content")); Query query = simpleQueryStringQuery._toQuery();
下一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)》