Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)
接上一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总》
说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。
1、ScriptQuery方法
- 用途:它允许用户使用脚本(通常是 Painless 脚本语言)来定义查询逻辑。这种查询方法提供了极大的灵活性,因为脚本可以访问文档中的字段值、进行复杂的计算和逻辑判断,从而实现基于自定义规则的文档筛选。
- 参数说明:
- script:用于指定执行查询的脚本内容。脚本是用 Painless(Elasticsearch 默认的脚本语言)或其他支持的脚本语言编写的一段代码。这个脚本应该返回一个布尔值,用于判断文档是否匹配查询条件。
- lang:用于指定脚本的语言。默认情况下,如果不指定,Elasticsearch 会使用 Painless 脚本语言。
- 示例代码:
- 要查询文章标题包含特定关键词且文章评分大于某个动态计算的阈值(根据文章内容长度来确定)的文章。
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; Script script = Script.of(s -> s.source("doc['article_title'].value.contains('科技') && doc['article_score'].value > doc['article_content'].value.length() * 0.1")); ScriptQuery scriptQuery = ScriptQuery.of(q -> q.script(script)); Query query = scriptQuery._toQuery();
2、CommonTermsQuery方法
- 用途:用于在文本搜索中平衡罕见词(低频词)和常见词(高频词)的重要性。这种查询方式旨在解决在传统的全文搜索(如
match
查询)中,常见词可能会过度影响搜索结果的相关性问题。 - 参数说明:
- query:这是最基本的参数,用于指定搜索的文本内容。它是一个字符串,代表用户输入的查询语句。这个字符串会被 Elasticsearch 的分析器处理,分解为一个个的词项,然后根据词频来进一步确定这些词项是高频词还是低频词。
- cutoffFrequency:用于划分高频词和低频词的界限。它是一个浮点数,表示一个词项在索引文档集合中出现的频率阈值。词项的文档频率低于这个阈值的被视为低频词,高于这个阈值的被视为高频词。默认情况下,Elasticsearch 会根据索引的统计信息自动计算一个合适的值,但用户也可以根据具体情况进行调整。
- lowFreqOperator:用于指定低频词的匹配逻辑。它可以取值为
Operator.AND
或者Operator.Or
。当设置为Operator.And
时,文档必须包含查询中的所有低频词才被视为匹配;当设置为Operator.Or
时,只要文档包含查询中的任意一个低频词就被视为匹配。这个参数可以根据搜索的严格程度和用户需求来调整低频词的匹配条件。 - highFreqOperator:类似于
lowFreqOperator
,但用于控制高频词的匹配逻辑。同样可以取值为Operator.And
或者Operator.Or
。 - boost:用于调整整个查询的权重。它是一个浮点数,大于 1 的值会提升查询的重要性,使得包含匹配词项的文档在搜索结果中的排名更靠前;小于 1 的值会降低查询的重要性。这个参数在与其他查询组合或者需要调整搜索结果排序时非常有用。
- 示例代码:
- 当搜索 “机器学习模型训练” 相关文档,并且希望文档必须包含所有低频词时。
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; CommonTermsQuery commonTermsQuery = CommonTermsQuery.of(q -> q.query("机器学习模型训练").lowFreqOperator(Operator.And)); Query query = commonTermsQuery._toQuery();
3、WrapperQuery方法
- 用途:将原生 Lucene 查询包装为 Elasticsearch 可执行的查询对象。通过将 Lucene 查询以字符串或字节数组形式传入,Elasticsearch 会在底层将其解析为 Lucene 可执行的查询,然后在索引数据上执行该查询操作,以获取匹配的文档结果。
- 参数说明:
- query:用于指定可执行查询的语句。为一个字符串,生成可执行DSL语句时,需要传入Base64编码后的字符串。
- 示例代码:
- 生成一个match查询的dsl语句。
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; String source = "{\"match\":{\"id\":\"222\"}}"; WrapperQuery.Builder builder = new WrapperQuery.Builder(); // base64串 String value = Base64.getEncoder().encodeToString(source.getBytes(StandardCharsets.UTF_8)); builder.query(value); Query query = builder.build()._toQuery(); //结果: {"from":0,"query":{"wrapper":{"query":"eyJtYXRjaCI6eyJpZCI6IjIyMiJ9fQ=="}},"size":10}
4、CombinedFieldsQuery方法
- 用途:即
combined_fields
查询,是一种多字段查询类型,用于在多个字段上进行组合查询。- 多字段模糊搜索:在实际应用中,用户可能不确定目标信息具体在哪个字段,通过
CombinedFieldsQuery
可以在多个可能的字段中进行模糊搜索,如在一个包含商品信息的索引中,同时在商品名称、描述、标签等字段中搜索用户输入的关键词,提高找到相关商品的概率。 - 提升搜索结果相关性:通过对多个字段的综合考量和权重设置,能够更精准地评估文档与查询的相关性,将最相关的文档排在前面,提升用户获取有效信息的效率,改善搜索体验。
- 多字段模糊搜索:在实际应用中,用户可能不确定目标信息具体在哪个字段,通过
- 参数说明:
- query:用于指定要在多个字段中搜索的内容,可以是单个关键词、短语,也可以是复杂的查询语句,如使用通配符
*
、?
进行模糊查询,或使用~
进行模糊匹配等。 - fields:是一个字符串数组,用于指定要进行组合查询的字段列表。例如
["field1", "field2", "field3"]
。 - operator:用于指定多个字段之间的逻辑组合关系,默认为
or
,即只要文档在其中一个指定字段中匹配成功,就认为该文档符合查询条件。若设置为and
,则要求文档必须在所有指定字段中都匹配成功才符合查询条件。 - tie_breaker:当多个文档在不同字段上的匹配程度相近时,用于调整文档的得分。它是一个浮点数,取值范围在 0 到 1 之间。默认值为 0,表示不进行额外的得分调整;如果设置为一个非零值,例如 0.3,则会在计算文档得分时,将匹配多个字段的文档的得分适当提高,以使其在搜索结果中更靠前。
- minimum_should_match:用于指定至少需要在多少个字段中匹配成功才能返回该文档。可以是具体数字,如
2
,表示至少在两个字段中匹配成功;也可以是百分比,如50%
,表示至少在指定字段数量的一半字段中匹配成功。
- query:用于指定要在多个字段中搜索的内容,可以是单个关键词、短语,也可以是复杂的查询语句,如使用通配符
- 示例代码:
- 要查询产品名称和产品描述字段同时包含“高清”的文档。
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; CombinedFieldsQuery.Builder combinedFields = QueryBuilders.combinedFields(); combinedFields.fields("product_description","product_name"); combinedFields.query("高清"); combinedFields.operator(CombinedFieldsOperator.And); combinedFields.minimumShouldMatch("60%"); Query query = combinedFields.build()._toQuery();
5、HasChildQuery方法
- 用途:用于在父文档和子文档之间进行关联查询的方法。
- 父子文档关联查询:当数据在 Elasticsearch 中以父子文档关系存储时,
HasChildQuery
允许你根据子文档的条件来查找对应的父文档。例如,在一个电商系统中,订单是父文档,订单中的商品是子文档,你可以使用HasChildQuery
通过商品的某些属性(如价格范围、商品类别等)来查询对应的订单。 - 复杂条件筛选父文档:可以基于子文档中的多个字段组合条件来筛选父文档,实现更灵活的查询需求。比如在一个论坛系统中,帖子是父文档,评论是子文档,通过
HasChildQuery
可以查找出包含特定关键词评论的帖子。
- 父子文档关联查询:当数据在 Elasticsearch 中以父子文档关系存储时,
- 参数说明:
- type:用于指定子文档的类型。在 Elasticsearch 中,父子文档在同一个索引中,但子文档有自己特定的类型,通过该参数明确要查询的子文档类型。
- query:用于定义子文档查询条件的查询对象。可以使用 Elasticsearch 提供的各种查询构建器来构建复杂的子文档查询条件,如
termQuery
、rangeQuery
、boolQuery
等。 - score_mode:用于指定如何计算父文档的得分。默认为
none
,即父文档的得分不受子文档的影响;还可以设置为sum
、avg
、max
、min
等,分别表示将子文档的得分进行求和、求平均、取最大值、取最小值后作为父文档的得分。 - innerHits:允许你在查询父文档的同时,获取与父文档匹配的子文档的详细信息。
- min_children和max_children:用于限制子文档的数量范围。min_children指定子文档数量的最小值,max_children` 指定子文档数量的最大值。如果子文档数量不在这个范围内,父文档将不被返回。
- ignore_unmapped:默认为false。如果设置为true`,当查询中涉及的子文档字段不存在或未映射时,将忽略该字段,而不是抛出异常。
- 示例代码:
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; HasChildQuery.Builder hasChild = QueryBuilders.hasChild(); hasChild.type("child_doc_type"); hasChild.query(QueryBuilders.term(t -> t.field("child_field").value("search_term"))); hasChild.scoreMode(ChildScoreMode.Max); hasChild.innerHits(i->i.fields("specific_inner_hits_name").size(5).from(0)); Query query = hasChild.build()._toQuery();
-
6、HasParentQuery方法
- 用途:用于根据父文档条件来查询子文档的查询方法。
- 关联查询子文档:当文档存在父子关系时,通过
HasParentQuery
可以方便地根据父文档的特定条件来查找与之关联的子文档。例如,在一个电商系统中,根据商品分类(父文档)来查询该分类下的具体商品(子文档);或者在论坛系统中,根据文章(父文档)来查找其对应的评论(子文档)等。 - 数据筛选与分析:能够快速筛选出符合父文档条件的子文档集合,便于进行进一步的数据分析和处理,如统计某个父文档下子文档的数量、对匹配的子文档进行聚合操作等。
- 关联查询子文档:当文档存在父子关系时,通过
- 参数说明:
- parentType:指定父文档的类型,用于明确查询所依据的父文档类型,是必选参数。
- query:用于定义父文档需要满足的查询条件,通常使用 Elasticsearch 的查询构建器来构建,如
termQuery
、matchQuery
等。 - score:指示是否将匹配父文档的相关性分数聚合到其子文档中。
- ignore_unmapped:默认为false。当父文档类型在某些子文档索引中不存在映射时,设置为true可以忽略该错误,继续执行查询。
- 示例代码:
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; HasParentQuery.Builder hasParent = QueryBuilders.hasParent(); hasParent.parentType("parent_doc_type"); hasParent.query(QueryBuilders.term(t -> t.field("parent_field").value("search_term"))); hasParent.score(true); hasParent.innerHits(i->i.fields("specific_inner_hits_name").size(5).from(0)); Query query = hasParent.build()._toQuery();
-
7、IdsQuery方法
-
用途:用于根据文档
_id
进行精确匹配查询的方法。- 精准查询:当你确切知道要查询的文档
_id
时,使用IdsQuery
可以快速、精准地获取到对应的文档,而无需进行复杂的全文搜索或条件筛选。 - 批量查询:可以同时传入多个
_id
进行批量查询,一次性获取多个指定文档的详细信息,方便快捷地检索特定的一批数据。
- 精准查询:当你确切知道要查询的文档
-
参数说明
-
values:用于指定要查询的文档
_id
的值,可以是单个_id
字符串,也可以是包含多个_id
字符串的数组或集合。
-
- 代码示例
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; IdsQuery.Builder ids = QueryBuilders.ids(); ids.values("1", "2"); Query query = ids.build()._toQuery();
-
8、TypeQuery方法
-
用途:用于根据文档类型进行查询的方法
-
参数说明
-
value:用于指定要查询的文档类型名称。
-
- 代码示例
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; TypeQuery.Builder type = QueryBuilders.type(); type.value("doc_type"); Query query = type.build()._toQuery();
-
9、GeoShapeQuery方法
-
用途:用于对地理形状数据进行查询的方法,它允许用户根据地理形状之间的空间关系来查找匹配的文档。基于地理空间数据的索引和搜索功能,通过比较查询的地理形状与文档中存储的地理形状之间的关系,如相交、包含、在内部等,来确定是否匹配。利用了 Elasticsearch 的空间索引结构,能够高效地处理地理形状数据的查询,提高查询速度和准确性。
-
参数说明
- field:必选参数,指定文档中存储地理形状数据的字段名。
- shape:必选参数,GeoShapeFieldQuery对象
- shape:定义要查询的地理形状,可以是各种几何形状,如点(Point)、线(LineString)、多边形(Polygon)等,还可以通过坐标数组或 GeoJSON 格式来表示。
- relation:可选参数,指定查询形状与文档中形状的空间关系,默认为
INTERSECTS
,即相交关系。其他可选关系包括WITHIN
(在内部)、CONTAINS
(包含)等。
- 代码示例
-
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders; GeoShapeFieldQuery.Builder geoShapeField = new GeoShapeFieldQuery.Builder();; geoShapeField.shape(JsonData.of("POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))")); geoShapeField.relation(GeoShapeRelation.Within); GeoShapeQuery.Builder geoShape = QueryBuilders.geoShape(); geoShape.field("location_field"); geoShape.shape(geoShapeField.build()); Query query = geoShape.build()._toQuery();
-
后续补充:
IntervalsQuery
ParentIdQuery
PercolateQuery
PinnedQuery
RankFeatureQuery
RuleQuery
ScriptScoreQuery
SemanticQuery
ShapeQuery
SpanContainingQuery
SpanFieldMaskingQuery
SpanFirstQuery
SpanMultiTermQuery
SpanNearQuery
SpanNotQuery
SpanOrQuery
SpanTermQuery
SpanWithinQuery
SparseVectorQuery
TextExpansionQuery
WeightedTokensQuery
GeoPolygonQuery
GeoDistanceQuery
GeoBoundingBoxQuery
FunctionScoreQuery
DistanceFeatureQuery
DisMaxQuery
ConstantScoreQuery
KnnQuery