Elasticsearch 基本查询和组合查询


Posted in Python onApril 19, 2022

Elasticsearch查询

查询分类:

基本查询:使用es内置查询条件进行查询

组合查询:把多个查询组合在一起进行复合查询

过滤:查询的同时,通过filter条件在不影响打分的情况下筛选数据

一 基本查询

#添加映射
PUT lago
{
  "mappings": {
    "properties":{
      "title":{
        "stort":true,
        "type":"text",
        "analyzer":"ik_max_word"
      },
      "company_name":{
         "stort":true,
        	"type":"keyword",
      },
      "desc":{
        "type":"text"
      },
      "comments":{
        "type":"integer"
      },
      "add_time":{
        "type":"date",
        "format":"yyy-MM-dd"
      }
    }
  }
}
#测试数据
POST lago/job
{
  "title":"python django 开发工程师",
  "company_name":"美团科技有限公司",
  "desc":"对django熟悉,掌握mysql和非关系型数据库,网站开发",
  "comments:200,
  "add_time":"2018-4-1"
}
POST lago/job
{
  "title":"python数据分析",
  "company_name":"百度科技有限公司",
  "desc":"熟悉python基础语法,熟悉数据分析",
  "comments:5,
  "add_time":"2018-10-1"
}
POST lago/job
{
  "title":"python自动化运维",
  "company_name":"上海华为",
  "desc":"熟悉python基础语法,精通Linux",
  "comments:90,
  "add_time":"2019-9-18"
}

1.1 match查询

GET lagou/job/_search
{
  "query":{
    "match":{
      "title":"python"
    }
  }
}
#因为title字段做了分词,python都能搜索出来
#搜索python网站也能搜索出来,把python和网站分成两个词
#搜索爬取也能搜索到,把爬和取分词,去搜索
#只搜取 搜不到

1.2 term查询

GET lagou/_search
{
  "query":{
    "term":{
      "title":"python"
    }
  }
}
#会拿着要查询的词不做任何处理,直接查询
#用python爬虫,查不到,用match就能查到
{
  "query":{
    "term":{
      "company_name":"美团"
    }
  }
}
#通过美团,就查询不到

1.3 terms查询

GET lagou/_search
{
  "query":{
    "terms":{
      "title":["工程师","django","运维"]
    }
  }
}
#三个词,只要有一个,就会查询出来

1.4 控制查询的返回数量(分页)

GET lagou/_search
{
  "query":{
    "match":{
      "title":"python"
    }
  },
  "form":1,
  "size":2
}
#从第一条开始,大小为2

1.5 match_all 查询

GET lagou/_search
{
  "query":{
    "match_all":{}
  }
}
#所有数据都返回

1.6 match_phrase查询

GET lagou/_search
{
  "query":{
    "match_phrase":{
      "title":{
        "query":"python系统",
        "slop":6
      }
    }
  }
}
#短语查询, 
#会把查询条件python和系统分词,放到列表中,再去搜索的时候,必须满足python和系统同时存在的才能搜出来
#"slop":6 :python和系统这两个词之间最小的距离

1.7 multi_match

GET lagou/_search
{
  "query":{
    "multy_match":{
   			"query":"python",
      	"fields":["title","desc"]
    }
  }
}
#可以指定多个字段
#比如查询title和desc这个两个字段中包含python关键词的文档
#"fields":["title^3","desc"]:权重,title中的python是desc中的三倍

1.8 指定返回的字段

GET lagou/_search
{
  "query":{
    "stored_fields":["title","company_name"]
    "match":{
   			"title":"python"
    }
  }
}
#只返回title和company_name字段
#"stored_fields":["title","company_name",'dsc'],不会返回dsc,因为我们要求stroed_fields,之前desc字段设为false(默认),不会显示

1.9 sort 结果排序

GET lagou/_search
{
  "query":{
 			"match_all":{}
  },
  "sort":[
    {
      "comments":{
        "order":"desc"
      }
    }
  ]
}
#查询所有文档,按comments按desc降序排序

1.10 range范围查询

GET lagou/_search
{
  "query":{
 			"range":{
        "comments":{
          "gte":10,
          "lte":20,
          "boost":2.0
        }
      }
  }
}
#指定comments字段大于等于10,小于等于20
#boost:权重
GET lagou/_search
{
  "query":{
 			"range":{
        "add_time":{
          "gte":"2019-10-11",
          "lte":"now",
        }
      }
  }
}
#对时间进行查询

1.11 wildcard查询

GET lagou/_search
{
  "query":{
    "wildcard":{
      "title":{
        "value":"pyth*n",
        "boost":2.0
      }
    }
  }
}
#模糊查询,title中,有pyth任意值n得都能查出来

