【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\"); - 
特点:
- ✅ 适用于所有字段
 - ✅ 查询性能高
 - ❌ 不能用于具体匹配,只能检查存在性
 
 
📌 使用场景:适用于 过滤掉空字段的数据。
🎯 总结
matchAllQuerymatchQuerytextcommonTermsQuerytextmultiMatchQuerytextmatchBoolPrefixQuerytextmatchPhraseQuerytextmatchPhrasePrefixQuerytextdisMaxQuerytextdistanceFeatureQuerydate/geo_pointidsQuery_id 字段_idtermQuerykeywordfuzzyQuerytextprefixQuerykeywordrangeQuerywildcardQuerykeywordregexpQuerykeywordqueryStringQuerytextsimpleQueryStringQuerytextboostingQueryboolQueryspanTermQuerytextspanNearQuerytextspanNotQuerytextspanOrQuerytextOR 逻辑spanWithinQuerytextspanContainingQuerytextspanMultiTermQueryBuildertextmulti-term 查询fieldMaskingSpanQuerytextspan 查询constantScoreQueryfunctionScoreQueryscriptScoreQuerymoreLikeThisQuerytextnestedQuerynestedtermsQuerykeywordwrapperQuerytypeQuery(已废弃)_typetermsLookupQuerykeywordscriptQuerygeoDistanceQuerygeo_pointgeoBoundingBoxQuerygeo_pointgeoPolygonQuerygeo_pointgeoShapeQuerygeo_shapegeoIntersectionQuerygeo_shapegeoWithinQuerygeo_shapegeoDisjointQuerygeo_shapeexistsQuery- 全文搜索:
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 状态的商品时,确保其他商品仍被返回)。
🎯 总结
mustfiltermustNotshouldminimumShouldMatchshould 条件数should 语句匹配数hasClausesadjustPureNegativemustNot 时优化结果

