Elasticsearch: 使用URI Search
在Elasticsearch中,我们可以使用_search终端进行搜索。这个在我之前的文章 “开始使用Elasticsearch (2)” 中有很多的描述。针对这种搜索,我们可以使用强大的DSL进行搜索。在Elasticsearch中,还有一类是基于URI的搜索。对于这种它可以很方便地直接在浏览器中的地址栏或命令行中直接使用。 使用此模式执行搜索时,并非所有搜索选项都公开,但是对于快速的“curl tests”来说,它可能很方便。在今天的文章中,我们来做一个简单的描述。同时我需要指出来的是,这里的语法和Kibana中的Search Bar搜索语法是一样的。
安装Elastic Stack
准备好数据
为了说明问题的方便,我们首先在Kibana中使用如下的bulk指令来创建我们的twitter索引。
POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}, "DOB":"1980-12-01"}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}, "DOB":"1981-12-01"}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}, "DOB":"1982-12-01"}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}, "DOB":"1983-12-01"}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}, "DOB":"1984-12-01"}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}, "DOB":"1985-12-01"}
这里总共有6条数据。

下面,我们来进行一些查询的动作。
搜索数据
首先,我们做一个简单的搜索,我们可以在浏览器中打入如下的命令:
GET twitter/_search?q=user:张三

我们通过 “q=user:张三” 查询到我们所需要的文档。在有的时候这是一种非常快的查询方式。我们也可以在浏览器中直接打入一个这样的URI:
http://localhost:9200/_search?q=user:%E5%BC%A0%E4%B8%89&pretty

或者在命令行中:

下面,我们将使用Kibana来展示使用URI搜索的一些最基本的特点。
URI查询使用语法根据运算符(例如OR,AND或NOT)解析和拆分提供的查询字符串
我们想使用sort来对数据进行排序:
GET twitter/_search?q=city:"北京"&sort=DOB:desc

上面显示了所有来自北京的用户,并按照出生年月降序排列。
假如我们只想在_source里显示年龄,DOB及城市信息,我们可以这么做:
GET twitter/_search?q=city:"北京"&sort=DOB:desc&_source=city,age,DOB

从上面的显示可以看出来,我们只看到有三个字段显示出来。加入我们想分页,每个页只有2个文档,那么我们可以这么做:
GET twitter/_search?q=city:"北京"&sort=DOB:desc&_source=city,age,DOB&size=2

从上面的显示上我们可以看出来,只有两个文档被显示出来尽管总共有5个文档满足条件。
假如这个时候,我们想对city为“上海”和“北京”的所有用户都来统计一下,那么我们可以使用如下的语句:
GET twitter/_search?q=city:("北京" or "上海") &sort=DOB:desc&_source=city,age,DOB&size=2

显然这个时候,我们得到了6条数据。上海和北京的所有用户都被搜索出来了。
假如我们想查询来自“北京”并且名字叫做“张三”的文档,那么我们可以这么查询:
GET twitter/_search?q=city:"北京" AND user:"张三

从上面可以看出来就只有一条数据。
假如我们想得到来除了上海以外地区的所有的用户,那么我们可以使用如下的方法来得到:
GET twitter/_search?q=NOT city:"上海"

我们看到了5个数据。
我们也可以对某些想进行加权,以使得它们能够排在更前面,比如:

上面的查询是寻找年龄是20岁的,或者是来自上海的人。从搜索的结果来看,我们可以看到上海的老吴是排在前面。如果我们想对年龄为20岁的人需要有更多的关注,那么我们可以对它们的搜索结果进行加权,这样会使得它们的分数更高。我们可以采用如下的方法来做:
GET twitter/_search?q=(age:20^5 OR city:"上海")
在上面,我们显然对age为20的这个选项进行了加权。那么搜索后的结果为:

我们可以看到现在age为20岁的张三排到了搜索结果的前面。
假如我们不指定任何的field的话,那么这个搜索将对所有的field都进行:
GET twitter/_search?q=张三

当然我们也可以进行fuzzy搜索:

上面标明有一个edit错误也可以被搜索出来。对于中文的检索,这个依赖于分词器。在我们的实验中没有使用具体的分词器。这个和实际的使用可能会有区别。
我们也可以对一下范围进行搜索:
GET twitter/_search?q=age:[20 TO 30]

上面搜索的结果是从20岁到30岁的所有的结果,并且都包含在里面。我们如果不想包含30岁的话,那么可以写成这样的格式:

