专栏首页憧憬博客分享Elasticsearch 利用API进行搜索

Elasticsearch 利用API进行搜索

ES 在搜索上对外开放了 Resultful API, 方便各个语言调用,那么他调用有两种方式,一种就是单纯将搜索的参数放到url上,还有就是可以放到Request Body里面,我们来依次看看。

URL Search 路由携带参数搜索

GET movies/_search?q=love&df=title&sort=year:asc&from=0&size=10
{
  "profile": "true"
}

我们来对上面的url分析一下,movies是索引,_search表示我们要进行搜索

  1. q 指定查询内容
  2. df 指定查询字段
  3. sort 指定字段排序
  4. from 偏移量
  5. size 获取数据量 与from联合使用 做分页的
  6. 下面有个profile 是为了查询执行过程
  • or 查询
# 等效为or查询
GET movies/_search?q=title:(Beautiful OR Mind)
{
  "profile": "true"
}
  • and 查询
GET movies/_search?q=title:(Beautiful AND Mind)
{
  "profile": "true"
}
  • 范围查询
GET movies/_search?q=year:[2018 TO 2019]
{
  "profile": "true"
}

[] 为闭区间,{} 为开区间 year:[2018 TO 2019],查询时间在2018-2019年的电影

  • 模糊查询

"Avengers War"~2 ,AvengersWar 之间有两个 term,匹配 Avengers: Infinity War - Part I,不能匹配 Avengers: War

GET /movies/_search?q=title:"Avengers War"~2
{
  "profile": "true"
}

Request Body Search 请求体携带Json搜索

其实在高阶使用方法上只有 Request Body Search 才能实现,所以也是推荐使用这种方法查询学习。

POST test/_search
{
  "profile": "true",
  "_source": ["name", "date"], # 指定展示的字段
  "from": 0, # 分页偏移
  "size": 20, # 总共获取20
  "sort": [ # 排序
    {
      "date": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "match_all": {} # 查询所有文档
  }
}

Match 查询表达式

POST test/_search
{
  "query": {
    "match": {
      "name": "王    五"
    }
  }
}

这样会匹配到name字段中带或者带的文档,类似于 OR 关系,如果你只需要王五的话,可以添加and操作

POST test/_search
{
  "query": {
    "match": {
      "name": {
        "query": "王五",
        "operator": "and"
      }
      
    }
  }
}

Match Phrase

通过使用 query-match_phrase 实现 Phrase 查询,query 的词必须按照顺序排列,slop 实现模糊查询,slop=1,表示中间可以有一个字符

POST test/_search
{
  "query": {
    "match_phrase": {
      "tag": {
        "query": "java php"
      }
      
    }
  }
}

这个顺序就不能反,否则查询不到。那如果需要查tagjava,laravel 中间是随意字符的话就需要slop

这样就是实现中间模糊查询。

Request Body Search中间 match, match_phrase, term的区别

  • term

term结构化字段查询,匹配一个值,且输入的值不会被分词器分词。

{
    "query":{
        "term":{
            "foo": "hello world"
        }
    }
}

那么只有在字段中存储了hello world的数据才会被返回,如果在存储时,使用了分词,原有的文本“I say hello world”会被分词进行存储,不会存在“hello world”这整个词,那么不会返回任何值。

但是如果使用“hello”作为查询条件,则只要数据中包含“hello”的数据都会被返回,分词对这个查询影响较大。

  • match_phase

查询确切的语句,在对查询字段定义了分词器的情况下,会使用分词器对输入进行分词,然后返回满足下述两个条件的文档

  1. match_phase中的所有term都出现在待查询字段之中
  2. 待查询字段之中的所有term都必须和match_phase具有相同的顺序
{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

使用match_phase:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

会返回前两条文档。

  • match

模糊匹配,先对输入进行分词,对分词后的结果进行查询,文档中只要包含match查询条件的一部分就会返回

  • query_string

query_string语法查询,同match_phase的相同点在于,输入的查询条件会被分词,但是不同之处在与文档中的数据可以不用和query_string中的查询条件有相同的顺序。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker Swarm集群部署lnmp+redis

    我们先说一下docker集群之一的swarm集群, 先说一下集群这个东西, 它并不适用于任何项目, 他是为了解决架构中高性能的。将单节点的负载转移到多节点身上,...

    憧憬博客
  • 快速学习UML类图查看

    先说明一下UML是一种建模的语言, 他可以建很多图, 在我们设计程序 代码的时候, 就会建立类图。 UML从考虑系统的不同角度出发,定义了用况图、类图、对象图、...

    憧憬博客
  • Vue之插槽Slot理解

    刚开始看的时候,以为Vue的插槽和React一样,我定睛一看,md原来不对,怎么越看越像React的props.children属性,但是比React这个属性要...

    憧憬博客
  • Mysql慢查询(配置)

    慢查询日志,顾名思义,就是查询慢的日志(感觉在说F话),是指Mysql记录所有执行超过long_query_time 参数设定的时间阈值的SQL语句的日志。该日...

    彼岸舞
  • SAP CRM和Cloud for Customer的扩展字段元数据

    在product search & search result上创建了一个extension field:

    Jerry Wang
  • mybatis 高级映射和spring整合之高级映射(4)

    王小雷
  • 看我如何发现Facebook密码重置漏洞获得$15000赏金(附POC)

    本文讲述了我在Facebook上发现的一个任意账户密码重置漏洞,利用该漏洞无需用户交互过程,就可以黑掉任何Facebook账户。总体来说,该漏洞非常简单,但影响...

    FB客服
  • zookeeper is not a recognized option zookeeper参数不支持

    原因: – zookeeper is not a recognized option主要原因是 Kafka 版本过高,命令不存在,高版本不再支持此消费命令 新的...

    院长技术
  • c语言编程常见错误集锦 【上】

    编译程序会出错。C语言区分大小写。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。

    编程范 源代码公司
  • mongodb3 ubuntu离线安装(非apt-get)及用户管理

      目前mongodb已经出到3.x,相对于2.x改动较大,本着学新不学旧的原则来捣鼓nosql数据库。最初想着apt-get安装但是软件源上都是2.x的,遂下...

    用户2038589

扫码关注云+社区

领取腾讯云代金券