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": "城市住房"
      }
    }
  }
}

总结

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

相关推荐
Fireworkitte13 小时前
安装 Elasticsearch IK 分词器
大数据·elasticsearch
huisheng_qaq1 天前
【ElasticSearch实用篇-01】需求分析和数据制造
大数据·elasticsearch·制造
G皮T1 天前
【Elasticsearch】自定义评分检索
大数据·elasticsearch·搜索引擎·查询·检索·自定义评分·_score
feilieren2 天前
Docker 安装 Elasticsearch 9
运维·elasticsearch·docker·es
Java烘焙师2 天前
架构师必备:业务扩展模式选型
mysql·elasticsearch·架构·hbase·多维度查询
G皮T3 天前
【Elasticsearch】深度分页及其替代方案
大数据·elasticsearch·搜索引擎·scroll·检索·深度分页·search_after
G皮T3 天前
【Elasticsearch】检索排序 & 分页
大数据·elasticsearch·搜索引擎·排序·分页·检索·深度分页
飞询3 天前
Docker 安装 Elasticsearch 9
elasticsearch·docker
G皮T3 天前
【Elasticsearch】检索高亮
大数据·elasticsearch·搜索引擎·全文检索·kibana·检索·高亮
大只鹅3 天前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch