> 技术文档 > 【Java篇】 2.Elasticsearch 查询方式:46 种查询方式解析 [特殊字符]_2 8

【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\"));
  • 特点

    • ✅ 适用于时间或地理距离计算
    • ✅ 可以影响搜索结果的评分
    • ❌ 仅适用于 dategeo_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(布尔查询)

  • 适用场景:用于组合多个查询,支持 mustshouldmust_notfilter 条件。

  • 查询方式:可以嵌套多个查询条件,适用于复杂逻辑查询。

  • 示例

    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 查询支持 wildcardregexp 这样的多词查询方式。

  • 示例

    SpanQuery spanQuery = QueryBuilders.spanMultiTermQueryBuilder( QueryBuilders.wildcardQuery(\"description\", \"elastic*\"));
  • 特点

    • ✅ 支持 wildcardQueryregexpQuery
    • ✅ 适用于 text 类型字段
    • ❌ 查询复杂度较高

📌 使用场景:适用于 span** 查询中的模糊匹配搜索**。

2️⃣8️⃣ fieldMaskingSpanQuery(字段掩码 Span 查询)

  • 适用场景:用于 span 查询,使 multi-term 查询能与 span 逻辑兼容。

  • 查询方式:允许 multi-term 查询如 wildcardQueryspan 查询环境中使用。

  • 示例

    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);
  • 特点

    • ✅ 适用于内容推荐或相关文档查找
    • ✅ 可设置 minTermFreqmaxQueryTerms
    • ❌ 需要大量索引数据支持

📌 使用场景:适用于 推荐系统,查找相似文章或产品

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 JSON ❌ 否 ❌ 否 ✅ 快 JSON 直接查询 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 所有字段 ❌ 否 ❌ 否 ✅ 快 过滤空字段
  • 全文搜索matchQuerymultiMatchQuerycommonTermsQuery
  • 模糊匹配wildcardQueryregexpQueryfuzzyQuery
  • 精确匹配termQueryidsQuery
  • 范围查询rangeQuerygeoDistanceQuery
  • 评分调整functionScoreQueryboostingQuery
  • 复杂查询boolQueryspanQuery 组合
  • 地理查询geoShapeQuerygeoBoundingBoxQuery
  • 嵌套查询nestedQuery
  • 自定义查询scriptQuery

Elasticsearch BoolQueryBuilder 详解

> BoolQueryBuilder 是 Elasticsearch 的布尔查询构造器,它允许组合多个查询条件,并定义查询逻辑,如 mustfiltermustNotshould。以下是各个方法的区别及适用场景。

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));
  • 特点

    • ✅ 适用于 数据筛选
    • 不会影响查询评分(可缓存)
    • 不适用于排序或排名

📌 使用场景: 适用于 字段值匹配、数值范围筛选、日期过滤等(如筛选 categoryelectronicsprice >= 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 中没有 mustfilter,那么至少有一个 should 语句匹配,文档才会返回。
    • 如果 mustfilter 语句存在,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 语句的匹配数量
    • 提高匹配的严格性
    • 不适用于 mustfilter 语句

📌 使用场景: 适用于 需要多个 should 语句匹配至少几项时(如必须匹配 titletags 才能返回)。

6️⃣ hasClauses(查询是否包含子查询)

  • 作用:检查 BoolQueryBuilder 是否包含 mustfiltermustNotshould 查询。

  • 查询方式:返回 truefalse,判断是否存在查询子句。

  • 示例

    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 时优化结果