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

简介: 带你读《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并实现搜索。  
相关文章
|
4月前
|
存储 新零售 监控
一文揭开神秘的RFID技术面纱
RFID(射频识别)技术是物联网的重要组成部分,通过无线电信号自动识别目标并读写数据。广泛应用于门禁卡、公交卡、无人超市、物流仓储、智慧医疗等领域。本文详解其原理、组成、分类、特点及应用,带你全面了解这项高效、智能的识别技术。
|
Java iOS开发 Docker
Mac OS安装Docker容器的3种方式与差别:Docker for Mac
Docker是最流行等开源容器,为了学习,在Mac Book Pro使用Docker容器环境,实战Java、Mongo、Redis等技术,需要提前安装Docker环境,下面介绍在Mac OS安装Docker3种方式: 1、命令方式, 2、Docker Desktop for Mac,带一套可视化...
26374 0
|
SQL Java 关系型数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
|
算法 计算机视觉
扭曲
【6月更文挑战第29天】
311 0
|
存储 自然语言处理 编译器
在Overleaf中解决IEEE LaTeX模板不能显示中文问题
在Overleaf中解决IEEE LaTeX模板不能显示中文问题
6868 0
|
C语言 C++ 编译器
C/C++ 分支预测(likely unlikely)
看一些代码时,会遇到likely unlikely, 查了查网上的资料,结合自己的理解记录一下。 1. 一些概念   指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到指令执行完所需的全部。
4634 0
★古今中外著名14大悖论
  1. 全能悖论The Omnipotence Paradox      假如一个万能的人(例如神)制造一颗石头重到他也无法举起,那他还是万能的吗? 这悖论表示假如一个万能的人可以做任何的事,那他也可以限制自己做某些事,因此他就无法做任何的事,但另一方面假如他无法限制自己的能力的话,那这就会是一件他无法做的事。
1202 0
|
测试技术 C++
WinDbg分析DMP文件方法完全攻略
前言:在C++实际开发过程中,开发出来的程序,一般情况下由开发人员进行单元测试,然后移交给测试人员进行测试。在开发人员测试出现的bug,我们可以直接在本地进行调试。如果测试人员测试出崩溃级别的bug,如果我们需要调试往往借助于vs提供的Remote Debugger工具进行远程调试(关于vs2010远程调试的方法,请参考http://blog.
1797 0

热门文章

最新文章