elk笔记13--Queries-term-level queries

2023-11-01

1 term-level 查询简介

基于结构化数据中准确的值,用户可以使用term级别的查询来搜索文档。常见结构化数据包括日期范围、IP地址、价格、产品IDs等。

与全文检索不同,项级别的查询不分析查找的项,它会匹配存储在某个字段中的具体项。当查询的项为keyword字段时,它将使用 normalizer 属性来正则化搜索的项。

该范畴内的查询包括 exists查询、fuzzy查询、ids查询、prefix查询、range查询、regexp查询、term查询、terms查询、terms_set查询、type查询、wildcard查询 等11类。

2 term-level 查询类型

2.1 exists query

该查询返回包含一个值的文档,且该值不能为null 或 [].

获取包含字段cc的文档
GET test/_search
{
  "query": {
    "exists": {
      "field": "cc"
    }
  }
}
可以通过must_not 获取cc字段不存在的文档
GET test/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "cc"
          }
        }
      ]
    }
  }
}

2.2 fuzzy query

返回包含和搜索项相似项的文档,该相似性是由 Levenshtein edit distance 来评估的。
编辑距离指的是从一个项变为另外一个项所需要的单字符改变的数量,这些改变可以包括:
改变一个字符(box → fox)
去掉一个字符 (black → lack)
插入一个字符 (sic → sick)
调换2个相连字符的位置 (act → cat)

kibana_sample_data_ecommerce 中有Mary用户,根据上述改变可知:mery,ary,marys,mray都是mary的相似项。
GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "query": {
    "fuzzy": {
      "user": {
        "value": "mery"
      }
    }
  },
  "size": 1
}

2.3 ids query

基于文档的id来返回文档,该IDs存放在 _id 字段中。
该方式比较适合查找自定义 _id 字段的文档。

GET test/_search
{
  "query": {
    "ids": {
      "values": ["1","3"]
    }
  }
}

2.4 prefix query

根据字段指定的前缀来查找文档。
prefix 的 顶层参数为field,即指定field;
field 的 顶层参数为value,即为前缀字符或者字符串。

正常情况下prefix 查询效率不高,可以在mapping中添加 index_prefixes 属性来提高搜索速度。如果设置为enabled,则指定的字段会多出2-5个字符的前缀,这让es执行前缀查询更加快,但是占用更多的存储空间。

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "query": {
    "prefix": {
      "user": {
        "value": "ma"
      }
    }
  },
  "size": 1
}

2.5 range query

根据指定字段的范围来查找文档。
比较方式又:gt(大于),lt(小于),gte(大于等于),lte(小于等于)

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "size": 0, 
  "query": {
    "range": {
      "taxful_total_price": {
        "gt": 100,
        "lt": 200
      }
    }
  }
}

2.6 regexp query

根据指定字段,找到符合特定正则表达的文档。
顶层参数 为filed,field子参数包括value,flags,max_determinized_states,rewrite;
其中value为正则内容;
flags表示可以使用的正则表达操作符,默认ALL为全部可用,regexp-optional-operators
max_determinized_states 表示为自动机状态的么最大数量,默认值为10000;
rewrite 决定来相关度分数计算方式,Lucene 如何将原始query转化为bool query或者bit set;

GET kibana_sample_data_ecommerce/_search
{
    "query": {
        "regexp": {
            "user": {
                "value": "el.*a",
                "flags" : "ALL",
                "max_determinized_states": 10000,
                "rewrite": "constant_score"
            }
        }
    }
}

2.7 term query

根据某个字段,返回字段值和指定值相同的文档;
顶层参数 为filed,field子参数包括value,boost;
其中,boost值默认为1.0;

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "size": 1, 
  "query": {
    "term": {
      "user": {
        "value": "mary"
      }
    }
  }
}
"user": {"value": "mary"} 也可以调整为 "user": "mary",但是调整后无法使用boost参数;
注意:term不适合对text类型搜索,通常不会搜索到想要的结果,如果使用全文搜索则应该使用match来查找;

2.8 terms query

根据某个字段,只要和指定的某个值相同即可返回文档;
顶层参数 field 和 boost;
field 中为目标值数组,es中限制数组最大值为 65536;

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "size": 1, 
  "query": {
    "terms": {
      "user":[ "mary","abd"]
    }
  }
}

