首页 » 网站推广 » php查询boolean技巧_ES根本查询简介

php查询boolean技巧_ES根本查询简介

访客 2024-12-05 0

扫一扫用手机浏览

文章目录 [+]

空字符串""

包含null和其他值的数组:[null,"foo"]

php查询boolean技巧_ES根本查询简介

自定义空值,在字段映命中定义

php查询boolean技巧_ES根本查询简介
(图片来自网络侵删)
模糊查询

GET /_search{ "query": { "fuzzy": { "user.id": { "value": "ki", "fuzziness": "AUTO", "max_expansions": 50, "prefix_length": 0, "transpositions": true, "rewrite": "constant_score" } } }}

把稳:如果 search.allow_expensive_queries 设置为 false,则不会实行模糊查询

返回包含与搜索词相似的词的文档(按编辑编辑间隔丈量)。
编辑间隔是将一个术语变成另一术语所需的单个字符变动的数量。
这些变革可以包括:

变动一个字符(box → fox)移除一个字符(black → lack)插入一个字符(sic → sick)调换相邻两个字符(act → cat)IDs

GET /_search{ "query": { "ids" : { "values" : ["1", "4", "100"] } }}

根据 ID 返回文档。
此查询利用存储在 _id 字段中的文档 ID

前缀查询

返回在供应的字段中包含特定前缀的文档

GET /_search{ "query": { "prefix": { "user.id": { "value": "ki" } } }}GET /_search{ "query": { "prefix" : { "user" : "ki" } }}

您可以利用 index_prefixes 映射参数加速前缀查询。
如果启用,Elasticsearch 会根据配置设置在单独的字段中索引前缀。
这使得 Elasticsearch 能够以更高效的办法运行前缀查询,代价是索引会变得更大。

如果 search.allow_expensive_queries 设置为 false,将不实行前缀查询。
然而,如果启用了 index_prefixes,将构建一个经由优化的查询,不被视为缓慢,将会实行,只管设置为不实行昂贵查询。

范围查询

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

把稳:如果设置 search.allow_expensive_queries 为 false,将不会实行对text或keyword字段的范围查询。

日期查询:

当 <field> 参数这天期字段数据类型时,可以利用以下参数进行日期数学运算:

GET /_search{ "query": { "range": { "timestamp": { "gte": "now-1d/d", "lt": "now/d" } } }}正则查询

GET /_search{ "query": { "regexp": { "user.id": { "value": "k.y", "flags": "ALL", "case_insensitive": true, "max_determinized_states": 10000, "rewrite": "constant_score" } } }}

把稳:如果将 search.allow_expensive_queries 设置为 false,则不会实行正则表达式查询

term查询

可以利用 term 查询根据精确值(如价格、产品ID或用户名)查找文档

GET /_search{ "query": { "term": { "user.id": { "value": "kimchy", "boost": 1.0 } } }}

把稳:避免在文本字段上利用 term 查询。

默认情形下,Elasticsearch在剖析过程中会变动文本字段的值。
例如,默认的标准剖析器变动文本字段的值如下:

移除大多数标点符号将剩余内容分割成称为标记的单个单词将标记转换为小写

为了更好地搜索文本字段,match 查询在实行搜索之前还会对您供应的搜索术语进行剖析。
这意味着 match 查询可以搜索文本字段的剖析过的标记,而不是精确术语。

term 查询不会剖析搜索术语。
term 查询仅搜索您供应的确切术语。
这意味着当在文本字段中进行搜索时,term 查询可能返回较差或无结果。

Demo

PUT my-index-000001{ "mappings": { "properties": { "full_text": { "type": "text" } } }}PUT my-index-000001/_doc/1{ "full_text": "Quick Brown Foxes!"}由于 full_text 是一个文本字段,Elasticsearch在剖析过程中将 "Quick Brown Foxes!" 变动为 [quick, brown, fox]。
GET my-index-000001/_search?pretty{ "query": { "term": { "full_text": "Quick Brown Foxes!" } }}由于 full_text 字段不再包含精确术语 "Quick Brown Foxes!",以是 term 查询不会返回任何结果。
GET my-index-000001/_search?pretty{ "query": { "match": { "full_text": "Quick Brown Foxes!" } }}与 term 查询不同,match 查询在实行搜索之前会对您供应的搜索术语 "Quick Brown Foxes!" 进行剖析。
然后,match 查询将返回包含 full_text 字段中的 quick、brown 或 fox 标记的任何文档。
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.8630463, "hits" : [ { "_index" : "my-index-000001", "_type" : "_doc", "_id" : "1", "_score" : 0.8630463, "_source" : { "full_text" : "Quick Brown Foxes!" } } ] }}
terms查询

terms 查询与 term 查询相似,不同之处在于可以搜索多个值。

GET /_search{ "query": { "terms": { "user.id": [ "kimchy", "elkbee" ], "boost": 1.0 } }}