1.12 exists存在

exists:字段包含,存在的
# 包含followers_count字段
GET user_toutiao/_search
{
  "query": {
      "bool": {
        "must": [
          {"exists": {
            "field": "followers_count"
          }}
        ]
      }
  }
}
# 不包含followers_count字段
GET user_toutiao/_count
{
  "query": {
      "bool": {
        "must_not": [
          {"exists": {
            "field": "followers_count"
          }}
        ]
      }
  }
}
# 不包含followers_count且updata_timestamp>1614221216
GET user_toutiao/_count
{
  "query": {
      "bool": {
        "must_not": [
          {
            "exists": {
              "field": "followers_count"
            }
          }
        ],
        "must": [
          {"range": {
            "updata_timestamp": {
              "gt": 1614221216
            }
          }}
        ]
      }
  }
}

二 组合查询

2.1 bool查询

#bool查询包括must should must_not filter
'''
bool:{
	"filter":[],   字段过滤
	"must":[],     所有查询条件都满足
	"should":[],   满足一个或多个
	"must_not":{}  都不满足于must相反
}
'''
# 建立测试数据
POST lago/testjob/_bulk
{"index":{"_id":1}}
{"salary":10,"title":"Python"}
{"index":{"_id":2}}
{"salary":20,"title":"Scrapy"}
{"index":{"_id":3}}
{"salary":30,"title":"Django"}
{"index":{"_id":4}}
{"salary":30,"title":"Elasticsearch"}

2.2 简单过滤查询

#select * from testjob where salary=20
GET lagou/testjob/_search
{
  "query":{
    	"bool":{
        "must":{
          "match_all":{}
        },
        "filter":{
          "term":{
            "salary":20
          }
        }
      }
  }
}

2.3 查询多个值

#查询薪资是10k或20k的
GET lagou/testjob/_search
{
  "query":{
    	"bool":{
        "must":{
          "match_all":{}
        },
        "filter":{
          "terms":{
            "salary":[10,20]
          }
        }
      }
  }
}
#select * from testjob where title="python"
GET lagou/testjob/_search
{
  "query":{
    	"bool":{
        "must":{
          "match_all":{}
        },
        "filter":{
          "term":{
            "title":"Python"
          }
        }
      }
  }
}
#title 是text字段,会做大小写转换,term不会预处理,拿着大写Python去查查不到
#可以改成小写,或者用match来查询
'''
   "filter":{
          "match":{
            "title":"Python"
          }
        }
'''
#查看分析器解析结果
GET _analyze
{
  "analyzer":"ik_max_word",
  "text":"python网络开发工程师"
}

2.4 bool过滤查询,可以做组合过滤查询

#select * from testjob where (salary=20 or title=Python) and (salary!=30)
#查询薪资等于20k或者工作为python的工作,排除价格为30k的
{
  "query":{
    "bool":{
      "should":[
        {"term":{"salary":20}},
        {"term":{"title":"python"}}
      ],
      "must_not":{
        "term":{"salary":30}
      }
    }
  }
}
#select * from testjob where title=python or (title=django and salary=30)
{
  "query":{
    "bool":{
      "should":[
        {"term":{"title":"python"}},
        {
          "bool":{
            "must":[
              {"term":{"title":"django"}},
              {"term":{"salary":30}}
            ]
          }
        }
      ]
    }
  }
}

以上就是Elasticsearch之基本查询及组合查询操作示例的详细内容!

Python 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
python连接mysql并提交mysql事务示例
Mar 05 Python
python中的五种异常处理机制介绍
Sep 02 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Python+Django搭建自己的blog网站
Mar 13 Python
python2.7安装图文教程
Mar 13 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
如何在Python中实现goto语句的方法
May 18 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
Elasticsearch 批量操作
Apr 19 #Python
Elasticsearch 数据类型及管理
Apr 19 #Python
Elasticsearch 索引操作和增删改查
Apr 19 #Python
python中redis包操作数据库的教程
Apr 19 #Python
python中pymysql包操作数据库方法
Apr 19 #Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 #Python
python中urllib包的网络请求教程
Apr 19 #Python
You might like
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP - Html Transfer Code
2006/10/09 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
php错误级别的设置方法
2013/06/17 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
python中实现精确的浮点数运算详解
2017/11/02 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
python异常处理try except过程解析
2020/02/03 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
珠宝店促销方案
2014/03/21 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
2014年化验员工作总结
2014/11/18 职场文书
银行招聘自荐信
2015/03/06 职场文书
介绍信怎么写
2015/05/05 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
SpringBoot集成Redis的思路详解
2021/10/16 Redis
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL