《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