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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(5)

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



3.3 terms_set

 

terms_set 可以根据搜索的多个词项和最少匹配词项数(minimum_should_match),返回复合条件的词项。而这个最少词项数是根据脚本或者某个数字字段决定的,即参数 minimum_should_match_script 和 minimum_should_match_field。

 

minimum_should_match_field

 

我们先看一下 minimum_should_match_field 的实践:

 

1、先创建一个索引,包含 keyword 字段和 long 字段,其中 programming_languages 是用于被搜索的字段,required_matches 则是被 minimum_should_match_field 使用的字段。

 

PUT /job-candidates
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "programming_languages": {
        "type": "keyword"
      },
      "required_matches": {
        "type": "long"
      }
    }
  }
}

2、插入相关数据。


PUT /job-candidates/_doc/1?refresh
{
  "name": "Jane Smith",
  "programming_languages": [ "c++", "java" ],
  "required_matches": 2
}
PUT /job-candidates/_doc/2?refresh
{
  "name": "Jason Response",
  "programming_languages": [ "java", "php" ],
  "required_matches": 2
}
PUT /job-candidates/_doc/3?refresh
{
  "name": "Jack",
  "programming_languages": [ "python", "golang","java", "php","c++" ],
  "required_matches": 3
}
PUT /job-candidates/_doc/4?refresh
{
  "name": "Tom",
  "programming_languages": [ "python", "golang","java", "php" ],
  "required_matches": 3
}
3、根据 required_matches 搜索匹配 "java"、 "php"、"c++" 这些词项的内容。
GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_field": "required_matches"
      }
    }
  }
}
# 返回结果
{......
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.6116207,
    "hits" : [
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.6116207,
        "_source" : {
          "name" : "Jack",
          "programming_languages" : [
            "python",
            "golang",
            "java",
            "php",
            "c++"
          ],
          "required_matches" : 3
        }
      },
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.1140156,
        "_source" : {
          "name" : "Jane Smith",
          "programming_languages" : [
            "c++",
            "java"
          ],
          "required_matches" : 2
        }
      },
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.64459586,
        "_source" : {
          "name" : "Jason Response",
          "programming_languages" : [
            "java",
            "php"
          ],
          "required_matches" : 2
        }
      }
    ]
  }
}

根据实际情况,文档 1 和 2 匹配搜索词项的两个且与 required_matches 的要求一直,因此返回;而文档 3 全部匹配且 required_matches 的值为 3,因此也符合;而文档 4 只匹配两

 

个词项,而 required_matches 的值为 3,因此不会命中返回。

 

minimum_should_match_script

 

则是使用脚本定义所需的最少匹配词项数。这对一些动态条件场景比较适合。

 

# 使用用词项数和固定数值的最小值来定义最少匹配词项数


GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, 4)"
        },
        "boost": 1.0
      }
    }
  }
}
# 使用用词项数和 required_matches 的最小值来定义最少匹配词项数
GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, doc['required_matches'].value)"
        },
        "boost": 1.0
      }
    }
  }
}

3.4 wildcard

 

Wildcard 可以用通配符模式进行 term 查询。通配符是匹配一个或多个字符的占位符。例如,* 通配符匹配零个或多个字符。可以将通配符操作符与其他字符组合起来创建通配符模式。

 

使用方法如下:


GET term-query/_search
{
  "query": {
    "wildcard": {
      "user.id": {
        "value": "ki*y",
        "boost": 1.0,
        "rewrite": "constant_score"
      }
    }
  }
}

其中 ki*y 可以匹配 kiy、kity 或者 kimchy。

 

通配符模式主要有两种方式:

 

l ?,问号用于匹配任意单个字符。

l *星号用于匹配 0 个或者多个字符。


注意:

 

1、避免以 * 或 ? 开头。这可能会增加查找匹配项所需的迭代次数,并降低搜索性能。

2、search.allow_expensive_queries 如果设置为 false 的话,那么 wildcard 查询将被限制。

 

3.5 range

 

Range 查询可以用于查询符合给定数据或者词项范围条件的相关文档。

 

使用方法如下:


GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

这个 DSL 是用于查询 age 字段范围大于等于 10,小于等于 20 的文档数据。

 

相关参数:

 

l 运算关系符:

gt:大于

gte:大于等于

lt:小于

 

lte:小于等于

l format:该参数主要针对 date 类型字段的格式设置,ES 会默认使用字段在 mapping 中的格式。

l time_zone:该参数也是对于 date 类型字段的设置。

l relation:这个参数主要与 range 类型的范围计算有关。

INTERSECTS:默认值,只要查询的范围与文档有交集即可返回。

CONTAINS:只有查询的范围被包含在文档的范围内才可返回,即查询的范围小于文档的范围。

WITHIN:只有查询的范围包含文档的范围才可返回,即查询的范围大于文档的范围。



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

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
安全 前端开发 网络协议
|
JSON 负载均衡 JavaScript
带你读《Elastic Stack 实战手册》之65:——3.5.19.1.Elasticsearch语言开发(Python)(上)
带你读《Elastic Stack 实战手册》之65:——3.5.19.1.Elasticsearch语言开发(Python)(上)
378 1
|
SQL Java 关系型数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
|
11月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
299 1
python知识点100篇系列(17)-替换requests的python库httpx
|
安全 网络协议 网络安全
Socks5代理与HTTP代理的区别与优劣
在互联网时代,隐私和安全至关重要,代理服务器如socks5和HTTP代理成为保护个人信息的工具。socks5代理支持多种网络流量和UDP协议,更具灵活性和通用性,但设置复杂;HTTP代理则更常见、易用,适合仅处理HTTP流量的场景,但限制较多。选择哪种代理取决于具体需求和应用场景。
|
Web App开发 监控 前端开发
Web Performance Optimization:前端性能优化全方位指南
【4月更文挑战第6天】本文是关于Web Performance Optimization的指南,重点讲述如何优化前端性能以提升用户体验和网站业务表现。关键性能指标包括First Contentful Paint (FCP)、First Meaningful Paint (FMP)、Largest Contentful Paint (LCP)、First Input Delay (FID)和Cumulative Layout Shift (CLS)。优化策略涉及资源压缩、网络配置、代码架构改进、交互渲染优化及性能监控。
2293 0
|
存储 自然语言处理 编译器
在Overleaf中解决IEEE LaTeX模板不能显示中文问题
在Overleaf中解决IEEE LaTeX模板不能显示中文问题
5630 0
|
存储 机器学习/深度学习 自然语言处理
基于 Elasticsearch 向量检索的以文搜图
本实验通过简易快速的阿里云相关组件和开源模型部署,通过1小时的动手实操,搭建基于Elasticsearch向量检索的以文搜图的搜索服务原型。
2777 4
|
存储 算法 搜索推荐
ElasticSearch 之 _score
ElasticSearch 之 _score
970 0
|
Ubuntu 数据安全/隐私保护 虚拟化
Ubuntu18.04.6镜像下载及虚拟机安装
Ubuntu18.04.6镜像下载及虚拟机安装
2413 0