Elasticsearch

ElasticSearch基本查询

基本语法

GET /索引库名/_search
{"query":{"查询类型":{"查询条件":"查询条件值"}}
}

这里的query代表一个查询对象,里面可以有不同的查询属性

  • 查询类型:

    • 例如:match_all, matchterm , range 等等
  • 查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解

查询所有(match_all)

示例:

GET /heima/_search
{"query":{"match_all": {}}
}
  • query:代表查询对象
  • match_all:代表查询所有

结果:

{"took": 2,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 1,"hits": [{"_index": "heima","_type": "goods","_id": "2","_score": 1,"_source": {"title": "大米手机","images": "http://image.leyou.com/12479122.jpg","price": 2899}},{"_index": "heima","_type": "goods","_id": "r9c1KGMBIhaxtY5rlRKv","_score": 1,"_source": {"title": "小米手机","images": "http://image.leyou.com/12479122.jpg","price": 2699}}]}
}
  • took:查询花费时间,单位是毫秒
  • time_out:是否超时
  • _shards:分片信息
  • hits:搜索结果总览对象
    • total:搜索到的总条数
    • max_score:所有结果中文档得分的最高分
    • hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
      • _index:索引库
      • _type:文档类型
      • _id:文档id
      • _score:文档得分
      • _source:文档的源数据

匹配查询(match)

我们先加入一条数据,便于测试:

PUT /heima/goods/3
{"title":"小米电视4A","images":"http://image.leyou.com/12479122.jpg","price":3899.00
}

现在,索引库中有2部手机,1台电视:

  • or关系

match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

GET /heima/_search
{"query":{"match":{"title":"小米电视"}}
}

结果:

"hits": {"total": 2,"max_score": 0.6931472,"hits": [{"_index": "heima","_type": "goods","_id": "tmUBomQB_mwm6wH_EC1-","_score": 0.6931472,"_source": {"title": "小米手机","images": "http://image.leyou.com/12479122.jpg","price": 2699}},{"_index": "heima","_type": "goods","_id": "3","_score": 0.5753642,"_source": {"title": "小米电视4A","images": "http://image.leyou.com/12479122.jpg","price": 3899}}]
}

在上面的案例中,不仅会查询到电视,而且与小米相关的都会查询到,多个词之间是or的关系。

  • and关系

某些情况下,我们需要更精确查找,我们希望这个关系变成and,可以这样做:

GET /heima/_search
{"query":{"match": {"title": {"query": "小米电视","operator": "and"}}}
}

结果:

{"took": 2,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 0.5753642,"hits": [{"_index": "heima","_type": "goods","_id": "3","_score": 0.5753642,"_source": {"title": "小米电视4A","images": "http://image.leyou.com/12479122.jpg","price": 3899}}]}
}

本例中,只有同时包含小米电视的词条才会被搜索到。

  • or和and之间?

orand 间二选一有点过于非黑即白。 如果用户给定的条件分词后有 5 个查询词项,想查找只包含其中 4 个词的文档,该如何处理?将 operator 操作符参数设置成 and 只会将此文档排除。

有时候这正是我们期望的,但在全文搜索的大多数应用场景下,我们既想包含那些可能相关的文档,同时又排除那些不太相关的。换句话说,我们想要处于中间某种结果。

match 查询支持 minimum_should_match 最小匹配参数, 这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

GET /heima/_search
{"query":{"match":{"title":{"query":"小米曲面电视","minimum_should_match": "75%"}}}
}

本例中,搜索语句可以分为3个词,如果使用and关系,需要同时满足3个词才会被搜索到。这里我们采用最小品牌数:75%,那么也就是说只要匹配到总词条数量的75%即可,这里3*75% 约等于2。所以只要包含2个词条就算满足条件了。

结果:

多字段查询(multi_match)

multi_matchmatch类似,不同的是它可以在多个字段中查询

GET /heima/_search
{"query":{"multi_match": {"query":    "小米","fields":   [ "title", "subTitle" ]}}
}

本例中,我们会在title字段和subtitle字段中查询小米这个词

词条匹配(term)

term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串

GET /heima/_search
{"query":{"term":{"price":2699.00}}
}

结果:

