ElasticSearch7.x入门教程之全文搜索(六)

文章目录

  • 前言
  • [一、短语匹配:match_phrase query](#一、短语匹配:match_phrase query)
  • [二、短语前缀匹配:~~match_phrase_prefix~~ query](#二、短语前缀匹配:match_phrase_prefix query)
  • [三、多字段查询:multi_match query](#三、多字段查询:multi_match query)
  • 四、Lucene中的简单查询
  • [五、存在查询:exists query](#五、存在查询:exists query)
  • [六、前缀查询:~~prefix~~ query](#六、前缀查询:prefix query)
  • [七、通配符查询:wildcard query](#七、通配符查询:wildcard query)
  • [八、正则表达式查询:regexp query](#八、正则表达式查询:regexp query)
  • [九、错字模糊查询:fuzzy query](#九、错字模糊查询:fuzzy query)
  • 总结

前言

上一篇文章记录了,在工作当中常用的基本查询方式,也可以满足一定的查询需求了。但是有一些特殊场景,可能还不满足,所以在此记录一下。


一、短语匹配:match_phrase query

match_phrase query 也会对查询的关键字进行分词,但是它分词后有两个特点:

1、分词后的词项顺序必须和文档中词项的顺序一致

2、所有的词都必须出现在文档中

示例如下:

javascript 复制代码
GET /building_info/_search  
{
  "query": {
    "match_phrase": {
      "address": {
        "query": "草堂北路",
        "slop": 7
      }
    }
  }
}

query 是查询的关键字,会被分词器进行分解,分解之后去倒排索引中进行匹配。

slop 是指关键字之间的最小距离,但是注意不是关键之间间隔的字数。文档中的字段被分词器解析之后,解析出来的词项都包含一个 position 字段表示词项的位置,查询短语分词之后 的 position 之间的间隔要满足 slop 的要求。

二、短语前缀匹配:match_phrase_prefix query

这个类似于 match_phrase query,只不过这里多了一个通配符,match_phrase_prefix 支持最后一个词项的前缀匹配,但是由于这种匹配方式效率较低,因此大家作为了解即可。

javascript 复制代码
GET /building_info/_search
{
  "query": {
    "match_phrase_prefix": {
      "name": "金林半岛"
    }
  }
}

这个查询过程,会自动进行单词匹配,会自动查找以计开始的单词,默认是 50 个,可以自己控制:

javascript 复制代码
GET /building_info/_search
{
  "query": {
    "match_phrase_prefix": {
      "town_office": {
        "query": "草堂街道",
        "max_expansions": 3
      }
    }
  }
}

match_phrase_prefix 是针对分片级别的查询,假设 max_expansions 为 1,可能返回多个文档,但是只有一个词,这是我们预期的结果。有的时候实际返回结果和我们预期结果并不一致,原因在于这个查询是分片级别的,不同的分片确实只返回了一个词,但是结果可能来自不同的分片,所以最终会看到多个词。

三、多字段查询:multi_match query

match 查询的升级版,可以指定多个查询域:

javascript 复制代码
GET /building_info/_search
{
  "query": {
    "multi_match": {
      "query": "草堂北路",
      "fields": ["name","town_office", "address"]
    }
  }
}

这种查询方式还可以指定字段的权重:

javascript 复制代码
GET /building_info/_search
{
  "query": {
    "multi_match": {
      "query": "草堂北路",
      "fields": ["name^3","town_office^2", "address"]
    }
  }
}

这个表示关键字出现在 name 中的权重是出现在 address中权重的 2 倍。

四、Lucene中的简单查询

  • 1、query_string query
    query_string 是一种紧密结合 Lucene 的查询方式,在一个查询语句中可以用到 Lucene 的一些查询语法:
javascript 复制代码
GET building_info/_search
{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "(草堂) AND (小区)"
    }
  }
}
  • 2、simple_query_string
    这个是 query_string 的升级,可以直接使用 +、|、- 代替 AND、OR、NOT 等。
javascript 复制代码
GET building_info/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["name"],
      "query": "(草堂) + (小区)"
    }
  }
}

五、存在查询:exists query

exists query 会返回指定字段中至少有一个非空值的文档:

javascript 复制代码
GET building_info/_search
{
  "query": {
    "exists": {
      "field": "address"
    }
  }
}

注意,空字符串也是有值。null 是空值。

六、前缀查询:prefix query

前缀查询,效率略低,除非必要,一般不太建议使用。

给定关键词的前缀去查询:

javascript 复制代码
GET building_info/_search
{
  "query": {
    "prefix": {
      "address": {
        "value": "成都市成华区"
      }
    }
  }
}

七、通配符查询:wildcard query

wildcard query 即通配符查询。支持单字符和多字符通配符:

  • 1、?表示一个任意字符。
  • 2、* 表示零个或者多个字符。
    如下:
javascript 复制代码
# 查询所有成华开头的地址
GET building_info/_search
{
  "query": {
    "wildcard": {
      "county": {
        "value": "成华*"
      }
    }
  }
}

# 查询所有成华开头只有三个字的地址
GET building_info/_search
{
  "query": {
    "wildcard": {
      "county": {
        "value": "成华?"
      }
    }
  }
}

八、正则表达式查询:regexp query

支持正则表达式查询。

查询所有成华开头并且只有三个字的地址:

javascript 复制代码
GET building_info/_search
{
  "query": {
    "regexp": {
      "county": {
        "value": "成华."
      }
    }
  }
}

九、错字模糊查询:fuzzy query

在实际搜索中,有时我们可能会打错字,从而导致搜索不到,在 match query 中,可以通过 fuzziness 属性实现模糊查询。

fuzzy query 返回与搜索关键字相似的文档。怎么样就算相似?以LevenShtein 编辑距离为准。编辑距离是指将一个字符变为另一个字符所需要更改字符的次数,更改主要包括四种:

  • 1、更改字符(javb--〉java)
  • 2、删除字符(javva--〉java)
  • 3、插入字符(jaa--〉java)
  • 4、转置字符(ajva--〉java)

为了找到相似的词,模糊查询会在指定的编辑距离中创建搜索关键词的所有可能变化或者扩展的集合,然后进行搜索匹配。

javascript 复制代码
# 正确的应该是:type = 城市住宅
GET building_info/_search
{
  "query": {
    "fuzzy": {
      "type": {
        "value": "城市住房"
      }
    }
  }
}

总结

仅仅简单记录,可能用到的很少场景下的查询需求。

相关推荐
SelectDB技术团队6 小时前
冷热分层从建到验:Storage Policy 创建、表级与分区级绑定、SHOW TABLETS 验证的完整命令
大数据·数据库·elasticsearch·搜索引擎·数据分析·apache doris·冷热分层
Sayai9 小时前
DataX 离线数据同步实战:Elasticsearch 数据批量导出 MySQL(作业配置、并发调优与定时同步平台化设计)
大数据·mysql·elasticsearch·datax·数据同步
Elastic 中国社区官方博客11 小时前
Kibana:创建包含时间序列图表的仪表板
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
Elastic 中国社区官方博客13 小时前
Elastic 线下 Meetup 将于 2026 年 12 月 19 号下午在西安举行
大数据·数据库·elasticsearch·搜索引擎·ai·数据分析·全文检索
SelectDB技术团队14 小时前
存算分离建表与 Storage Vault 配置全流程:日志集群从建库到弹性扩缩容的命令链
elasticsearch·日志·数据湖·apache doris·日志数据·数据库选型·多模湖仓
今年下半年15 小时前
【Spring Boot】集成 Elasticsearch:中文分词与关键字高亮对接文档
spring boot·elasticsearch·中文分词
jonyleek15 小时前
JVS私有化文档系统运维避坑指南:5大断点检测与加固实践(K8S+MinIO+ES)
elasticsearch·minio·clamav·jvs·k8s运维·文档系统·权限同步
骑着蜗牛撵大象32715 小时前
CentOS 7 单机拉起 Elasticsearch 7.17.29:从内核报错到公网可达的全链路记录
elasticsearch·centos·jenkins·restful·内核调优·公网部署
打工仔折腾 AI15 小时前
CentOS 7 单机部署 Elasticsearch 7.17.29:启动报错排查与 CRUD 验证
人工智能·后端·python·elasticsearch·性能优化·centos·jenkins
SelectDB技术团队17 小时前
VARIANT 列接入网关 JSON 日志:建表、导入、子列查询与物化的完整步骤
大数据·数据库·人工智能·elasticsearch·搜索引擎·json·apache doris