Elasticsearch的Java客户端库QueryBuilders查询方法大全

不是山谷13 2024-06-20 14:35:05 阅读 64

matchAllQuery

使用方法:创建一个查询,匹配所有文档。示例QueryBuilders.matchAllQuery()注意事项:这种查询不加任何条件,会返回索引中的所有文档,可能会影响性能,特别是文档数量很多时。

matchQuery

使用方法:对指定字段执行全文搜索查询。示例QueryBuilders.matchQuery("fieldName", "text to search")注意事项:默认会对文本进行分词处理,然后进行搜索。

multiMatchQuery

使用方法:允许你在多个字段上执行匹配查询。示例QueryBuilders.multiMatchQuery("text to search", "fieldName1", "fieldName2")注意事项:适用于需要在不同字段上搜索相同文本的情况。

termQuery

使用方法:对指定字段执行精确匹配查询。示例QueryBuilders.termQuery("fieldName", "value")注意事项:不会对字段值进行分词。

termsQuery

使用方法:允许指定多个精确值进行匹配查询。示例QueryBuilders.termsQuery("fieldName", "value1", "value2")注意事项:不会对字段值进行分词,适用于字段值完全匹配其中一个查询值的情况。

rangeQuery

使用方法:对指定字段执行范围查询。示例QueryBuilders.rangeQuery("fieldName").from("startValue").to("endValue")注意事项:可以设置范围的起始和结束值,适用于数值、日期等类型的字段。

wildcardQuery

使用方法:执行通配符查询,支持*(任意字符序列)和?(单个字符)。示例QueryBuilders.wildcardQuery("fieldName", "text*")注意事项:可能会影响性能,尤其是通配符在前面时。

fuzzyQuery

使用方法:对指定字段执行模糊查询。示例QueryBuilders.fuzzyQuery("fieldName", "text")注意事项:基于Levenshtein编辑距离进行匹配,可以设置模糊程度。

boolQuery

使用方法:组合多个查询条件,支持must(必须匹配)、should(至少匹配一个)、must_not(不能匹配)和filter(过滤)。示例QueryBuilders.boolQuery().must(QueryBuilders.termQuery("fieldName", "value"))注意事项:是构建复杂查询逻辑的基础,性能比filter更优。

nestedQuery

使用方法:查询嵌套对象。示例QueryBuilders.nestedQuery("path", QueryBuilders.termQuery("path.fieldName", "value"), ScoreMode.Avg)注意事项path是嵌套对象的路径,必须使用nested类型定义嵌套对象字段。

prefixQuery

使用方法:搜索具有指定前缀的文档。示例QueryBuilders.prefixQuery("fieldName", "prefix")注意事项:对性能影响较大,特别是前缀较短时。

regexpQuery

使用方法:使用正则表达式进行查询。示例QueryBuilders.regexpQuery("fieldName", "regexp")注意事项:复杂的正则表达式可能会严重影响性能。

disMaxQuery

使用方法:对子查询的结果做并集,但只用得分最高的那个子查询的得分作为最终得分。示例QueryBuilders.disMaxQuery().add(QueryBuilders.termQuery("fieldName", "value1")).add(QueryBuilders.termQuery("fieldName", "value2"))注意事项:用于处理多个字段上的查询并想要每个字段上的查询独立计分。

matchPhraseQuery

使用方法:搜索与指定短语匹配的文档,考虑短语的完整性和顺序。示例QueryBuilders.matchPhraseQuery("fieldName", "phrase")注意事项:对于精确的短语搜索非常有用。

matchPhrasePrefixQuery

使用方法:类似于matchPhraseQuery,但是对最后一个词允许前缀匹配。示例QueryBuilders.matchPhrasePrefixQuery("fieldName", "phrase prefix")注意事项:适用于自动补全或容错的场景。

geoDistanceQuery

使用方法:根据地理位置和指定距离搜索文档。示例QueryBuilders.geoDistanceQuery("location").point(lat, lon).distance("12km")注意事项:确保字段正确映射为地理位置类型。

geoBoundingBoxQuery

使用方法:在指定的地理坐标范围内搜索文档。示例QueryBuilders.geoBoundingBoxQuery("location").setCorners(northLat, westLon, southLat, eastLon)注意事项:用于地理位置范围搜索。

geoPolygonQuery