{"took": 2,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "heima","_type": "goods","_id": "r9c1KGMBIhaxtY5rlRKv","_score": 1,"_source": {"title": "小米手机","images": "http://image.leyou.com/12479122.jpg","price": 2699}}]}
}

多词条精确匹配(terms)

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:

GET /heima/_search
{"query":{"terms":{"price":[2699.00,2899.00,3899.00]}}
}

结果:

{"took": 4,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 3,"max_score": 1,"hits": [{"_index": "heima","_type": "goods","_id": "2","_score": 1,"_source": {"title": "大米手机","images": "http://image.leyou.com/12479122.jpg","price": 2899}},{"_index": "heima","_type": "goods","_id": "r9c1KGMBIhaxtY5rlRKv","_score": 1,"_source": {"title": "小米手机","images": "http://image.leyou.com/12479122.jpg","price": 2699}},{"_index": "heima","_type": "goods","_id": "3","_score": 1,"_source": {"title": "小米电视4A","images": "http://image.leyou.com/12479122.jpg","price": 3899}}]}
}

结果过滤

默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source的过滤

直接指定字段

示例:

GET /heima/_search
{"_source": ["title","price"],"query": {"term": {"price": 2699}}
}

返回的结果:

{"took": 12,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "heima","_type": "goods","_id": "r9c1KGMBIhaxtY5rlRKv","_score": 1,"_source": {"price": 2699,"title": "小米手机"}}]}
}

指定includes和excludes

我们也可以通过:

  • includes:来指定想要显示的字段
  • excludes:来指定不想要显示的字段

二者都是可选的。

示例:

GET /heima/_search
{"_source": {"includes":["title","price"]},"query": {"term": {"price": 2699}}
}

与下面的结果将是一样的:

GET /heima/_search
{"_source": {"excludes": ["images"]},"query": {"term": {"price": 2699}}
}

高级查询

布尔组合(bool)

bool把各种其它查询通过must(与)、must_not(非)、should(或)的方式进行组合

GET /heima/_search
{"query":{"bool":{"must":     { "match": { "title": "大米" }},"must_not": { "match": { "title":  "电视" }},"should":   { "match": { "title": "手机" }}}}
}

结果:

{"took": 10,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 0.5753642,"hits": [{"_index": "heima","_type": "goods","_id": "2","_score": 0.5753642,"_source": {"title": "大米手机","images": "http://image.leyou.com/12479122.jpg","price": 2899}}]}
}

范围查询(range)

range 查询找出那些落在指定区间内的数字或者时间

GET /heima/_search
{"query":{"range": {"price": {"gte":  1000.0,"lt":   2800.00}}}
}

range查询允许以下字符:

操作符 说明
gt 大于
gte 大于等于
lt 小于
lte 小于等于

模糊查询(fuzzy)

我们新增一个商品:

POST /heima/goods/4
{"title":"apple手机","images":"http://image.leyou.com/12479122.jpg","price":6899.00
}

fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2:

GET /heima/_search
{"query": {"fuzzy": {"title": "appla"}}
}

上面的查询,也能查询到apple手机

我们可以通过fuzziness来指定允许的编辑距离:

GET /heima/_search
{"query": {"fuzzy": {"title": {"value":"appla","fuzziness":1}}}
}

过滤(filter)

条件查询中进行过滤

所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

GET /heima/_search
{"query":{"bool":{"must":{ "match": { "title": "小米手机" }},"filter":{"range":{"price":{"gt":2000.00,"lt":3800.00}}}}}
}

注意:filter中还可以再次进行bool组合条件过滤。

无查询条件,直接过滤

如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有 filter 语句的 bool 查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