2.9 terms_set query

根据某个字段,返回文档中必须包括最少数量的特定值;我们可以通过一个字段或者script来定义最小匹配数量。
顶层参数field,子参数为terms(必选项),minimum_should_match_field,minimum_should_match_script。

PUT /job-candidates
{
    "mappings": {
        "properties": {
            "name": {
                "type": "keyword"
            },
            "programming_languages": {
                "type": "keyword"
            },
            "required_matches": {
                "type": "long"
            }
        }
    }
}
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
}
GET /job-candidates/_search
{
    "query": {
        "terms_set": {
            "programming_languages": {
                "terms": ["c++", "java", "php"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}
minimum_should_match_field 对应的值必须为指定的字段,不能为随机定义的数值;
也可以使用script的方式:
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
            }
        }
    }
}

2.10 type query

该查询返回指定type类型的文档。
es7.0 之后废弃了type类型,一个index只能有一个type类型,因此这类查询后续意义不太大。

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
  "query": {
    "type": {
      "value": "_doc"
    }
  }
}

2.11 wildcard query

Returns documents that contain terms matching a wildcard pattern.
根据某个字段,返回包括特定通配符的文档。当前通配符只支持 ? 和 * 2种。
顶层参数field,子参数value,boost,rewrite。

GET kibana_sample_data_ecommerce/_search
{
  "track_total_hits": true,
    "query": {
        "wildcard": {
            "user": {
                "value": "mar?*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

3 说明

  1. 参考文档
    term-level-queries
    更多DSL 查询内容见elk笔记13–Query DSL
  2. 测试环境
    本文测试案例对应的 es 版本为7.2.1
    测试数据为kibana自带数据,Home->Add data->Sample data->Sample eCommerce orders
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elk笔记13--Queries-term-level queries 的相关文章

  • sklearn 和大型数据集

    我有一个 22 GB 的数据集 我想在我的笔记本电脑上处理它 当然我无法将其加载到内存中 我经常使用 sklearn 但数据集要小得多 在这种情况下 经典方法应该是这样的 只读取部分数据 gt 部分训练你的估计器 gt 删除数据 gt 读取
  • 在 Google bigquery 中转换数据 - 提取文本、将其拆分为多列并旋转数据

    我在大查询中有一些博客数据 我需要对其进行转换以使其更易于使用和查询 数据如下 我想提取并转换数据在 Results 之后的大括号内 蓝色 数据的形式为 d PQ KL d 结果数组中可以有 1 20 多个条目 我只对前 16 个条目感兴趣
  • 如何加载hive表中的多行列数据?具有换行符的列

    我在 Excel 文件中有一个列 不是最后一列 其中包含跨越几行的数据 列的某些单元格为空白 有些单元格具有单行条目 当保存为 CSV 文件或制表符分隔 txt 与 Excel 时 所有多行数据和少数单行条目都会在双引号中生成 所有空白字段
  • SparkR 作业 100 分钟超时

    我编写了一个有点复杂的sparkR脚本并使用spark submit运行它 脚本基本上做的是逐行读取基于 hive impala parquet 的大表 并生成具有相同行数的新 parquet 文件 但似乎工作在大约 100 分钟后停止 这
  • 外部混洗:从内存中混洗大量数据

    我正在寻找一种方法来整理内存不适合的大量数据 大约 40GB 我有大约 3000 万个可变长度的条目 存储在一个大文件中 我知道该文件中每个条目的开始和结束位置 我需要对内存中不适合的数据进行洗牌 我想到的唯一解决方案是对包含以下数字的数组
  • 为什么布尔字段在 Hive 中不起作用?

    我的配置单元表中有一个数据类型为布尔值的列 当我尝试从 csv 导入数据时 它存储为 NULL 这是我的示例表 CREATE tABLE if not exists Engineanalysis EngineModel String Eng
  • Spark 提交 java.lang.IllegalArgumentException:无法从空字符串创建路径

    当我执行 Spark 提交时 我收到此错误 java lang IllegalArgumentException 无法从空字符串创建路径 我使用的是spark版本2 4 7 hadoop版本3 3 0 集成开发环境 JDK 8 首先我遇到了
  • R 中用于超大型数据集处理和机器学习的推荐包 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 看起来 R 确实是为处理可以完全拉入内存的数据集而设计的 建议使用哪些 R 包来对无法拉入内存的超大型数
  • 在 MATLAB 中处理大型 CSV 文件

    我必须处理一个最大 2GB 的大 CSV 文件 更具体地说 我必须将所有这些数据上传到 mySQL 数据库 但在我必须对此进行一些计算之前 所以我需要在 MATLAB 中完成所有这些操作 我的主管也想在 MATLAB 中完成 因为他熟悉MA
  • 如何从 HIVE 中的日期减去月份

    我正在寻找一种方法来帮助我从 HIVE 中的日期中减去月份 我有个约会2015 02 01 现在我需要从这个日期减去 2 个月 这样结果应该是2014 12 01 你们能帮我一下吗 select add months 2015 02 01
  • 大稀疏矩阵到三角矩阵 R

    我在 R 中有一个非常大的 大约 9100 万个非零条目 sparseMatrix 如下所示 gt myMatrix a b c a 1 2 b 1 c 2 我想将其转换为三角矩阵 上或下 但是当我尝试 myMatrix myMatrix
  • Hive 中的倾斜表

    我正在学习蜂巢并遇到倾斜的表格 帮助我理解它 Hive 中的倾斜表是什么 我们如何创建倾斜表 它如何影响性能 Hive 中的倾斜表是什么 倾斜表是一种特殊类型的表 其中经常出现的值 严重倾斜 被分成单独的文件 其余的值转到其他文件 我们如何
  • 如何在Hadoop中设置数据块大小?改变它有好处吗?

    如果我们可以更改 Hadoop 中的数据块大小 请告诉我如何操作 更改块大小是否有利 如果是 请告诉我为什么以及如何更改 如果没有 请告诉我为什么以及如何 您可以随时更改块大小 除非dfs blocksize参数在 hdfs site xm
  • 分段读取 CSV 文件的策略?

    我的计算机上有一个中等大小的文件 4GB CSV 但没有足够的 RAM 来读取该文件 64 位 Windows 上为 8GB 在过去 我只是将其加载到集群节点上并将其读入 但我的新集群似乎任意将进程限制为 4GB RAM 尽管每台机器的硬件
  • 如何使用 Spark 处理一系列 hbase 行?

    我正在尝试使用 HBase 作为 Spark 的数据源 因此 第一步是从 HBase 表创建 RDD 由于 Spark 使用 hadoop 输入格式 我可以找到一种通过创建 rdd 来使用所有行的方法http www vidyasource
  • 将 data.frame 转换为 ff

    我想将 data frame 转换为 ff 对象 并使用 as ffdf 进行描述here https stackoverflow com questions 15787221 how can i apply ffdf to non ato
  • HRegionServer 显示“错误告诉主机我们已经启动”。显示套接字异常:参数无效

    我正在尝试在 3 台 centos 机器上创建一个 hbase 集群 Hadoop v 2 8 0 已启动并在我配置的 HBase v 1 2 5 上运行 Hbase 启动正常 它启动了 HMaster 和区域服务器 但仍然在区域服务器和
  • 如何确定 HBase 表的大小?有什么命令可以这样做吗?

    我的 Hbase shell 上有多个表 我想将它们复制到我的文件系统上 有些表超过 100GB 但是 我的本地文件系统中只剩下 55GB 可用空间 因此 我想知道 hbase 表的大小 以便我可以仅导出小尺寸的表 任何建议表示赞赏 谢谢
  • 检查 Spark 中矩阵每列中唯一值的数量

    我有一个 csv 文件当前存储为 Spark 中的数据框 scala gt df res11 org apache spark sql DataFrame 2013 03 25 12 49 36 000 string OES PSI603
  • (R 错误)错误:cons 内存耗尽(达到限制?)

    我正在处理大数据 并且有一个 70GB 的 JSON 文件 我正在使用 jsonlite 库将文件加载到内存中 我尝试过 AWS EC2 x1 16large 机器 976 GB RAM 来执行此负载 但 R 因错误而中断 Error co

随机推荐