使用方法:在指定的多边形内搜索文档。示例QueryBuilders.geoPolygonQuery("location", Arrays.asList(new GeoPoint(lat1, lon1), new GeoPoint(lat2, lon2), ...))注意事项:性能可能会随多边形顶点的增加而降低。

existsQuery

使用方法:搜索指定字段有值的文档(不为null或不存在)。示例QueryBuilders.existsQuery("fieldName")注意事项:用于找出指定字段有值的文档。

idsQuery

使用方法:根据文档ID搜索文档。示例QueryBuilders.idsQuery().addIds("1", "2", "3")注意事项:直接通过ID快速检索文档。

queryStringQuery

使用方法:允许用户使用查询语句字符串(支持Lucene查询语法)进行复杂查询。示例QueryBuilders.queryStringQuery("+java -python")注意事项:非常灵活,但需要用户了解查询语法。不当的查询语句可能会影响性能或结果准确性。

simpleQueryStringQuery

使用方法:提供一个更简单、更宽松的查询字符串语法和解析。示例QueryBuilders.simpleQueryStringQuery("java python")注意事项:比queryStringQuery更安全,避免复杂语法导致的错误,但功能也相对受限。

boostingQuery

使用方法:组合两个查询,提升第一个查询的结果,降低第二个查询的结果。示例QueryBuilders.boostingQuery(QueryBuilders.termQuery("field", "value1"), QueryBuilders.termQuery("field", "value2")).negativeBoost(0.2f)注意事项:用于突出重要结果,同时保留其他相关结果。

constantScoreQuery

使用方法:对过滤查询的结果赋予一个常数分数。示例QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("field", "value")).boost(2.0f)注意事项:适用于只关心匹配与否,不关心匹配程度(得分)的场景。

functionScoreQuery

使用方法:允许修改查询得分,通过一系列函数来调整。示例QueryBuilders.functionScoreQuery(QueryBuilders.matchQuery("field", "value"), ScoreFunctionBuilders.weightFactorFunction(2))注意事项:提供了极高的灵活性,可以根据文档的属性计算得分。

scriptQuery

使用方法:使用脚本来指定文档是否匹配。示例QueryBuilders.scriptQuery(new Script("doc['field'].value > 5"))注意事项:灵活但复杂,性能可能受脚本执行效率影响。

geoShapeQuery

使用方法:基于地理形状进行查询。示例QueryBuilders.geoShapeQuery("locationField", ShapeBuilders.newEnvelope(new Coordinate(-30, 50), new Coordinate(30, -50)))注意事项:需要地理形状字段正确映射,用于复杂的地理空间查询。

wildcardQuery

使用方法:允许使用通配符进行模糊匹配。示例QueryBuilders.wildcardQuery("field", "text*")注意事项:可能影响性能,特别是以通配符开始的模式。

regexpQuery

使用方法:基于正则表达式进行查询。示例QueryBuilders.regexpQuery("fieldName", "regexp")注意事项:功能强大但可能影响性能,使用时需要谨慎。

termsLookupQuery

使用方法:使用另一个文档的值作为本次查询的条件。示例QueryBuilders.termsLookupQuery("fieldName", new TermsLookup("index", "id", "path"))注意事项:允许动态从其他文档中获取查询条件,增加查询灵活性。

termQuery

使用方法:查找字段中完全匹配指定值的文档。示例QueryBuilders.termQuery("fieldName", value);注意事项:适用于不需要分词的字段,如枚举、状态码等。

fuzzyQuery

使用方法:基于Levenshtein距离进行模糊匹配,找到与指定值相似的文档。示例QueryBuilders.fuzzyQuery("fieldName", "text")注意事项:可以调整最大编辑距离参数,但过大的距离可能会降低查询性能。

prefixQuery

使用方法:查找字段值具有指定前缀的文档。示例QueryBuilders.prefixQuery("fieldName", "prefix")注意事项:对于大型数据集,前缀过短可能会影响查询性能。

wildcardQuery

使用方法:使用通配符进行查询,*表示任意字符序列,?表示任意单个字符。示例QueryBuilders.wildcardQuery("fieldName", "*pattern?")注意事项:与prefixQuery类似,可能影响性能,谨慎使用特别是在模式的开头使用*?

idsQuery

使用方法:根据文档ID查找文档。示例QueryBuilders.idsQuery().addIds("1", "2", "3")注意事项:快速直接通过ID检索文档,但对于大规模的ID查询,性能可能受影响。

rangeQuery

