【Java篇】 2.Elasticsearch 查询方式:46 种查询方式解析 [特殊字符]_2 8
Elasticsearch 查询方式:46 种查询方式解析
1️⃣ matchAllQuery(匹配所有文档)
-
适用场景:返回索引中的所有数据。
-
查询方式:不进行任何过滤,返回所有文档。
-
示例:
boolQueryBuilder.must(QueryBuilders.matchAllQuery()); -
特点:
- ✅ 获取所有数据
- ✅ 性能较好
- ❌ 不适用于筛选
📌 使用场景:适用于 获取所有数据(如分页查询、数据统计)。
2️⃣ matchQuery(全文检索)
-
适用场景:用于
text
类型字段,适合模糊匹配(会进行分词)。 -
查询方式:匹配分词后的查询词。
-
示例:
boolQueryBuilder.must(QueryBuilders.matchQuery(\"description\", \"Elasticsearch 高性能\"));
-
特点:
- ✅ 适用于
text
字段 - ✅ 支持分词
- ✅ 适用于全文搜索
- ❌ 不适用于
keyword
类型
- ✅ 适用于
📌 使用场景:适用于 搜索文章内容、产品描述。
3️⃣ commonTermsQuery(优化全文查询)
-
适用场景:用于提高查询精度,降低高频词影响(适用于
text
)。 -
查询方式:高频词的权重较低,提高匹配质量。
-
示例:
boolQueryBuilder.must(QueryBuilders.commonTermsQuery(\"description\", \"Elasticsearch 教程\"));
-
特点:
- ✅ 适用于全文搜索
- ✅ 提高查询精准度
- ❌ 仅适用于
text
类型字段
📌 使用场景:适用于 文章搜索,避免高频词干扰。
4️⃣ multiMatchQuery(多字段匹配)
-
适用场景:用于在多个字段中搜索同一个关键词(适用于
text
)。 -
查询方式:可以同时匹配多个字段,例如标题和描述。
-
示例:
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(\"Elasticsearch\", \"title\", \"description\"));
-
特点:
- ✅ 适用于多个字段搜索
- ✅ 比
matchQuery
更灵活 - ❌ 仅适用于
text
字段
📌 使用场景:适用于 跨字段搜索(如搜索书籍标题和内容)。
5️⃣ matchBoolPrefixQuery(前缀匹配+全文搜索)
-
适用场景:适用于
text
类型字段,支持分词的前缀匹配。 -
查询方式:结合全文搜索和前缀匹配,提高匹配精度。
-
示例:
boolQueryBuilder.must(QueryBuilders.matchBoolPrefixQuery(\"title\", \"elast\"));
-
特点:
- ✅ 支持前缀匹配
- ✅ 支持分词
- ✅ 适用于模糊匹配
- ❌ 不适用于
keyword
类型
📌 使用场景:适用于 搜索文章标题、内容,支持前缀匹配。
6️⃣ matchPhraseQuery(短语匹配)
-
适用场景:用于搜索短语(不会拆分单词)。
-
查询方式:检查查询词的顺序是否与存储数据一致。
-
示例:
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery(\"description\", \"高性能 Elasticsearch\"));
-
特点:
- ✅ 适用于
text
类型字段 - ✅ 支持完整短语匹配
- ✅ 比
matchQuery
更精确 - ❌ 不支持
keyword
类型
- ✅ 适用于
📌 使用场景:适用于 搜索精确短语(如电影名称、书籍标题等)。
7️⃣ matchPhrasePrefixQuery(短语前缀匹配)
-
适用场景:适用于
text
类型字段,支持分词的短语匹配+前缀查询。 -
查询方式:先匹配短语,再匹配前缀,提高查询效率。
-
示例:
boolQueryBuilder.must(QueryBuilders.matchPhrasePrefixQuery(\"title\", \"Elasticsearch 高\"));
-
特点:
- ✅ 结合短语匹配和前缀匹配
- ✅ 适用于
text
类型字段 - ❌ 不适用于
keyword
类型
📌 使用场景:适用于 精准匹配短语并支持前缀查询。
8️⃣ disMaxQuery(分散最大化查询)
-
适用场景:用于多个查询的加权匹配,返回最优结果。
-
查询方式:可以组合多个查询,返回最高评分的结果。
-
示例:
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery() .add(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .add(QueryBuilders.matchQuery(\"description\", \"搜索引擎\")) .boost(1.5f);
-
特点:
- ✅ 综合多个查询结果
- ✅ 评分高的文档优先返回
- ✅ 适用于精准搜索
- ❌ 需要调整
boost
权重
📌 使用场景:适用于 多个字段的加权匹配(如搜索文章标题和描述)。
9️⃣ distanceFeatureQuery(距离特征查询)
-
适用场景:根据时间或地理距离计算文档的评分权重。
-
查询方式:根据字段值与指定参考点的距离计算评分。
-
示例:
boolQueryBuilder.must(QueryBuilders.distanceFeatureQuery(\"publish_date\", \"now\", \"7d\"));
-
特点:
- ✅ 适用于时间或地理距离计算
- ✅ 可以影响搜索结果的评分
- ❌ 仅适用于
date
或geo_point
类型字段
📌 使用场景:适用于 基于时间或距离的排序(如按发布时间排序)。
🔟 idsQuery(按 ID 查询)
-
适用场景:用于查询特定文档 ID。
-
查询方式:根据
_id
字段匹配指定的文档 ID。 -
示例:
boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(\"1\", \"2\", \"3\"));
-
特点:
- ✅ 适用于
_id
字段查询 - ✅ 查询速度快
- ❌ 只能匹配
_id
- ✅ 适用于
📌 使用场景:适用于 查询指定 ID 文档。
1️⃣1️⃣ termQuery(精确匹配)
-
适用场景:用于
keyword
类型字段,适合精确匹配(不会分词)。 -
查询方式:直接匹配存储的完整字段值。
-
示例:
boolQueryBuilder.must(QueryBuilders.termQuery(\"orderno\", \"CTC202505200927114440932\"));
-
特点:
- ✅ 适用于
keyword
类型字段 - ✅ 大小写敏感
- ❌ 不支持模糊查询
- ✅ 适用于
📌 使用场景:适用于 唯一标识符查询(如订单号、用户 ID)。
1️⃣2️⃣ fuzzyQuery(模糊匹配)
-
适用场景:用于
text
类型字段,适合拼写错误或相近词匹配。 -
查询方式:允许一定范围的拼写错误匹配。
-
示例:
boolQueryBuilder.must(QueryBuilders.fuzzyQuery(\"title\", \"Elastisearch\").fuzziness(\"AUTO\"));
-
特点:
- ✅ 适用于模糊匹配
- ✅ 可以自动调整拼写误差范围
- ❌ 查询速度可能稍慢
📌 使用场景:适用于 拼写错误匹配(如用户搜索时输入错误)。
1️⃣3️⃣ prefixQuery(前缀匹配)
-
适用场景:用于
keyword
类型字段,适合匹配字符串前缀。 -
查询方式:匹配字段值的前缀部分。
-
示例:
boolQueryBuilder.must(QueryBuilders.prefixQuery(\"orderno\", \"CTC2025\"));
-
特点:
- ✅ 适用于
keyword
类型字段 - ✅ 比
wildcardQuery
查询速度快 - ❌ 只能匹配前缀
- ✅ 适用于
📌 使用场景:适用于 前缀匹配唯一标识(如订单号、编号)。
1️⃣4️⃣ rangeQuery(范围查询)
-
适用场景:用于数值、日期或其它可比较字段的范围过滤。
-
查询方式:支持
gte
(大于等于)、lte
(小于等于)等。 -
示例:
boolQueryBuilder.must(QueryBuilders.rangeQuery(\"price\").gte(100).lte(500));
-
特点:
- ✅ 适用于数值和时间字段
- ✅ 支持最大值和最小值限制
- ❌ 不适用于
keyword
类型字段
📌 使用场景:适用于 价格筛选、时间范围查询(如订单时间、用户年龄)。
1️⃣5️⃣ wildcardQuery(通配符查询)
-
适用场景:用于
keyword
类型字段,适合模糊匹配。 -
查询方式:支持
*
(匹配任意字符)和?
(匹配单个字符)。 -
示例:
boolQueryBuilder.must(QueryBuilders.wildcardQuery(\"orderno\", \"*14440932*\"));
-
特点:
- ✅ 适用于
keyword
类型字段 - ✅ 支持模糊匹配
- ❌ 性能较差(大数据量时)
- ❌ 查询速度可能很慢
- ✅ 适用于
📌 使用场景:适用于 模糊匹配唯一标识(如订单号)。
1️⃣6️⃣ regexpQuery(正则表达式查询)
-
适用场景:用于
keyword
类型字段,适合复杂匹配规则。 -
查询方式:支持正则表达式,如
.*12345.*
。 -
示例:
boolQueryBuilder.must(QueryBuilders.regexpQuery(\"orderno\", \".*14440932.*\"));
-
特点:
- ✅ 适用于
keyword
类型字段 - ✅ 支持复杂匹配
- ❌ 性能较差
- ❌ 查询速度可能会比
wildcardQuery
更慢
- ✅ 适用于
📌 使用场景:适用于 更复杂的模糊查询(如手机号、订单号的模式匹配)。
1️⃣7️⃣ queryStringQuery(查询字符串解析)
-
适用场景:支持复杂的查询语法,允许 AND、OR、NOT 逻辑运算。
-
查询方式:基于 Lucene 查询语法构建查询。
-
示例:
boolQueryBuilder.must(QueryBuilders.queryStringQuery(\"(title:Elasticsearch OR description:搜索引擎) AND -status:inactive\"));
-
特点:
- ✅ 支持复杂的查询语法
- ✅ 可组合多个查询条件
- ❌ 需要正确书写查询语法,否则可能出错
📌 使用场景:适用于 复杂的搜索场景,需要自定义查询语法。
1️⃣8️⃣ simpleQueryStringQuery(简化的查询字符串查询)
-
适用场景:类似
queryStringQuery
,但语法更简单,不会抛出语法错误。 -
查询方式:支持 AND、OR、NOT 运算,允许部分查询不匹配而不报错。
-
示例:
boolQueryBuilder.must(QueryBuilders.simpleQueryStringQuery(\"Elasticsearch +搜索 -无效\"));
-
特点:
- ✅ 更容错,适用于用户输入查询
- ✅ 可以进行 AND、OR、NOT 运算
- ❌ 语法功能比
queryStringQuery
少
📌 使用场景:适用于 用户自由输入的查询,避免语法错误。
1️⃣9️⃣ boostingQuery(提高特定查询权重)
-
适用场景:增加一个查询的权重,同时降低另一个查询的影响。
-
查询方式:用于调整不同查询的重要性。
-
示例:
QueryBuilders.boostingQuery( QueryBuilders.matchQuery(\"title\", \"Elasticsearch\"), QueryBuilders.matchQuery(\"description\", \"基础教程\")).negativeBoost(0.2f);
-
特点:
- ✅ 提高主查询权重
- ✅ 降低次要查询影响
- ❌ 需要手动调整
boost
📌 使用场景:适用于 精细化控制不同查询的权重。
2️⃣0️⃣ boolQuery(布尔查询)
-
适用场景:用于组合多个查询,支持
must
、should
、must_not
和filter
条件。 -
查询方式:可以嵌套多个查询条件,适用于复杂逻辑查询。
-
示例:
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .mustNot(QueryBuilders.termQuery(\"status\", \"inactive\")) .should(QueryBuilders.rangeQuery(\"price\").gte(100));
-
特点:
- ✅ 支持多个查询组合
- ✅ 支持逻辑运算(AND、OR、NOT)
- ❌ 查询可能较复杂
📌 使用场景:适用于 复杂查询逻辑(如过滤商品、用户搜索等)。
2️⃣1️⃣ spanTermQuery(Span 精确匹配查询)
-
适用场景:用于
text
类型字段,适合精确匹配,但支持Span
查询结构(用于复杂匹配)。 -
查询方式:类似
termQuery
,但可以与其他span
查询组合使用。 -
示例:
SpanQuery spanQuery = QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\");
-
特点:
- ✅ 适用于
text
类型字段 - ✅ 支持
span
语法,可组合查询 - ❌ 不支持
keyword
类型
- ✅ 适用于
📌 使用场景:适用于 精确匹配但需要复杂的 span
查询逻辑。
2️⃣2️⃣ spanNearQuery(Span 近邻匹配查询)
-
适用场景:用于搜索词汇间距在一定范围内的短语。
-
查询方式:可以定义两个词之间的最大间距来查询相邻匹配的短语。
-
示例:
SpanNearQueryBuilder spanQuery = QueryBuilders.spanNearQuery() .addClause(QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\")) .addClause(QueryBuilders.spanTermQuery(\"description\", \"搜索引擎\")) .slop(3) .inOrder(true);
-
特点:
- ✅ 适用于短语近邻匹配
- ✅ 可定义
slop
允许的词间距 - ❌ 不适用于
keyword
类型
📌 使用场景:适用于 搜索相邻词汇,例如“搜索引擎”和“Elasticsearch”。
2️⃣3️⃣ spanNotQuery(Span 排除查询)
-
适用场景:用于排除包含特定短语的文档。
-
查询方式:返回包含
include
查询词,但不包含exclude
查询词的结果。 -
示例:
SpanNotQueryBuilder spanQuery = QueryBuilders.spanNotQuery( QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\"), QueryBuilders.spanTermQuery(\"description\", \"教程\"));
-
特点:
- ✅ 可排除特定短语匹配
- ✅ 适用于
text
类型字段 - ❌ 不能用于
keyword
类型字段
📌 使用场景:适用于 排除特定短语的搜索。
2️⃣4️⃣ spanOrQuery(Span OR 逻辑查询)
-
适用场景:用于多个
span
查询的OR
逻辑匹配。 -
查询方式:如果任意
span
查询条件匹配,则返回结果。 -
示例:
SpanOrQueryBuilder spanQuery = QueryBuilders.spanOrQuery() .addClause(QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\")) .addClause(QueryBuilders.spanTermQuery(\"description\", \"Lucene\"));
-
特点:
- ✅ 适用于
text
类型字段 - ✅ 支持多个
span
逻辑匹配 - ❌ 不适用于
keyword
类型
- ✅ 适用于
📌 使用场景:适用于 多个短语的 OR
逻辑查询。
2️⃣5️⃣ spanWithinQuery(Span 范围内查询)
-
适用场景:用于搜索一个
span
查询完全嵌套在另一个span
查询中的情况。 -
查询方式:返回完全包含在
big
句子中的little
句子的匹配结果。 -
示例:
SpanWithinQueryBuilder spanQuery = QueryBuilders.spanWithinQuery( QueryBuilders.spanNearQuery().addClause(QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\")).slop(5), QueryBuilders.spanTermQuery(\"description\", \"教程\"));
-
特点:
- ✅ 适用于
text
类型字段 - ✅ 适用于包含关系搜索
- ❌ 不能用于
keyword
类型字段
- ✅ 适用于
📌 使用场景:适用于 搜索一个短语完全嵌套在另一个短语中的情况。
2️⃣6️⃣ spanContainingQuery(Span 包含查询)
-
适用场景:类似
spanWithinQuery
,但要求big
句子至少部分包含little
句子。 -
查询方式:返回部分包含
little
句子的big
句子匹配结果。 -
示例:
SpanContainingQueryBuilder spanQuery = QueryBuilders.spanContainingQuery( QueryBuilders.spanTermQuery(\"description\", \"Elasticsearch\"), QueryBuilders.spanTermQuery(\"description\", \"教程\"));
-
特点:
- ✅ 适用于
text
类型字段 - ✅ 可用于部分匹配搜索
- ❌ 不适用于
keyword
类型
- ✅ 适用于
📌 使用场景:适用于 短语部分匹配的查询。
2️⃣7️⃣ spanMultiTermQueryBuilder(Span 多词匹配)
-
适用场景:用于
span
查询中的multi-term
查询,如wildcardQuery
。 -
查询方式:允许
span
查询支持wildcard
和regexp
这样的多词查询方式。 -
示例:
SpanQuery spanQuery = QueryBuilders.spanMultiTermQueryBuilder( QueryBuilders.wildcardQuery(\"description\", \"elastic*\"));
-
特点:
- ✅ 支持
wildcardQuery
和regexpQuery
- ✅ 适用于
text
类型字段 - ❌ 查询复杂度较高
- ✅ 支持
📌 使用场景:适用于 span
** 查询中的模糊匹配搜索**。
2️⃣8️⃣ fieldMaskingSpanQuery(字段掩码 Span 查询)
-
适用场景:用于
span
查询,使multi-term
查询能与span
逻辑兼容。 -
查询方式:允许
multi-term
查询如wildcardQuery
在span
查询环境中使用。 -
示例:
QueryBuilders.fieldMaskingSpanQuery( QueryBuilders.spanTermQuery(\"title\", \"Elasticsearch\"), \"description\");
-
特点:
- ✅ 支持跨字段查询
- ✅ 可用于
span
查询的multi-term
兼容 - ❌ 查询语法较复杂
📌 使用场景:适用于 跨字段 span
查询。
2️⃣9️⃣ constantScoreQuery(常量评分查询)
-
适用场景:用于设置查询的固定评分,忽略 TF/IDF 计算。
-
查询方式:可以确保所有符合查询的文档得分相同。
-
示例:
QueryBuilders.constantScoreQuery(QueryBuilders.termQuery(\"category\", \"electronics\")).boost(2.0f);
-
特点:
- ✅ 设置固定评分,影响排名
- ✅ 适用于
keyword
类型字段 - ❌ 不能用于
text
类型的全文搜索
📌 使用场景:适用于 确保某些查询的权重不变(如特定类别或标签)。
3️⃣0️⃣ functionScoreQuery(函数评分查询)
-
适用场景:基于自定义评分规则调整文档排名(如基于时间、地理位置)。
-
查询方式:支持
decay functions
计算评分。 -
示例:
FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery( QueryBuilders.matchQuery(\"title\", \"Elasticsearch\"), new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{ new FunctionScoreQueryBuilder.FilterFunctionBuilder( QueryBuilders.rangeQuery(\"publish_date\").gte(\"now-7d\"), ScoreFunctionBuilders.exponentialDecayFunction(\"publish_date\", \"now\", \"7d\", 0.5) ) });
-
特点:
- ✅ 适用于排名优化,如时间、地理位置影响排序
- ✅ 可使用数学函数调整评分
- ❌ 需要手动定义评分规则
📌 使用场景:适用于 根据时间、地理位置、评分调整排名。
3️⃣1️⃣ scriptScoreQuery(脚本评分查询)
-
适用场景:使用
Painless
脚本计算文档得分。 -
查询方式:自定义计算公式调整文档排名。
-
示例:
QueryBuilders.scriptScoreQuery( QueryBuilders.matchAllQuery(), new Script(\"doc[\'price\'].value * 0.1\"));
-
特点:
- ✅ 允许自定义评分规则
- ✅ 适用于复杂评分计算
- ❌ 运行开销较高
📌 使用场景:适用于 高级评分调整,如价格、用户行为影响排名。
3️⃣2️⃣ moreLikeThisQuery(相似文档查询)
-
适用场景:用于查找与给定文档类似的其他文档(如推荐系统)。
-
查询方式:基于
TF/IDF
查找类似的文档。 -
示例:
QueryBuilders.moreLikeThisQuery(new String[]{\"description\"}) .like(\"Elasticsearch 是一个强大的搜索引擎\") .minTermFreq(1) .maxQueryTerms(12);
-
特点:
- ✅ 适用于内容推荐或相关文档查找
- ✅ 可设置
minTermFreq
和maxQueryTerms
- ❌ 需要大量索引数据支持
📌 使用场景:适用于 推荐系统,查找相似文章或产品。
3️⃣3️⃣ nestedQuery(嵌套查询)
-
适用场景:用于
nested
类型字段,支持子文档查询。 -
查询方式:允许查询嵌套字段(类似 SQL
JOIN
)。 -
示例:
QueryBuilders.nestedQuery( \"comments\", QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"comments.text\", \"Elasticsearch\")), ScoreMode.Avg);
-
特点:
- ✅ 适用于
nested
类型字段 - ✅ 可以搜索子文档内容
- ❌ 不能直接用于普通
object
类型字段
- ✅ 适用于
📌 使用场景:适用于 查询 JSON 结构中的嵌套对象,如评论、子商品信息。
3️⃣4️⃣ termsQuery(多值匹配查询)
-
适用场景:用于匹配多个精确值(适用于
keyword
类型字段)。 -
查询方式:查询字段值是否属于给定列表。
-
示例:
QueryBuilders.termsQuery(\"category\", \"electronics\", \"fashion\", \"books\");
-
特点:
- ✅ 可以匹配多个值
- ✅ 比
termQuery
更灵活 - ❌ 不支持
text
类型字段
📌 使用场景:适用于 多个值查询(如查询多个类别、多个状态)。
3️⃣5️⃣ wrapperQuery(包装查询)
-
适用场景:用于提供 JSON 格式的查询字符串。
-
查询方式:直接使用 JSON 语法来构建查询。
-
示例:
QueryBuilders.wrapperQuery(\"{\\\"match_all\\\": {}}\");
-
特点:
- ✅ 适用于 JSON 格式查询
- ✅ 适用于自定义查询结构
- ❌ 不支持 `` API 直接构建查询
📌 使用场景:适用于 通过 JSON 直接执行查询。
3️⃣6️⃣ typeQuery(索引类型查询,已废弃)
-
适用场景:用于按索引类型查询(已废弃,从 Elasticsearch 7.x 版本开始)。
-
查询方式:以前用于按
_type
字段匹配数据,现在已不推荐使用。 -
示例:
QueryBuilders.typeQuery(\"product\");
-
特点:
- ❌ 仅适用于旧版本(Elasticsearch 7.x 及以下)
- ❌ 8.x 版本已废弃
- ✅ 适用于历史数据查询
📌 使用场景:仅用于旧版本的索引数据。
3️⃣7️⃣ termsLookupQuery(远程查询匹配)
-
适用场景:从其他索引动态获取查询条件(适用于
keyword
类型字段)。 -
查询方式:使用
terms_lookup
查询其他文档的字段值。 -
示例:
QueryBuilders.termsLookupQuery(\"category\", new TermsLookup(\"settings_index\", \"_id\", \"1\", \"fields.category\"));
-
特点:
- ✅ 适用于动态数据查询
- ✅ 允许从另一个索引获取匹配数据
- ❌ 查询时间可能较长
📌 使用场景:适用于 跨索引动态查询。
3️⃣8️⃣ scriptQuery(脚本查询)
-
适用场景:用于执行自定义查询逻辑,适用于复杂计算或动态匹配条件。
-
查询方式:支持
Painless
脚本来定义查询条件。 -
示例:
QueryBuilders.scriptQuery(new Script(\"doc[\'price\'].value > 100\"));
-
特点:
- ✅ 适用于复杂动态查询
- ✅ 支持
Painless
脚本 - ❌ 计算开销较高
📌 使用场景:适用于 自定义查询逻辑,如基于用户行为或计算得分。
3️⃣9️⃣ geoDistanceQuery(地理距离查询)
-
适用场景:用于查找指定地理位置附近的文档。
-
查询方式:返回在指定地理点一定距离范围内的文档。
-
示例:
QueryBuilders.geoDistanceQuery(\"location\") .point(40.7128, -74.0060) .distance(\"10km\");
-
特点:
- ✅ 适用于
geo_point
类型字段 - ✅ 可指定查询半径
- ❌ 需要索引
geo_point
类型字段
- ✅ 适用于
📌 使用场景:适用于 地理位置搜索,如附近的商店、餐厅等。
4️⃣0️⃣ geoBoundingBoxQuery(地理边界框查询)
-
适用场景:用于在矩形范围内筛选地理位置数据。
-
查询方式:指定左上角和右下角的坐标范围。
-
示例:
QueryBuilders.geoBoundingBoxQuery(\"location\") .setCorners(40.73, -74.1, 40.01, -71.12);
-
特点:
- ✅ 适用于
geo_point
类型字段 - ✅ 查询速度较快
- ❌ 仅适用于矩形边界
- ✅ 适用于
📌 使用场景:适用于 地理区域筛选,如指定范围的商店列表。
4️⃣1️⃣ geoPolygonQuery(地理多边形查询)
-
适用场景:用于定义多边形范围查询地理位置数据。
-
查询方式:需要提供多边形的边界点列表。
-
示例:
QueryBuilders.geoPolygonQuery(\"location\", Arrays.asList( new GeoPoint(40.73, -74.1), new GeoPoint(40.01, -71.12), new GeoPoint(41.12, -72.34)));
-
特点:
- ✅ 适用于
geo_point
类型字段 - ✅ 可定义任意形状区域
- ❌ 计算复杂度较高
- ✅ 适用于
📌 使用场景:适用于 复杂地理区域查询,如城市边界、行政区划。
4️⃣2️⃣ geoShapeQuery(地理形状查询)
-
适用场景:用于索引
geo_shape
类型字段的查询,支持复杂地理结构匹配。 -
查询方式:可以查询圆形、多边形、线条等复杂形状。
-
示例:
QueryBuilders.geoShapeQuery(\"region\", ShapeBuilders.newMultiPolygon( Arrays.asList( ShapeBuilders.newPolygon(Arrays.asList( new Coordinate(40.73, -74.1), new Coordinate(40.01, -71.12), new Coordinate(41.12, -72.34) )) )));
-
特点:
- ✅ 适用于
geo_shape
类型字段 - ✅ 可匹配复杂地理区域
- ❌ 计算开销较高
- ✅ 适用于
📌 使用场景:适用于 复杂地理形状匹配,如地图区域查询。
4️⃣3️⃣ geoIntersectionQuery(地理交集查询)
-
适用场景:用于查询某个
geo_shape
与文档中的geo_shape
是否有交集。 -
查询方式:匹配所有与指定形状有交集的区域。
-
示例:
QueryBuilders.geoShapeQuery(\"region\", ShapeBuilders.newPolygon(Arrays.asList( new Coordinate(40.73, -74.1), new Coordinate(40.01, -71.12), new Coordinate(41.12, -72.34)))).relation(SpatialRelation.INTERSECTS);
-
特点:
- ✅ 适用于
geo_shape
类型字段 - ✅ 可检测形状间的交集
- ❌ 查询复杂度较高
- ✅ 适用于
📌 使用场景:适用于 地图区域交叉筛选(如查询城市与河流交界区域)。
4️⃣4️⃣ geoWithinQuery(地理区域包含查询)
-
适用场景:用于查询某个
geo_shape
是否完全包含另一个geo_shape
。 -
查询方式:匹配完全包含的地理区域数据。
-
示例:
QueryBuilders.geoShapeQuery(\"region\", ShapeBuilders.newPolygon(Arrays.asList( new Coordinate(40.73, -74.1), new Coordinate(40.01, -71.12), new Coordinate(41.12, -72.34)))).relation(SpatialRelation.WITHIN);
-
特点:
- ✅ 适用于
geo_shape
类型字段 - ✅ 检测完全包含关系
- ❌ 查询可能较慢
- ✅ 适用于
📌 使用场景:适用于 筛选一个地区是否完全包含特定形状,如查找市区范围。
4️⃣5️⃣ geoDisjointQuery(地理不相交查询)
-
适用场景:用于查询某个
geo_shape
是否与指定区域完全不相交。 -
查询方式:返回所有完全不相交的
geo_shape
文档。 -
示例:
QueryBuilders.geoShapeQuery(\"region\", ShapeBuilders.newPolygon(Arrays.asList( new Coordinate(40.73, -74.1), new Coordinate(40.01, -71.12), new Coordinate(41.12, -72.34)))).relation(SpatialRelation.DISJOINT);
-
特点:
- ✅ 适用于
geo_shape
类型字段 - ✅ 查询地理位置完全不重叠的文档
- ❌ 计算量较大
- ✅ 适用于
📌 使用场景:适用于 筛选完全不相交的地理区域数据,如查找未受影响的城市区域。
4️⃣6️⃣ existsQuery(字段存在性查询)
-
适用场景:用于检查某个字段是否存在于索引中。
-
查询方式:返回所有字段不为空的文档。
-
示例:
QueryBuilders.existsQuery(\"orderno\");
-
特点:
- ✅ 适用于所有字段
- ✅ 查询性能高
- ❌ 不能用于具体匹配,只能检查存在性
📌 使用场景:适用于 过滤掉空字段的数据。
🎯 总结
matchAllQuery
matchQuery
text
commonTermsQuery
text
multiMatchQuery
text
matchBoolPrefixQuery
text
matchPhraseQuery
text
matchPhrasePrefixQuery
text
disMaxQuery
text
distanceFeatureQuery
date
/geo_point
idsQuery
_id
字段_id
termQuery
keyword
fuzzyQuery
text
prefixQuery
keyword
rangeQuery
wildcardQuery
keyword
regexpQuery
keyword
queryStringQuery
text
simpleQueryStringQuery
text
boostingQuery
boolQuery
spanTermQuery
text
spanNearQuery
text
spanNotQuery
text
spanOrQuery
text
OR
逻辑spanWithinQuery
text
spanContainingQuery
text
spanMultiTermQueryBuilder
text
multi-term
查询fieldMaskingSpanQuery
text
span
查询constantScoreQuery
functionScoreQuery
scriptScoreQuery
moreLikeThisQuery
text
nestedQuery
nested
termsQuery
keyword
wrapperQuery
typeQuery
(已废弃)_type
termsLookupQuery
keyword
scriptQuery
geoDistanceQuery
geo_point
geoBoundingBoxQuery
geo_point
geoPolygonQuery
geo_point
geoShapeQuery
geo_shape
geoIntersectionQuery
geo_shape
geoWithinQuery
geo_shape
geoDisjointQuery
geo_shape
existsQuery
- 全文搜索:
matchQuery
、multiMatchQuery
、commonTermsQuery
- 模糊匹配:
wildcardQuery
、regexpQuery
、fuzzyQuery
- 精确匹配:
termQuery
、idsQuery
- 范围查询:
rangeQuery
、geoDistanceQuery
- 评分调整:
functionScoreQuery
、boostingQuery
- 复杂查询:
boolQuery
、spanQuery
组合 - 地理查询:
geoShapeQuery
、geoBoundingBoxQuery
- 嵌套查询:
nestedQuery
- 自定义查询:
scriptQuery
Elasticsearch BoolQueryBuilder
详解
> BoolQueryBuilder
是 Elasticsearch 的布尔查询构造器,它允许组合多个查询条件,并定义查询逻辑,如 must
、filter
、mustNot
和 should
。以下是各个方法的区别及适用场景。
1️⃣ must
(必须匹配)
-
作用:必须匹配的查询条件,相当于 SQL 的
AND
。 -
查询方式:所有
must
语句中的查询必须匹配,否则该文档不会被返回。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .must(QueryBuilders.rangeQuery(\"price\").gte(100));
-
特点:
- ✅ 适用于 全文搜索和精确匹配
- ✅ 影响 查询评分
- ❌ 不适用于过滤数据(建议用
filter
)
📌 使用场景: 适用于 必须满足多个条件的查询(如同时搜索“Elasticsearch”且价格大于 100)。
2️⃣ filter
(数据过滤)
-
作用:用于数据过滤,不会影响查询评分(更适合缓存)。
-
查询方式:所有
filter
语句中的查询必须匹配,但不会影响文档得分。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery(\"category\", \"electronics\")) .filter(QueryBuilders.rangeQuery(\"price\").gte(100));
-
特点:
- ✅ 适用于 数据筛选
- ✅ 不会影响查询评分(可缓存)
- ❌ 不适用于排序或排名
📌 使用场景: 适用于 字段值匹配、数值范围筛选、日期过滤等(如筛选 category
是 electronics
且 price >= 100
)。
3️⃣ mustNot
(排除条件)
-
作用:用于排除不符合条件的数据,相当于 SQL 的
NOT
。 -
查询方式:所有
mustNot
语句中的查询不能匹配,否则该文档会被排除。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .mustNot(QueryBuilders.termQuery(\"status\", \"inactive\"));
-
特点:
- ✅ 适用于 排除特定值
- ✅ 不会影响查询评分
- ❌ 过多使用可能影响查询性能
📌 使用场景: 适用于 排除某些状态或标签的查询(如搜索“Elasticsearch”但排除 status=inactive
的数据)。
4️⃣ should
(可选匹配)
-
作用:用于可选匹配,可以影响查询评分(类似 SQL 的
OR
)。 -
查询方式:
- 如果
boolQuery
中没有must
或filter
,那么至少有一个should
语句匹配,文档才会返回。 - 如果
must
和filter
语句存在,should
语句匹配会提升文档评分。
- 如果
-
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .should(QueryBuilders.matchQuery(\"description\", \"搜索引擎\")) .should(QueryBuilders.matchQuery(\"tags\", \"性能优化\"));
-
特点:
- ✅ 适用于 可选匹配
- ✅ 可提升文档评分
- ❌ 默认情况下,不会影响查询是否返回文档
📌 使用场景: 适用于 增加匹配字段,提高相关性(如搜索“Elasticsearch”时,匹配 description=搜索引擎
或 tags=性能优化
的文档会优先显示)。
5️⃣ minimumShouldMatch
(最少满足的 should
条件数)
-
作用:指定
should
语句必须匹配的最小数量。 -
查询方式:如果
should
语句有多个,可以强制至少匹配一定数量。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .should(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\")) .should(QueryBuilders.matchQuery(\"description\", \"搜索引擎\")) .should(QueryBuilders.matchQuery(\"tags\", \"性能优化\")) .minimumShouldMatch(2);
-
特点:
- ✅ 适用于 控制
should
语句的匹配数量 - ✅ 提高匹配的严格性
- ❌ 不适用于
must
和filter
语句
- ✅ 适用于 控制
📌 使用场景: 适用于 需要多个 should
语句匹配至少几项时(如必须匹配 title
和 tags
才能返回)。
6️⃣ hasClauses
(查询是否包含子查询)
-
作用:检查
BoolQueryBuilder
是否包含must
、filter
、mustNot
或should
查询。 -
查询方式:返回
true
或false
,判断是否存在查询子句。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(\"title\", \"Elasticsearch\"));if (boolQuery.hasClauses()) { System.out.println(\"该查询包含子查询\");}
-
特点:
- ✅ 适用于 判断
BoolQueryBuilder
是否包含查询条件 - ✅ 可用于条件判断
- ❌ 不影响查询逻辑
- ✅ 适用于 判断
📌 使用场景: 适用于 判断是否已经设置了查询条件,避免执行空查询。
7️⃣ adjustPureNegative
(调整纯负查询)
-
作用:用于优化 只有
mustNot
语句 的查询,使其返回 所有文档 而不是空结果。 -
查询方式:默认情况下,如果
BoolQueryBuilder
只包含mustNot
,查询不会返回任何文档,而adjustPureNegative(true)
会调整行为,使其返回所有数据。 -
示例:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .mustNot(QueryBuilders.termQuery(\"status\", \"inactive\")) .adjustPureNegative(true);
-
特点:
- ✅ 适用于 只包含
mustNot
语句的查询 - ✅ 防止空结果
- ❌ 不会影响评分
- ✅ 适用于 只包含
📌 使用场景: 适用于 只有 mustNot
查询时,确保仍能返回文档(如筛选掉 inactive
状态的商品时,确保其他商品仍被返回)。
🎯 总结
must
filter
mustNot
should
minimumShouldMatch
should
条件数should
语句匹配数hasClauses
adjustPureNegative
mustNot
时优化结果