草庐IT

ElasticSearch学习(五)ElasticSearch基本操作:精确查询

如我般骄傲 2023-09-01 原文

六、ElasticSearch基本操作:精确查询

ES最关键的地方就在于查询

一.Query String

1、查询所有数据

GET 索引名称/_search

2、带参查询

GET 索引名称/_search/q=:值
#例,只会去date里查询符合2022-06-01GET product/_search?q=date:2022-06-01

3、分页查询

#查询XX索引,从位置0开始,查询十条,以price排desc的序。
GET  索引名称/_search?from=0&size=10&sort=:price:desc

5、全文检索(在所有有索引的字段上进行检索)

#相当于在所有有索引的字段查询2022-06-01
GET product/_search?q=2022-06-01

6、数据结构查询

GET 索引名称/_mapping

二.DSL

关于查询,理解match和term的区别是非常重要的。
match和term最大的差别在于,查询条件是否分词。
举例说明
“xiaomi phone”,如果使用match查询是会分成两个词:xiaomi+phone,如果使用的是term则查询条件不分词:xiaomi phone。

1、全文检索match(match和term为参数条件)

1.match

match查询的是key对应的value,这里的key和value都会分词。

GET test/_search 
{
  "query": {
    "match": {
      "key": "value"
    }
  }
}

2.match_all

查询全部

GET test/_search 
{
  "query": {
    "match_all": {}
  }
}

3.multi_match

多字段查询,查询name或type中包含phone的数据

GET test/_search 
{
  "query": {
    "multi_match": {
      "query": "phone",
      "fields": ["name","type"]
    }
  }
}

4.match_phrase

这个是最复杂的match查询,比较像term但是又和term不一样,以ni shi zhu为查询条件举例,ni shi zhu会被分词为"ni",“shi”,“zhu”,但是分词具有顺序,对应的value中必须包含这三个分词+顺序没有被打乱+中间没有插入任何词

GET test/_search 
{
  "query": {
   "match_phrase": {
     "word": "ni shi zhu"
   }
  }
}

2、精确查询term(查询条件不分词)(match和term为参数条件)

1.term

这里的查询条件不会分词,会按"ni shi zhu"直接在word里进行查询。

GET test/_search 
{
  "query": {
   "term": {
     "word": "ni shi zhu"
   }
  }
}

2.term与keyword

#数据类型如下
"text": {
   "type": "text",
   "fields": {
   "keyword": {
     "type": "keyword",
     "ignore_above": 256
     }
   }
}

对于text类型的字段,如果是"ni shi zhu",则会被分解为"ni",“shi”,"zhu"进行保存,只有在keyword字段才会查询到全称(keyword默认之为256,小于256字段长度取所有值,大于256则只截取前256个字符。)

GET test/_search 
{
  "query": {
   "term": {
     "text.keyword": "xiaomi nfc phone"
   }
  }
}

3.terms

#查询字段为FIELD,值为VALUE1VALUE2的数据。
GET test/_search
{
  "query": {
    "terms": {
      "FIELD": [
        "VALUE1",
        "VALUE2"
      ]
    }
  }
}

3、范围查询range

#查询字段为FIELD,大于等于10并小于等于20的所有数据。
#gt=大于 gte=大于等于
#lt=小于 lte=小于等于
GET test/_search 
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

4、filter和query的区别

1.查询对比

filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。
query,会计算每个document相对于搜索条件的相关度,并按照相关度进行排序。
一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query;如果你只是要根据一些条件筛选出一部分数据,不关注排序,那么使用filter。

2.性能对比

filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的机制,自动cache最常使用filter的数据。
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果。

5、组合查询bool

bool可以组合多个查询条件,bool查询是采用more_matches_is_better的机制,因此满足Must和should子句的文档会合并起来计算分值。

1.must:必须满足

must中可以使用term或者match,这里主要列举写法,而且写法基本上一样,只是修改了不同的条件。

GET test/_search 
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }}
      ]
    }
  }
}

GET test/_search 
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }},
        {
          "match_phrase": {
            "FIELD": "PHRASE"
          }
        }
      ]
    }
  }
}

2.should:或

GET test/_search 
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }},
        {
          "match_phrase": {
            "FIELD": "PHRASE"
          }
        }
      ]
    }
  }
}

3.must_not:必须不,不计分

GET test/_search 
{
  "query": {
    "bool": {
      "must_not": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }},
        {
          "match_phrase": {
            "FIELD": "PHRASE"
          }
        }
      ]
    }
  }
}

4.filter

GET test/_search 
{
  "query": {
    "bool": {
      "filter": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }},
        {
          "match_phrase": {
            "FIELD": "PHRASE"
          }
        }
      ]
    }
  }
}

5.minimum_should_match

GET test/_search 
{
  "query": {
    "bool": {
      "minimum_should_match": [
        {"term": {
          "FIELD": {
            "value": "VALUE"
          }
        }},
        {
          "match_phrase": {
            "FIELD": "PHRASE"
          }
        }
      ]
    }
  }
}

有关ElasticSearch学习(五)ElasticSearch基本操作:精确查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  9. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  10. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

随机推荐