使用方法:在指定字段上执行范围查询,找出字段值落在指定区间内的文档。示例QueryBuilders.rangeQuery("fieldName").from(start).to(end)注意事项:支持字符串、数字及日期类型,对于日期类型需要确保字段格式正确。

matchQuery

使用方法:在全文字段上执行全文检索。示例QueryBuilders.matchQuery("fieldName", "text to search")注意事项:默认对查询文本进行分词,然后搜索分词结果。

matchPhraseQuery

使用方法:查找与指定短语匹配的文档,考虑词条顺序。示例QueryBuilders.matchPhraseQuery("fieldName", "phrase to match")注意事项:适用于需要精确匹配短语的场景,对于短语中的每个词条,位置必须严格匹配。

matchPhrasePrefixQuery

使用方法:短语前缀查询,与matchPhraseQuery相似,但是对最后一个词允许前缀匹配。示例QueryBuilders.matchPhrasePrefixQuery("fieldName", "phrase prefix")注意事项:适用于自动补全场景,但对于长文本或高频词可能影响性能。

scriptQuery

使用方法:使用脚本条件进行查询。示例QueryBuilders.scriptQuery(new Script("doc['field'].value > 5"))注意事项:灵活但需要注意脚本性能和安全问题,不当的脚本可能导致性能下降或安全风险。

geoDistanceQuery

使用方法:查找位于某个地理位置指定距离内的文档。示例QueryBuilders.geoDistanceQuery("location").point(lat, lon).distance("200km")注意事项:确保使用的字段是geo-point类型。这种查询适合于地理位置搜索场景。

geoBoundingBoxQuery

使用方法:查找位于指定地理矩形框内的文档。示例QueryBuilders.geoBoundingBoxQuery("location").setCorners(topLeft, bottomRight)注意事项:同样需要字段是geo-point类型。这种查询适用于用户指定一个地理区域范围进行搜索。

geoPolygonQuery(已弃用)

使用方法:查找位于指定多边形内的文档。示例QueryBuilders.geoPolygonQuery("location", points)注意事项:由于性能原因,这个查询在较新版本的Elasticsearch中已被弃用。建议使用geo-shape查询代替。

existsQuery

使用方法:查找指定字段有值的文档。示例QueryBuilders.existsQuery("fieldName")注意事项:这个查询用于找出指定字段非空的文档。非常适用于过滤出某个字段一定存在的文档。

idsQuery

使用方法:根据文档ID查找文档。示例QueryBuilders.idsQuery().addIds("1", "2", "3")注意事项:这是一种非常直接的查询方式,通过指定文档ID来快速检索文档。

wrapperQuery

使用方法:使用JSON字符串表示的原生Elasticsearch查询DSL。示例QueryBuilders.wrapperQuery("{\"term\": {\"field\":\"value\"}}")注意事项:允许直接使用JSON格式的查询字符串,这使得可以直接复用Elasticsearch的原生查询DSL进行查询。

matchBoolPrefixQuery

使用方法:创建一个匹配查询,该查询首先将文本分析为词条,然后为每个词条搜索,对于最后一个词条使用前缀匹配。示例QueryBuilders.matchBoolPrefixQuery("fieldName", "text to search")注意事项:这种查询结合了布尔查询和前缀查询的特性,适用于自动补全和搜索建议场景。

typeQuery(已弃用)

使用方法:基于文档类型进行查询。示例QueryBuilders.typeQuery("typeName")注意事项:自Elasticsearch 6.x以后,官方不推荐使用多类型,并在7.x版本中完全移除了类型概念。因此,这个查询在最新版本的Elasticsearch中不再适用。

moreLikeThisQuery

使用方法:查找与给定文本或文档相似的文档。示例QueryBuilders.moreLikeThisQuery(new String[]{"fieldName"}, new String[]{"text"}, null)注意事项:可以基于一段文本、一组文档或二者结合来查找相似文档。适用于实现“查找相似内容”的功能。

regexpQuery

使用方法:使用正则表达式进行查询,以匹配符合正则表达式的文档。示例QueryBuilders.regexpQuery("fieldName", "regexp")注意事项:虽然强大,但复杂的正则表达式可能会影响查询性能。谨慎使用。

spanTermQuery

使用方法:创建一个span查询,匹配包含指定词条的文档。示例QueryBuilders.spanTermQuery("fieldName", "value")注意事项:Span查询是低级查询,适用于执行复杂的跨度查询,如找到邻近的、有序的词条。

