带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)

简介: 带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(14) https://developer.aliyun.com/article/1229925


4.6 query string

 

Query string 查询是一种便捷的语法查询方式,解析器根据提供的查询字符串进行严格的语法解析,最后返回相应的文档。

 

主要有这些特点:


1、严格的语法解析,对查询内容的正确性要求较高。也因此 ES 官方不建议在搜索框使用 query_string 查询。

2、操作符的使用使得查询语句更加简洁,且逻辑更加清晰。

3、允许使用通配符、正则表达式等方法。

4、基本覆盖了全文搜索的绝大数功能。

 

使用方法:


GET /_search
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}

这个查询等同于下面的查询:


GET my-index-000002/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "content": "new york city"
          }
        },
        {
          "match": {
            "content": "big apple"
          }
        }
      ]
    }
  }
}

query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。

 

我们主要看一下 query_string 的语法运用规则:

 

1、字段查询:默认的查询方式是status:active这样的方式。可以在字段中添加操作符,比如

title:(quick OR brown);也可以对字段使用匹配,book.\*:(quick OR brown)注意转义符的使用;对被查询的文档是使用英文双引号可以达到 match_phrase 的效果,author:"John Smith"; exists 方法的使用则是这样 _exists_:title

2、wildcards方法:匹配符的方法也是 ? 代表一个字符, * 代表多个字符。

3、正则表达式:正则表达式模式可以嵌入到查询字符串中,方法是将用斜杠/括起来,比如:name:/joh?n(ath[oa]n)/

4、模糊查询:模糊查询的符号是 ~,比如:quikc~ brwn~ foks~可以在 ~ 后面添加编辑距离参数,比如:quikc~2注意,模糊查询是针对 term 查询时词项的模糊匹配。

5、相似查询(proximity search):与模糊查询的方式操作符号一样也是~ ,但是是对 match_phrase 查询的两个词项间的距离编辑,比如:"fox quick"~5

6、范围查询:中阔号是两边范围包含,比如count:[1 TO 5]是 count 大于等于 1 小于等于 5 ;花括号是两边范围不包含,比如count:{1 TO 5}是 count 大于 1 小于 5 ;如果是单纯的大于或者小于则用 * 号代表无范围限制,比如count:[1 TO *] 代表 count 大于等于 1,

count:{* TO 5}代表小于5;当然两个符号也可以组合,比如count:{1 TO 5]代表大于 1 小于等于 5

7、加权:加权主要使用的符号是^,比如quick^2 fox代表命中 quick 的文档算分是 fox 的 2 倍。

8、布尔运算:默认空格是或查询+号是 must ,-号是 must not。比如quick brown +fox -news是查询必须有 fox ,不包含 news ,包含 quick brown 其中一项的文档。同时布尔运算符包含 AND OR NOT&& || ! 两种形式的表达式。

9、分组:括号用于表示分组,比如 (quick OR brown) AND fox 或者 status:(active OR pending) title:(full text search)^2

10、多字段查询:多字段查询的字段间关系默认是 OR 的关系.比如下面的查询:

GET /_search
{
  "query": {
    "query_string": {
      "fields": [ "content", "name" ],
      "query": "this AND that"
    }
  }
}

等同于:

GET /_search
{
  "query": {
    "query_string": {
      "query": "(content:this OR name:this) AND (content:that OR name:that)"
    }
  }
}

同时,multi_match 中的各种查询类型也可以通过 type 参数实现。

 

注意:


1、在 query_string 中避免查询 nested 的文档。

2、query_string 查询可以在内部转换为 prefix 查询,如果 ES 禁用 prefix 查询,query_string 将不会执行查询并抛出异常。

3、关于转义符,在 json 中转义符是 "\",比如 "query" : "kimchy\\!"

4、在多字段查询中,由于字段和词项之间的布尔运算规则的交叉,会导致运算逻辑相对晦涩不明。因此如果有多字段查询最佳的方式是通过分组将其查询逻辑清晰化,避免查询失败。

 

4.7 simple_query_string

 

simple_query_string 是一种相对简化的查询语法,虽然比起 query_string 的完善功能 simple_query_string 的使用有诸多限制,但是 simple_query_string 查询不会因无效语法返回错误。相反,它会忽略查询字符串中任何无效的部分

 

