【ES】学习4-结构化搜索
1. 结构化搜索得到的结果只有是和否,没有相似概念。
term可以实现精确值查询
curl -XGET 'localhost:9200/logstash-cowrie/_search?pretty' -d '
{"query":
{ "constant_score":{
"filter":{
"term": {"src_ip": "192.168.188.88"}
}
}
}
}'
因为term是非评分的,所以要用constant_score的方式将其转化为过滤器。注意:如果没有constant_score是会报错的。
查看字段是否可以用精确值查询,可以通过analyze API。下面是例子,可以看到ip只有一个token可以精确查询。
curl -XGET 'localhost:9200/test/_analyze?pretty' -d '{"field":"src_ip","text": "192.168.188.88"}'
#结果
{
"tokens" : [
{
"token" : "192.168.188.88",
"start_offset" : ,
"end_offset" : ,
"type" : "<NUM>",
"position" :
}
]
}
设置字段具有精确值,如果想修改已有字段只能删除后重新建立。例子:
DELETE /my_store PUT /my_store
{
"mappings" : {
"products" : {
"properties" : {
"productID" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
} }
组合过滤:
{
"bool" : {
"must" : [], #与
"should" : [], #或
"must_not" : [], #非
}
}
例子1:
curl -XGET 'localhost:9200/test/_search?pretty' -d '
{"query":
{"constant_score":{
"filter":{
"bool":{
"should":[{"term": {"src_ip": "192.168.188.88"}},{"term": {"src_ip": "1.2.3.4"}}],
"must":{"range":{"timestamp":{"gte":"2016-10-24T00:00:00", "lt":"2017-10-25T00:00:00"}}}
}
}
}
}
}'
注意单个条件和多个条件的写法。
单个条件,直接用 {}
多个条件,用 [{},{}]
注意:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/combining-filters.html中的例子中用了filtered关键字,该关键字在新版es中已经被废除了。
bool表达式的嵌套
src_ip=192.168.188.88 or (src_ip=1.2.3.4 and 2016-10-24<=time<2017-10-25)
curl -XGET 'localhost:9200/test/_search?pretty' -d '
{"query":
{"constant_score":{
"filter":{
"bool":{
"should":[
{"term": {"src_ip": "192.168.188.88"}},
{"bool":{
"must":
[{"term":{"src_ip": "1.2.3.4"}},
{"range":{"timestamp":{"gte":"2016-10-24T00:00:00", "lt":"2017-10-25T00:00:00"}}}]
}
}]
}
}
}
}
}'
查找多个精确值 terms
{
"terms": {
"src_ip": ["1.2.3.4","5.6.7.8"]
}
}
注意,term和terms表示包含,而不是相等
{ "term" : { "tags" : "search" } } 可以匹配下面两个文档
{ "tags" : ["search"] }
{ "tags" : ["search", "open_source"] }
如果想要完全一样,必须用其他字段增加约束。
范围range
"range" : {
"price" : {
"gte" : ,
"lte" :
}
}
日期范围可以在日期上做运算
"range" : {
"timestamp" : {
"gt" : "2014-01-01 00:00:00",
"lt" : "2014-01-01 00:00:00||+1M"
}
}
"range" : {
"timestamp" : {
"gt" : "now-1h"
}
}
字符串范围:(不推荐,会很慢)
range 查询同样可以处理字符串字段, 字符串范围可采用 字典顺序(lexicographically) 或字母顺序(alphabetically)。
- 5, 50, 6, B, C, a, ab, abb, abc, b 字典范围排序
"range" : {
"title" : {
"gte" : "a",
"lt" : "b"
}
}
数字和日期字段的索引方式使高效地范围计算成为可能。 但字符串却并非如此,要想对其使用范围过滤,Elasticsearch 实际上是在为范围内的每个词项都执行 term 过滤器,这会比日期或数字的范围过滤慢许多。
字符串范围在过滤 低基数(low cardinality) 字段(即只有少量唯一词项)时可以正常工作,但是唯一词项越多,字符串范围的计算会越慢。
存在查询:exists
GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : { "field" : "tags" }
}
}
}
}
缺失查询:missing
GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter": {
"missing" : { "field" : "tags" }
}
}
}
}
注意下面这个例子
{
"name" : {
"first" : "John",
"last" : "Smith"
}
}
查询
{
"exists" : { "field" : "name" }
}
实际执行的是
{
"bool": {
"should": [
{ "exists": { "field": "name.first" }},
{ "exists": { "field": "name.last" }}
]
}
}
这也就意味着,如果 first 和 last 都是空,那么 name 这个命名空间才会被认为不存在。
【ES】学习4-结构化搜索的更多相关文章
- ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分
一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...
- ElasticSearch常用结构化搜索
最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数 ...
- Elasticsearch结构化搜索与查询
Elasticsearch 的功能之一就是搜索,搜索主要分为两种类型,结构化搜索和全文搜索.结构化搜索是指有关查询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可 ...
- Elasticsearch系列---结构化搜索
概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...
- Elasticsearch 结构化搜索、keyword、Term查询
前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...
- ElasticSearch 2 (13) - 深入搜索系列之结构化搜索
ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...
- ElasticSearch 结构化搜索
1.介绍 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作. 比较常见的操作 ...
- elasticsearch 深入 —— 结构化搜索
结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作 ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
随机推荐
- banner轮播无缝滚动 jq代码
HTML: <div class="box"> <ul> <li>11111</li> <li>22222</li ...
- DIV或者DIV里面的图片水平与垂直居中的方法
<div class=“box”> <img /> </div> 水平居中的常用方式: text-align:center ——这可以实现子元素字体,图片的水平居中 ...
- 内置窗口 pyqt5
1.使用Qt Designer设计三个窗口 注意:在主窗口中需要添加一个girdLayout 2.创建**.py from PyQt5.QtWidgets import QMainWindow, QA ...
- Python字符编码以及循环机制介绍
Python字符编码以及循环机制介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为一名运维人员就得不断的学习,那么如何身为运维的你是否已经嗅探已经很火的Python编程啦?大 ...
- PHP5.5+Nginx1.9
1. 安装Nginx:http://www.cnblogs.com/vurtne-lu/p/7010065.html 2. 编译安装 [root@zabbix opt]# wget http://cn ...
- bzoj千题计划306:bzoj2342: [Shoi2011]双倍回文 (回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=2342 解法一: 对原串构建回文自动机 抽离fail树,从根开始dfs 设len[x]表示节点x表示 ...
- GUI之ScrollView的使用
ScrollView ScrollView是unity提供的一个方便的滚动视图. 组成 ScrollView由四个部分组成: ViewPort 和 Content ScrollView: 视图范围,C ...
- Linux配置Tomcat步骤mv apache-tomcat-7.0.82 tomcat
(一)安装JAVA1.检查java环境 java -version,不存在安装.2.yum -y list java* Loaded plugins: fastestmirror, langpacks ...
- 20155204 2016-2017-2 《Java程序设计》第6周学习总结
20155204 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 一切皆对象,输入输出也是类,线程也是 String对象的trim方法去掉首尾空格和空字符 f ...
- apache - http
apahce 添加模块编译 httpd # so模块用来提供DSO支持的apache核心模块 # 如果编译中包含任何DSO模块,则mod_so会被自动包含进核心. # 如果希望核心能够装载DSO, ...