spanNearQuery

使用方法:查找所有与指定的span查询匹配且彼此之间距离满足指定条件的文档。示例QueryBuilders.spanNearQuery(QueryBuilders.spanTermQuery("field", "value1"), 12).addClause(QueryBuilders.spanTermQuery("field", "value2"))注意事项:用于处理词条的位置和顺序敏感的复杂查询。

spanFirstQuery

使用方法:查找所有在文档开头一定范围内匹配指定span查询的文档。示例QueryBuilders.spanFirstQuery(QueryBuilders.spanTermQuery("field", "value"), 3)注意事项:适用于只关心文档开头部分的查询场景。

geoShapeQuery

使用方法:基于地理形状进行查询,查找与指定地理形状相关的文档。示例QueryBuilders.geoShapeQuery("locationField", shapeBuilder)注意事项:需要确保字段被映射为geo_shape类型。这种查询适用于复杂的地理空间搜索。

scriptScoreQuery

使用方法:使用脚本来计算查询的得分。示例QueryBuilders.scriptScoreQuery(QueryBuilders.matchAllQuery(), new Script(ScriptType.INLINE, "painless", "Math.random()", Collections.emptyMap()))注意事项:提供了通过脚本自定义得分逻辑的灵活性,但需要注意脚本的性能和安全性。

percolateQuery(未在前文提及)

使用方法:执行percolate查询,查找与指定文档匹配的查询。示例QueryBuilders.percolateQuery("queryField", docBuilder)注意事项:用于实现反向搜索的场景,即将文档作为查询条件来匹配存储的查询。

hasChildQuery

使用方法:查找与至少一个满足指定查询条件的子文档相关联的父文档。示例QueryBuilders.hasChildQuery("child_type", QueryBuilders.termQuery("field", "value"), ScoreMode.Avg)注意事项:适用于父子关联数据模型。需要在映射时定义好父子关系。

hasParentQuery

使用方法:查找至少有一个父文档满足指定查询条件的子文档。示例QueryBuilders.hasParentQuery("parent_type", QueryBuilders.termQuery("field", "value"), false)注意事项:与hasChildQuery相对,用于查询子文档基于父文档的条件。

parent_id

使用方法:直接通过父文档的ID来查找子文档。示例QueryBuilders.parentId("parent_type", "parent_id")注意事项:需要在映射时定义好父子关系。

adjacencyMatrixQuery

使用方法:基于多个关联文档间的关系,构建复杂的图查询。示例:通常涉及构建多个查询条件,较为复杂,需要根据具体使用场景构建。注意事项:适用于处理复杂的关系网络,如社交网络分析。

rankFeatureQuery和rankFeaturesQuery

使用方法:利用rank_feature或rank_features字段类型来影响文档的排名。示例QueryBuilders.rankFeatureQuery("feature", ScoreFunction.saturation())注意事项:适用于那些需要根据某些打分特征来排序的搜索场景。

pivotedFeatureQuery(可能在某些Elasticsearch版本中不可用)

使用方法:基于特征值的加权平均来提升或降低文档得分。示例:具体使用取决于Elasticsearch版本和特定需求。注意事项:用于那些需要根据一组特征综合评分来调整排序的场景。

matchNoneQuery

使用方法:不匹配任何文档的查询。示例QueryBuilders.matchNoneQuery()注意事项:这种查询可以在某些需要排除所有文档的特定逻辑中使用。

geoHashCellQuery(在新版本中可能已弃用或改进)

使用方法:基于 geohash 的地理位置查询。示例:这个查询类型在某些版本的 Elasticsearch 中可能不再支持,建议使用其他地理位置查询。注意事项:如果你的 Elasticsearch 版本支持该查询,它可以用于基于 geohash 的快速地理空间搜索。

shapeQuery

使用方法:基于形状的地理空间查询。示例QueryBuilders.geoShapeQuery("fieldName", shapeBuilder)注意事项:类似于 geoShapeQuery,但专注于更复杂的形状匹配,适用于需要高级地理空间分析的场景。

combinedFieldsQuery

使用方法:结合多个字段进行全文搜索查询,提供跨字段的相关性评分。示例QueryBuilders.combinedFieldsQuery("text").field("field1").field("field2")注意事项:适用于当文本可能跨多个字段时的搜索场景,帮助提升相关性评分的准确性。


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。