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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《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

 

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
缓存 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(11)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(11)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
|
JSON Apache 数据格式
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(8)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(8)
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)
118 0
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(2)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(2)
|
JSON 数据格式
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)
115 0
|
自然语言处理
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(13)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(13)
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)
106 0
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
103 0