把稳:默认情形下,Elasticsearch将 terms 查询限定为最多 65,536 个术语。
这包括利用 terms lookup 获取的术语。
您可以通过设置 index.max_terms_count 来变动此限定。

Terms set查询

terms_set 查询与 terms 查询相似,不同之处在于您可以定义返回文档所需的匹配术语的数量。
例如:

一个字段,programming_languages,包含已知编程措辞的列表,如 c++、java 或 php 用于求职者。
您可以利用 terms_set 查询返回至少匹配这些措辞中的两种的文档。
一个字段,permissions,包含运用程序可能的用户权限列表。
您可以利用 terms_set 查询返回与这些权限的子集匹配的文档。

GET /job-candidates/_search{ "query": { "terms_set": { "programming_languages": { "terms": [ "c++", "java", "php" ], "minimum_should_match_field": "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 } } }}通配符查询

通配符运算符是匹配一个或多个字符的占位符。

?,匹配任何单个字符。
,可以匹配零个或多个字符,包括空字符。

避免以 或 ? 开始模式。
这可能会增加查找匹配术语所需的迭代次数,降落搜索性能。

如果将 search.allow_expensive_queries 设置为 false,则不会实行通配符查询。

GET /_search{ "query": { "wildcard": { "user.id": { "value": "kiy", "boost": 1.0, "rewrite": "constant_score" } } }}全文查询间隔查询

以下区间搜索返回包含 "my favorite food" 的文档,个中没有任何间隙,接着是在 my_text 字段中的 "hot water" 或 "cold porridge"。
可以匹配 my favorite food is cold porridge 但是不能匹配 my favorite food is porridgePOST _search{ "query": { "intervals" : { "my_text" : { "all_of" : { "ordered" : true, "intervals" : [ { "match" : { "query" : "my favorite food", "max_gaps" : 0, "ordered" : true } }, { "any_of" : { "intervals" : [ { "match" : { "query" : "hot water" } }, { "match" : { "query" : "cold porridge" } } ] } } ] } } } }}
match查询

匹配查询是用于实行全文搜索的标准查询,包括模糊匹配选项。

GET /_search{ "query": { "match": { "message": { "query": "this is a test", "operator": "and" } } }}

match 查询是布尔类型的。
这意味着供应的文本会经由剖析,剖析过程从供应的文本布局一个布尔查询。
operator 参数可以设置为 or 或 and,以掌握布尔子句(默认为 or)。
可以利用 minimum_should_match 参数设置要匹配的最小可选 should 子句的数量。

可以设置 analyzer 参数来掌握哪个剖析器将在文本上实行剖析过程。
默认为字段的显式映射定义或默认搜索剖析器。

lenient 参数可以设置为 true,以忽略由于数据类型不匹配引起的非常,例如考试测验利用文本查询字符串查询数值字段。
默认为 false。

聚合查询桶聚合

桶(Bucket)聚合与度量(Metrics)聚合不同,它们不打算字段上的指标,而是创建文档的桶。
每个桶与一个标准关联(取决于聚合类型),该标准确定当前高下文中的文档是否“落入”个中。
换句话说,桶有效地定义了文档凑集。
除了桶本身外,桶聚合还打算并返回“落入”每个桶的文档数。

桶聚合与度量聚合相反,可以包含子聚合。
这些子聚合将对由它们的“父”桶聚合创建的桶进行聚合。

有不同的桶聚合器,每个都有不同的“分桶”策略。
有些定义单个桶,有些定义多个桶的固天命量,而其他一些在聚合过程中动态创建桶。

search.max_buckets 集群设置限定了单个相应中许可的桶数。

filter聚合

单个存储桶聚合,将文档集缩小到与查询匹配的文档集。

POST /sales/_search?size=0&filter_path=aggregations{ "aggs": { "avg_price": { "avg": { "field": "price" } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }}{ "aggregations": { "avg_price": { "value": 140.71428571428572 }, "t_shirts": { "doc_count": 3, "avg_price": { "value": 128.33333333333334 } } }}下面两个等同POST /sales/_search?size=0&filter_path=aggregations{ "query": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } }}POST /sales/_search?size=0&filter_path=aggregations{ "aggs": { "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }}

要利用多个过滤器对文档进行分组,请利用 filters 聚合。
这比利用多个 filter 聚合更快。

POST /sales/_search?size=0&filter_path=aggregations{ "aggs": { "f": { "filters": { "filters": { "hats": { "term": { "type": "hat" } }, "t_shirts": { "term": { "type": "t-shirt" } } } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }}而不是用它POST /sales/_search?size=0&filter_path=aggregations{ "aggs": { "hats": { "filter": { "term": { "type": "hat" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } }}Filters聚合

GET logs/_search{ "size": 0, "aggs" : { "messages" : { "filters" : { "other_bucket_key": "other_messages", "filters" : { "errors" : { "match" : { "body" : "error" }}, "warnings" : { "match" : { "body" : "warning" }} } } } }}{ "took": 3, "timed_out": false, "_shards": ..., "hits": ..., "aggregations": { "messages": { "buckets": { "errors": { "doc_count": 1 }, "warnings": { "doc_count": 2 }, "other_messages": { "doc_count": 1 } } } }}terms聚合

这是基于多桶值源的聚合,个中桶是动态构建的,每个唯一值对应一个桶。

GET /_search{ "aggs": { "genres": { "terms": { "field": "genre" } } }}{ ... "aggregations": { "genres": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, //当存在大量唯一术语时,Elasticsearch仅返回前几个术语;这个数字是不在相应中的所有桶的文档计数的总和。
"buckets": [ { "key": "electronic", "doc_count": 6 }, { "key": "rock", "doc_count": 3 }, { "key": "jazz", "doc_count": 2 } ] } }}

该字段可以是 Keyword、Numeric、IP、Boolean 或 Binary 类型。

默认情形下,您不能在文本字段上运行 terms 聚合。
请利用关键字子字段。
或者,您可以在文本字段上启用 fielddata 以为字段的剖析术语创建桶。
启用 fielddata 可能会显著增加内存利用量。

大小

默认情形下,terms 聚合返回具有最多文档的前十个术语。
利用 size 参数返回更多的术语,最多到 search.max_buckets 限定。

如果您的数据包含100或1000个唯一术语,您可以增加 terms 聚合的 size 以返回它们所有。
如果您有更多的唯一术语并且须要它们全部,请改用 composite 聚合。

较大的 size 值利用更多内存来打算,并将全体聚合推进到 max_buckets 限定。
如果要求因 max_buckets 问题而失落败,您将知道 size 设置得太大

分片大小

为了得到更准确的结果,terms 聚合从每个分片中获取的术语数量超过了 top size。
它获取了 top shard_size 个术语,默认为 size 1.5 + 10。

这是为了处理当一个术语在一个分片上有很多文档,但在所有其他分片上刚好低于 size 阈值的情形。
如果每个分片只返回 size 个术语,聚合将为该术语返回一个部分文档计数。
因此,terms 会返回更多的术语,试图捕捉缺失落的术语。
这有助于办理问题,但仍旧很可能为术语返回部分文档计数。
这只是对付具有更分散的每个分片文档计数的术语而言。

您可以增加 shard_size 来更好地考虑这些不同的文档计数,并提高选择前几个术语的准确性。
增加 shard_size 要比增加 size 更轻量。
然而,这仍旧须要更多的字节通过网络传输,并在折衷节点上的内存中等待。

这些建议仅适用于您利用 terms 聚合的默认排序顺序的情形。
如果您按照除了文档计数以外的任何其他办法进行降序排序,请参阅排序(Order)。

shard_size 不能比 size 更小(由于这没有太多意义)。
当设置为比 size 更小时,Elasticsearch 将覆盖并将其重置为与 size 相等。

范围聚合

这是一种基于多桶值源的聚合,许可用户定义一组范围,每个范围代表一个桶。
在聚合过程中,从每个文档提取的值将与每个桶范围进行比较,并将干系/匹配的文档“桶化”。
请把稳,此聚合包含每个范围的 from 值,并打消 to 值。

GET sales/_search{ "aggs": { "price_ranges": { "range": { "field": "price", "keyed": true, "ranges": [ { "key": "cheap", "to": 100 }, { "key": "average", "from": 100, "to": 200 }, { "key": "expensive", "from": 200 } ] } } }}{ ... "aggregations": { "price_ranges": { "buckets": { "cheap": { "to": 100.0, "doc_count": 2 }, "average": { "from": 100.0, "to": 200.0, "doc_count": 2 }, "expensive": { "from": 200.0, "doc_count": 3 } } } }}

子聚合:按照价格区间分类,并且进行统计

GET sales/_search{ "aggs": { "price_ranges": { "range": { "field": "price", "ranges": [ { "to": 100 }, { "from": 100, "to": 200 }, { "from": 200 } ] }, "aggs": { "price_stats": { "stats": { "field": "price" } } } } }}{ ... "aggregations": { "price_ranges": { "buckets": [ { "key": "-100.0", "to": 100.0, "doc_count": 2, "price_stats": { "count": 2, "min": 10.0, "max": 50.0, "avg": 30.0, "sum": 60.0 } }, { "key": "100.0-200.0", "from": 100.0, "to": 200.0, "doc_count": 2, "price_stats": { "count": 2, "min": 150.0, "max": 175.0, "avg": 162.5, "sum": 325.0 } }, { "key": "200.0-", "from": 200.0, "doc_count": 3, "price_stats": { "count": 3, "min": 200.0, "max": 200.0, "avg": 200.0, "sum": 600.0 } } ] } }}

标签:

相关文章