GET /heima/_search
{"query":{"constant_score":   {"filter": {"range":{"price":{"gt":2000.00,"lt":3000.00}}}}
}

排序

单字段排序

sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方式

GET /heima/_search
{"query": {"match": {"title": "小米手机"}},"sort": [{"price": {"order": "desc"}}]
}

多字段排序

假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:

GET /goods/_search
{"query":{"bool":{"must":{ "match": { "title": "小米手机" }},"filter":{"range":{"price":{"gt":200000,"lt":300000}}}}},"sort": [{ "price": { "order": "desc" }},{ "_score": { "order": "desc" }}]
}

ElasticSearch_查询过滤排序相关推荐

  1. MYSQL 查询数据排序数据和分组数据

    在mysql查询过程中,可以对数据进行过滤,也可以对数据进行排序,可以对数据分组,下面分别讲述排序数据和分组数据例子.1,数据的排序 使用 ORDER BYselect * from where id ...

  2. python-DRF_限流Throttling_自定义频率类_内置频率类使用_过滤排序功能

    DRF-Django rest framework 认证权限频率 1. 限流Throttling 可以对接口访问的频次进行限制,以减轻服务器压力 一般用于付费购买次数,投票等场景使用 1. 自定义频率 ...

  3. oracle分页排序查询,Oracle分页查询中排序与效率问题解决方法详解

    本文将结合作者近日工作中,在ORACLE数据库分页查询时,遇到一个小问题,为大家讲解如何解决Oracle分页查询中排序与效率问题. 原始未分页查询Sql代码如下: select ROWNUM rn, ...

  4. Tas02 基础查询与排序

    二.基础查询与排序 2.1语句基础 SELECT语句: SELECT <列名>, ... FROM <表名>: WHERE语句: SELECT通过WHERE来指定查询条件 SE ...

  5. MySql-基础查询与排序

    基础查询与排序 2.1 SELECT语句基础 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思.通过SELECT语句查询并选 ...

  6. 窥探SQL: 2.基础查询与排序

    窥探SQL: 2.基础查询与排序 基础查询 语句 关键词 SELECT WHERE FROM, As, DISTINCT 基本法则 运算符 算术运算符 比较运算符 逻辑运算符 NOT AND 和 OR ...

  7. SQL条件查询,分组查询,排序查询,分页查询

    DQL查询操作(条件查询,分组查询,排序查询,分页查询) 文章目录 DQL查询操作(条件查询,分组查询,排序查询,分页查询) 一.查询语法 二.基础查询 三.条件查询 四.排序查询 五.分组查询 六. ...

  8. oracle 分组 排名,Oracle数据库之分组查询及排序

    分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...

  9. 阿里云天池龙珠计划SQL入门与实践 | Task02 SQL基础查询与排序

    本文为阿里云天池学习<SQL入门与实践>第二讲学习笔记,同时该讲内容基于<SQL基础教程>第二章(查询基础)及第三章(聚合与排序). SQL基础查询与排序 一.SELECT语句 ...

最新文章

  1. python正则取字符串日期_python 正则表达式获取字符串中所有的日期和时间
  2. --7、学期表(表)
  3. bootstrap导航
  4. android socket 框架c#,C#与Android Socket通信
  5. 西南交大计算机辅助制造a卷,计算机辅助制造 西南交大作业.doc
  6. CSSSCSS的学习笔记
  7. 为什么这款 CPU 在亚马逊上卖得最火?
  8. elasticsearch的javaAPI之query
  9. fds文件的处理方法
  10. 网页中MP4视频格式要求
  11. 外贸常用术语_常见国际贸易专业术语有哪些?
  12. ZBrush中的法线贴图你知道吗?
  13. 科猫网项目总结(基于SSM框架)
  14. 基于51单片机的心率脉搏计检测系统
  15. MyEclipse打不开项目下的jsp文件,或是打开jsp文件报错!
  16. 删除桌面上的两个IE图标
  17. Spring简化Java开发_java开发如何用spring简化?详细图解
  18. Bootstrap样式之表单样式
  19. 如何分析资产负债表、损益表、现金流量表、财务报告
  20. (转)程序员专属壁纸

热门文章

  1. nginx FastCGI错误Primary script unknown解决办法
  2. 机房网络光纤扩容施工
  3. 看看C# 6.0中那些语法糖都干了些什么(终结篇)
  4. AngularJS 使用ngOption实现下拉列表
  5. Jquery元素判断是否存在
  6. 游戏开发中的图像生成
  7. Essential Studio for mobile MVC中2种添加移动图表到MVC3 ASPX应用程序中的方法
  8. 搜索引擎平台化的构想
  9. C#常用正则表达式总结
  10. 用云函数快速实现图片爬虫