使用方法:


GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

simple_query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。

 

使用语法

 

语法操作符主要作用于查询词项,有以下这些:



1、+ 代表 and 关系, | 代表 or -代表 not。

2、"" 英文双引号使用 match_phrase。

3、* 是通配符。

4、() 是分组。

5、~N 是模糊查询或者相似查询的字符或者词项编辑距离。

 

limit operators在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。比如:

 

limit operators

 

limit operators 在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。

 

比如:


GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "foo | bar + baz*",
      "flags": "OR|AND|PREFIX"
    }
  }
}

这个查询中,限定了 OR AND PREFIX 三种语法,其余的语法运算符都会被限制掉。

 

flag 的参数值:ALL(默认))/AND/ESCAPE/FUZZY/NEAR/NONE/NOT/OR/PHRASE/PRECEDENCE/PREFIX/SLOP/WHITESPACE


字段通配符和加权

 

在查询字段上,也可以使用通配符*,比如:

GET /_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

同时也可以对字段进行加权,使用符号^

GET /_search
{
  "query": {
    "simple_query_string" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(16) https://developer.aliyun.com/article/1229923

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
Java Unix 程序员
【OS Ctags】Vim 代码阅读工具 Ctags
【OS Ctags】Vim 代码阅读工具 Ctags
363 0
【OS Ctags】Vim 代码阅读工具 Ctags
|
Java 应用服务中间件 Nacos
阿里巴巴NACOS(3)- 部署Nacos的生产集群环境
上一篇文章介绍了如何在Spring Cloud中使用Nacos,让我感觉是无缝支持Spring Cloud,可惜的是阿里云的MSE暂时只支持Nacos的服务注册和发现,配置中心还是需要用阿里云的ACM来完成,本文将介绍如何部署Nacos的生产集群环境。
14091 0
阿里巴巴NACOS(3)- 部署Nacos的生产集群环境
|
机器学习/深度学习 算法
深入理解SVM中的核函数及其应用
深入理解SVM中的核函数及其应用
400 78
|
监控 安全 数据挖掘
这些屏幕监控软件一键轻松监控员工,速来试用
本文介绍了几款顶级屏幕监控软件,如WorkWin和Teramind,用于提升团队效率和保障企业安全。WorkWin提供远程控制、USB管理、权限分配等功能,确保合规运营和信息安全。Teramind能监控员工应用使用,发送实时警报,并进行数据分析。而ActivTrak则有实时屏幕监控和详细分析报告,帮助管理者优化工作流程。这些工具助力企业有效管理团队,提高生产力。
486 4
|
人工智能 自动驾驶 算法
AI的未来发展与挑战
本文探讨了人工智能(AI)的未来发展趋势和面临的主要挑战。通过对当前AI技术的概述,本文分析了AI在不同行业中的应用现状,并展望了未来的发展方向。同时,本文还讨论了AI发展中可能遇到的伦理、法律和技术难题,提出了相应的解决策略。
|
人工智能 监控 数据可视化
低代码开发平台,快速搭建云MES系统
低代码平台是一种通过可视化操作减少手工编码的高效开发工具,适用于快速构建和交付应用软件。万界星空科技的AI低代码云MES系统具备快速开发、灵活可扩展、降低维护成本、智能分析与决策等优势,支持生产计划、质检、库存管理、数据大屏、自定义报表等功能,助力企业实现生产过程的数字化和智能化转型,提升运营效率和市场竞争力。
647 4
|
机器学习/深度学习 供应链 监控
ERP系统中的供应链风险识别与应对策略解析
【7月更文挑战第25天】 ERP系统中的供应链风险识别与应对策略解析
1036 1
|
缓存 Kubernetes 测试技术
在k8S中,镜像下载策略有哪些?
在k8S中,镜像下载策略有哪些?
|
安全 物联网 API
TEE是什么?现有TEE解决方案
TEE是什么?现有TEE解决方案
1767 0
|
应用服务中间件 PHP 数据库
【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问
【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问
1572 1
【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问

热门文章

最新文章