我们使用[20 TO 30}, 如果我们想搜索在30岁一下的所有文档,那么我们可以使用如下的搜索方式:

在这里,我们使用[* TO 30},这里不包含30。
好了今天就讲到这里。这里的所有的语法也适用于在Kibana中的Search Bar。如果我们熟练地掌握了这些,也可以很方便地让我们熟练地操作Kibana中搜索。
参考:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
【2】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-uri-request.html
Elasticsearch: 使用URI Search的更多相关文章
- Elasticsearch URI search 查询语法整理
Elasticsearch URI search 一.请求体查询与空查询 1. 请求体查询(request body search) 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如 ...
- Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)
原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...
- ElasticSearch - How to search for a part of a word with ElasticSearch
Search a part of word with ElasticSearch 来自stackoverflow https://stackoverflow.com/questions/6467067 ...
- ElasticSearch报 EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@c0efba
ElasticSearch报以下错误的解决办法: "type": "es_rejected_execution_exception", "reason ...
- elasticsearch 基础 —— URI搜索
URI搜索 可以通过提供请求参数使用URI来执行搜索请求.使用此模式执行搜索时,并非所有搜索选项都会暴露.这是一个例子: GET twitter/_search?q=user:kimchy 示例响应: ...
- ElasticSearch: SearchContextMissingException[No search context found for id [173690]]
这个原因是scroll的时间设置不够久,设久一些就可以了. ----------------------------------- 原文:https://www.cnblogs.com/chenmz1 ...
- Elasticsearch Search API
当执行一个搜索时,它将这个搜索请求广播给所有的索引分片.可以通过提供路由参数来控制要搜索哪些分片.例如,当检索tweets这个索引时,路由参数可以设置为用户名: curl -X POST " ...
- Elasticsearch Search APIs
Elasticsearch Search APIs By:授客 QQ:1033553122 1. 搜索 1 在单个索引的所有类型中搜索 1 在单个索引的指定类型中搜索 1 在多个指定的索引中搜索 1 ...
- How to Build a Search Page with Elasticsearch and .NET
Although SQL Server's Full-Text search is good for searching text that is within a database, there a ...
随机推荐
- 字符输入流_Reader类&FileReader类介绍和字符输入读取字符数据
java.io.Reader:字符输入流的最顶层父类,其中定义了一些共性的成员方法,是一个抽象类共性的成员方法 int read() 读取单个字符并返回 int read(char[] cbuf) 将 ...
- surging作者出具压测结果
前言 首先回应下@wen-wen 所贴的压测报告,我也把我和客户压测碰到的问题,和压测结果贴出来,这个结果是由客户提供的.不会有任何的舞弊手脚问题 问题一:Task.Run慎用 首先在最新的社区版本已 ...
- 第一天python3 封装和解构
封装 将多个值使用逗号分割,组合在一起:本质上,返回一个元组,只是省略了小括号:python特有语法,被很多语言学习和借鉴;比如javascript:t1=(1,2) 定义为元组:t2=1,2 将1和 ...
- HashSet集合存储数据的结构(哈希表)和Set集合存储㢝不重复的原理
HashSet集合存储数据的结构(哈希表) Set集合存储㢝不重复的原理 前提:存储的元素必须重写hashCode方法和equals方法
- 一般处理程序ashx接入微信服务器配置
首先在威信后台填写服务器相关配置,这里按照说明直接填写就好了.配置提交前在需要在我们服务端先准备号接受微信请求的url,对请求内容做验证. 1.准备接口配置信息 A.服务器URL 该URL用于开发者接 ...
- 程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
谁说程序员不懂浪漫? 作为程序员,用自己的代码本事手搓一个技术感十足的惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义浪漫. 那么,应该怎样创作出具有自我身份属性的浪漫惊喜呢? 玩法很多,今天给大家 ...
- MySQL之JDBC编程增删改查
MySQL之JDBC 一.JDBC是什么 Java DatabaseConnectivity (java语言连接数据库) 二.JDBC的本质 JDBC是SUN公司制定的一套接口(interface). ...
- Win10文件、文件夹被占用解决方法
有时删除文件/弹出移动硬盘的时候会出现文件或文件夹或磁盘被占用的情况,从而无法删除文件/文件夹或安全弹出移动硬盘.这时可以在资源管理器中搜索该文件.文件夹,来找到对应的程序. 使用了以下链接中的方法, ...
- Luogu5020 货币系统 (完全背包)
bool型完全背包 #include <iostream> #include <cstdio> #include <cstring> #include <al ...
- Spring源码 02 项目搭建
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...