1、前缀查询

先输入数据:

  1. PUT /my_index/address/
  2. { "postcode": "W1 3DG" }
  3.  
  4. PUT /my_index/address/
  5. { "postcode": "W2F 8HW" }
  6.  
  7. PUT /my_index/address/
  8. { "postcode": "W1 7HW" }
  9.  
  10. PUT /my_index/address/
  11. { "postcode": "WC1N 1LZ" }
  12.  
  13. PUT /my_index/address/
  14. { "postcode": "SW5 0BE" }

为了找到所有以 W1 开始的邮编,可以使用简单的 prefix 查询:

类似于SQL: select * from table where xx like 'xx%';

  1. GET /my_index/address/_search
  2. {
  3. "query": {
  4. "prefix": {
  5. "postcode": "W1"
  6. }
  7. }
  8. }

2、短语匹配查询(match_phrase)

在执行短语匹配查询时,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变:

  1. POST /_search -d
  2. {
  3. "from":,
  4. "size":,
  5. "fields":[ "eventname"],
  6. "query":{
  7. "match_phrase":{
  8. "eventname":"Open Source"
  9. }
  10. }
  11. }

3、短语前缀匹配查询(match_phrase_prefix)

除了把查询文本的最后一个分词只做前缀匹配之外,match_phrase_prefix和match_phrase查询基本一样,参数 max_expansions 控制最后一个单词会被重写成多少个前缀,也就是,控制前缀扩展成分词的数量,默认值是50。扩展的前缀数量越多,找到的文档数量就越多;如果前缀扩展的数量太少,可能查找不到相应的文档,遗漏数据。如代码所示,能够查到eventname包含"Open Source Hack Night"的文档。

  1. POST /_search -d
  2. {
  3. "from":,
  4. "size":,
  5. "fields":[ "eventname" ],
  6. "query":{
  7. "match_phrase_prefix":{
  8. "eventname":{
  9. "query":"Open Source hac",
  10. "max_expansions":
  11. }
  12. }
  13. }
  14. }

使用match性能往往是很高的,W1–> 扫描倒排索引 –> 一旦扫描到W1,就可以停了,因为带W1的就2个doc,已经找到了 –> 没有必要继续去搜索其他的term了;

 4、通配符与正则表达式查询

与 prefix 前缀查询的特性类似, wildcard 通配符查询也是一种底层基于词的查询, 与前缀查询不同的是它允许指定匹配的正则式。它使用标准的 shell 通配符查询: ? 匹配任意字符, * 匹配 0 或多个字符。

这个查询会匹配包含 W1F 7HW 和 W2F 8HW 的文档:

  1. GET /my_index/address/_search
  2. {
  3. "query": {
  4. "wildcard": {
  5. "postcode": "W?F*HW"
  6. }
  7. }
  8. }

? 匹配 1 和 2 , * 与空格及 7 和 8 匹配。

设想如果现在只想匹配 W 区域的所有邮编,前缀匹配也会包括以 WC 开头的所有邮编,与通配符匹配碰到的问题类似,如果想匹配只以 W 开始并跟随一个数字的所有邮编, regexp 正则式查询允许写出这样更复杂的模式:

  1. GET /my_index/address/_search
  2. {
  3. "query": {
  4. "regexp": {
  5. "postcode": "W[0-9].+"
  6. }
  7. }
  8. }
  1.  

QueryBuilders.regexpQuery("postcode", "W[0-9].+");

这个正则表达式要求词必须以 W 开头,紧跟 0 至 9 之间的任何一个数字,然后接一或多个其他字符。

     wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能很差;数据在索引时的预处理有助于提高前缀匹配的效率,而通配符和正则表达式查询只能在查询时完成,尽管这些查询有其应用场景,但使用仍需谨慎。

  1.  

ES中的查询操作的更多相关文章

  1. 【Elasticsearch】ES中时间查询报错:Caused by: ElasticsearchParseException[failed to parse date field [Sun Dec 31 16:00:00 UTC 2017] with format [yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis]];

    ES中时间查询报错:Caused by: ElasticsearchParseException[failed to parse date field [Sun Dec 31 16:00:00 UTC ...

  2. 使用logstash拉取MySQL数据存储到es中的再次操作

    使用情况说明: 已经使用logstash拉取MySQL数据存储到es中,es中也创建了相应的索引,也存储了数据.假若把这个索引给删除了,再次进行同步操作的话要咋做,从最开始的数据进行同步,而不是新增的 ...

  3. ES中DSL查询相关

    elasticsearch中的API:http://www.cnblogs.com/yjf512/p/4862992.html elasticsearch查询系列:http://blog.csdn.n ...

  4. Python框架学习之Flask中的数据库操作

    数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...

  5. Python操作Mysql数据库进阶篇——查询操作详解(一)

    前面我们已经介绍了在Python3.x中如何连接一个Mysql数据库,以及怎么样对这个数据库创建一个表,增删改查表里的数据.想必大家对Mysql数据库和简单的sql语句有了一定的了解,其实sql语句博 ...

  6. Django 1.10 中文文档------3.2.2 查询操作making queries

    3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ...

  7. PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决

    环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...

  8. oracle 中对查询出来的数据进行切割、截取等操作

    oracle 中对查询出来的数据进行切割.截取等操作 最近遇到一个问题,需要把一个带有,的字符串拆分成多行.通过查询资料,这个操作需要使用以下2个关键知识: 1. REGEXP_SUBSTR函数 这个 ...

  9. Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决

    在编写一个数据库函数时,方法实现需要查询后进行修改,出现ora-14551的错误 create or replace function fun_DxcBillSn(tabType integer,ta ...

随机推荐

  1. WordPress过滤器(Filters):apply_filters和add_filter

    过滤器(Filters)对于WordPress来说是非常重要的,它极大地扩展了WordPress的定制能力,提高了WordPress的灵活性.无论是制作主题还是开发插件,我们基本上都会或多或少地使用到 ...

  2. postman 测试api接口

    安装:https://www.getpostman.com/ 谷歌插件安装需要翻墙才能访问,那么直接去官网下载pc端 代码图片: 非常简单 post: 代码图片: 剪头地方,必选

  3. windows上批量杀指定进程

    Taskkill 结束一个或多个任务或进程.可以根据进程 ID 或图像名来结束进程. 语法 taskkill [/s Computer] [/u Domain\User [/p Password]]] ...

  4. C++入门经典-例5.19-指针的引用与传递参数

    1:引用传递参数与指针传递参数能达到同样的目的.指针传递参数也属于一种值传递,其传递的是指针变量的副本.如果使用指针的引用,就可以达到在函数体内改变指针地址的目的.运行代码如下: // 5.19.cp ...

  5. JAVA_OPT理解及调优理论

    以RocketMQ的namesrv和broker启动为例,理解CMS和G1垃圾收集器下的jdk参数 CMS垃圾收集器 以RocketMQ中runserver.cmd为例,这是启动NameSrv的命令行 ...

  6. Boost学习

    使用boost function使用类成员函数作为回调函数 #include <iostream> #include <boost/function.hpp> struct M ...

  7. Java第09次实验(流与文件)

    第一次实验 0. 字节流与二进制文件 1.使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data 二进制文件与文本文件的区别 ...

  8. 如何限制修改IP地址;如何禁止显示的本地连接属性

    现在很多单位都配置了局域网,为了便于进行网络管理,同时为了提高的登录网络的速度,网管人员一般都为局域网中的每台电脑都指定了IP地址.但是在windows环境下其他用户很容易修改IP地址配置,这样就很容 ...

  9. flutter stack嵌套,appbar透明,Container设置背景图片并且图片在appbar之下

    stack嵌套 一般情况下 stack是无法嵌套,出现stack嵌套,布局就会出乱 解决方式:就是第二个stack需要确定宽高 appbar透明 AppBar( backgroundColor: Co ...

  10. Spring Web Flow 2.0 入门

    转载: https://www.ibm.com/developerworks/cn/education/java/j-spring-webflow/index.html 开始之前 关于本教程 本教程通 ...