elasticsearch实战三部曲之三:搜索操作

2019年01月13日 21:35:18 博陵精骑 阅读数:1367 标签: elasticsearch 更多

个人分类: elasticsearch

所属专栏: elasticsearch之旅

版权声明:欢迎转载,请注明出处,谢谢。 https://blog.csdn.net/boling_cavalry/article/details/86413235

本文是《elasticsearch实战三部曲》的终篇,作为elasticsearch的核心功能,搜索的重要性不言而喻,今天的实战都会围绕搜索展开;

系列文章链接

  1. 《elasticsearch实战三部曲之一:索引操作》;
  2. 《elasticsearch实战三部曲之二:文档操作》;
  3. 《elasticsearch实战三部曲之三:搜索操作》;

环境信息

  1. 本次实战用到的elasticsearch版本是6.5.4,安装在Ubuntu 16.04.5 LTS,客户端工具是postman6.6.1;
  2. 如果您需要搭建elasticsearch环境,请参考《Linux环境快速搭建elasticsearch6.5.4集群和Head插件》;

基本情况介绍

本次实战的elasticsearch环境以及搭建完毕,是由两个机器搭建的集群,并且elasticsearch-head也搭建完成:

  1. 一号机器,IP地址:192.168.119.152;
  2. 二号机器:IP地址:192.168.119.153;
  3. elasticsearch-head安装在一号机器,访问地址:http://192.168.119.152:9100
  4. 已经建立了索引englishbooks,对应的数据如下所示,请用批量命令导入到elasticsearch:
<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"index"</span><span style="color:#999999">:</span><span style="color:#999999">{</span> <span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span> <span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span> <span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span> <span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span><span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span><span style="color:#669900">"Deep Learning"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span><span style="color:#669900">"python"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span><span style="color:#669900">"Yoshua Bengio"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span><span style="color:#98c379">549.00</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span><span style="color:#669900">"2016-11-18"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span><span style="color:#669900">"written by three experts in the field, deep learning is the only comprehensive book on the subject."</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"index"</span><span style="color:#999999">:</span><span style="color:#999999">{</span> <span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span> <span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span> <span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span> <span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span><span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span><span style="color:#669900">"Compilers"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span><span style="color:#669900">"c"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span><span style="color:#669900">"Alfred V.Aho"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span><span style="color:#98c379">62.50</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span><span style="color:#669900">"2011-01-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span><span style="color:#669900">"In the time since the 1986 edition of this book, the world of compiler designhas changed significantly."</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"index"</span><span style="color:#999999">:</span><span style="color:#999999">{</span> <span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span> <span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span> <span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span> <span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span><span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span><span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span><span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span><span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span><span style="color:#98c379">85.90</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span><span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span><span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"index"</span><span style="color:#999999">:</span><span style="color:#999999">{</span> <span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span> <span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span> <span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span> <span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span><span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span><span style="color:#669900">"Thinking in Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span><span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span><span style="color:#669900">"Bruce Eckel"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span><span style="color:#98c379">70.10</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span><span style="color:#669900">"2015-07-06"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span><span style="color:#669900">"Thinking in Java should be read cover to cover by every Java programmer, then kept close at hand for frequent reference. The exercises are challenging, and the chapter on Collections is superb!"</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"index"</span><span style="color:#999999">:</span><span style="color:#999999">{</span> <span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span> <span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span> <span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"5"</span> <span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span><span style="color:#669900">"5"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span><span style="color:#669900">"The Go Programming Language"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span><span style="color:#669900">"go"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span><span style="color:#669900">"Alan A.A.Donovan"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span><span style="color:#98c379">63.90</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span><span style="color:#669900">"2016-01-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span><span style="color:#669900">"A declaration's lexical block determines its scope, which may be large or small. The declarations of built—in types, functions, and constants like int, len, and true are in the universe block and can be referred to throughout the entire program."</span><span style="color:#999999">}</span></code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 相关的文档是批量导入的,关于文档数据和批量操作的细节请参考《elasticsearch实战三部曲之二:文档操作》;
  2. books索引的文档内容在head中展示如下图:

数据格式说明

为了便于和读者沟通,我们来约定一下如何在文章中表达请求和响应的信息:

  1. 假设通过Postman工具向服务器发送一个PUT类型的请求,地址是:http://192.168.119.152:9200/test001/article/1
  2. 请求的内容是JSON格式的,内容如下:
<span style="color:#000000"><code class="language-shell"><span style="color:#999999">{</span>“id”:1,<span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"标题a"</span>,<span style="color:#669900">"posttime"</span><span style="color:#c678dd">:</span><span style="color:#669900">"2019-01-12"</span>,<span style="color:#669900">"content"</span><span style="color:#c678dd">:</span><span style="color:#669900">"一起来熟悉文档相关的操作"</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对于上面的请求,我在文章中就以如下格式描述:

<span style="color:#000000"><code class="language-shell">PUT test001/article/1<span style="color:#999999">{</span>“id”:1,<span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"标题a"</span>,<span style="color:#669900">"posttime"</span><span style="color:#c678dd">:</span><span style="color:#669900">"2019-01-12"</span>,<span style="color:#669900">"content"</span><span style="color:#c678dd">:</span><span style="color:#669900">"一起来熟悉文档相关的操作"</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

读者您看到上述内容,就可以在postman中发起PUT请求,地址是"test001/article/1"前面加上您的服务器地址,内容是上面的JSON;

本文中的文档内容暂不涉及中文

文中数据都是英文的,避免在因分词器的分词问题导致搜索不到对应的中文结果,分词器相关的知识会在另一篇文章中详细介绍;

查看所有数据

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"match_all"</span>:<span style="color:#999999">{</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述查询返回索引books的所有记录,并且文档得分收是1;
您可以将请求的整个JSON删除,只用books/_search这个URL来试试,也能得到所有数据,这是match_all的简写;

数字字段的精确匹配

查询价格等于549的记录:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"constant_score"</span>:<span style="color:#999999">{</span><span style="color:#669900">"filter"</span>:<span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"price"</span>:549<span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

得到结果:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Deep Learning"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"python"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Yoshua Bengio"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">549</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-11-18"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"written by three experts in the field, deep learning is the only comprehensive book on the subject."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

请求参数中使用了constant_score 后,查询将以非评分模式来执行 term,并以一作为统一评分;

查看分词效果

text类型的字段会被分词后构建倒排索引,来看看title字段的值为"Core Java"时的分词效果:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_analyze<span style="color:#999999">{</span><span style="color:#669900">"field"</span><span style="color:#c678dd">:</span><span style="color:#669900">"title"</span>,<span style="color:#669900">"text"</span><span style="color:#c678dd">:</span><span style="color:#669900">"Core Java"</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

响应如下所示,"Core Java"被分"core"和"java"两个词,也就是说我们以词项"core"或"java"搜索title字段都能收到对应文档:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"tokens"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"token"</span><span style="color:#999999">:</span> <span style="color:#669900">"core"</span><span style="color:#999999">,</span><span style="color:#669900">"start_offset"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"end_offset"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"type"</span><span style="color:#999999">:</span> <span style="color:#669900">"<ALPHANUM>"</span><span style="color:#999999">,</span><span style="color:#669900">"position"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"token"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"start_offset"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"end_offset"</span><span style="color:#999999">:</span> <span style="color:#98c379">9</span><span style="color:#999999">,</span><span style="color:#669900">"type"</span><span style="color:#999999">:</span> <span style="color:#669900">"<ALPHANUM>"</span><span style="color:#999999">,</span><span style="color:#669900">"position"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">}</span><span style="color:#999999">]</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

需要注意的是分词后的结果都是小写,这是分词器的处理结果;

词项查询(term query)

前面我们查看分词效果发现"Core Java"被分"core"和"java"两个词,现在就以"java"为关键词搜索一下试试:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"java"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果如下,title中有java关键词的两个文档都被搜到:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Bruce Eckel"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">70.1</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2015-07-06"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java should be read cover to cover by every Java programmer, then kept close at hand for frequent reference. The exercises are challenging, and the chapter on Collections is superb!"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.2876821</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

分词查询(match query)

  1. term query的特点是将输入的内容作为一个词项来用,例如以下的查询是没有结果的:
<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"core java"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述查询没有结果的原因,是因为"core java"被当做一个词项去查询了,而title的分词结果中只有"core"、"java"这些分词过的词项,并没有一个叫做"core java"的词项,所以搜不到结果;

  1. 如果输入的查询条件"core java"也被做一次分词处理,再把处理结果"core"和"java"用来搜索,应该就能得到结果了,match query就是用来对输入条件做分词处理的,如下:
<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"match"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"Core Java"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

搜索结果如下,包含了java的两条记录都被查出来了:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">8</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Bruce Eckel"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">70.1</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2015-07-06"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java should be read cover to cover by every Java programmer, then kept close at hand for frequent reference. The exercises are challenging, and the chapter on Collections is superb!"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5753642</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  1. 如果我们的本意是只要"Core Java"的匹配结果,上面的结果显然是不符合要求的,此时可以给查询条件加个"operator":"and"属性,就会查询匹配了所有关键词的文档,注意json的结构略有变化,以前title的属性是搜索条件,现在变成了一个json对象,里面的query属性是原来的搜索条件:
<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"match"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span>:<span style="color:#999999">{</span><span style="color:#669900">"query"</span><span style="color:#c678dd">:</span><span style="color:#669900">"Core Java"</span>,<span style="color:#669900">"operator"</span><span style="color:#c678dd">:</span><span style="color:#669900">"and"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这次的搜索结果就是同时匹配了"core"和"java"两个词项的记录了(为什么core和java是小写? 因为"Core Java"被分词后改为了小写,再去搜索的):

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">11</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5753642</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5753642</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

match_phrase搜索

match_phrase搜索和前面的match搜索相似,并且有以下两个特点:

  1. 分词后的所有词项都要匹配上,也就是前面的"operator":"and"属性的效果;
  2. 分析后的词项顺序要和搜索字段的顺序一致,才能匹配上;
<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"match_phrase"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"Core Java"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述查询可以搜索到结果,但如果将"Core Java"改成"Java Core"就搜不到结果了,但是match query用"Java Core"是可以搜到结果的;

match_phrase_prefix搜索

match_phrase_prefix的功能和前面的match_phrase类似,不过match_phrase_prefix支持最后一个词项做前缀匹配,如下所示,"Core J"这个搜索条件用match_phrase是搜不到结果的,但是match_phrase_prefix可以,因为"J"可以作为前缀和"Java"匹配:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"match_phrase"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"Core J"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

multi_match搜素

multi_match是在match的基础上支持多字段搜索,以下查询就是用"1986"和"deep"这两个词项,同时搜索title和description两个字段:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"multi_match"</span>:<span style="color:#999999">{</span><span style="color:#669900">"query"</span><span style="color:#c678dd">:</span><span style="color:#669900">"1986 deep"</span>,<span style="color:#669900">"fields"</span>:<span style="color:#999999">[</span><span style="color:#669900">"title"</span>, <span style="color:#669900">"description"</span><span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

响应如下,可见title和description中含有词项"1986"或者"deep"的文档都被返回了:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.79237825</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.79237825</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Compilers"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"c"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Alfred V.Aho"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">62.5</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2011-01-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"In the time since the 1986 edition of this book, the world of compiler designhas changed significantly."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.2876821</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Deep Learning"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"python"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Yoshua Bengio"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">549</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-11-18"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"written by three experts in the field, deep learning is the only comprehensive book on the subject."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

terms query

terms是term查询的升级,用来查询多个词项:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"terms"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span>:<span style="color:#999999">[</span><span style="color:#669900">"deep"</span>, <span style="color:#669900">"core"</span><span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

响应如下,title中含有deep和core的文档都被查到:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Deep Learning"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"python"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Yoshua Bengio"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">549</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-11-18"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"written by three experts in the field, deep learning is the only comprehensive book on the subject."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

范围查询

range query是范围查询,例如查询publish_time在"2016-01-01"到"2016-12-31"之间的文档:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"range"</span>:<span style="color:#999999">{</span><span style="color:#669900">"publish_time"</span>:<span style="color:#999999">{</span><span style="color:#669900">"gte"</span><span style="color:#c678dd">:</span><span style="color:#669900">"2016-01-01"</span>,<span style="color:#669900">"lte"</span><span style="color:#c678dd">:</span><span style="color:#669900">"2016-12-31"</span>,<span style="color:#669900">"format"</span><span style="color:#c678dd">:</span><span style="color:#669900">"yyyy-MM-dd"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

篇幅所限,此处略去返回结果;

exists query

exists query返回的是字段中至少有一个非空值的文档:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"exists"</span>:<span style="color:#999999">{</span><span style="color:#669900">"field"</span><span style="color:#c678dd">:</span><span style="color:#669900">"author"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

前缀查询

用于查询某个字段是否以给定前缀开始:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"prefix"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"cor"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

以上请求可以查到title字段为"Core Java"的文档:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">6</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

通配符查询

以下查询,可以搜到title字段中含有"core"的文档,另外需要注意的是,"?“匹配一个字符,”*"匹配零个或者多个字符:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"wildcard"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"cor?"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

正则表达式

使用属性regexp可以进行正则表达式查询,例如查找description字段带有4位数字的分词的文档:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"regexp"</span>:<span style="color:#999999">{</span><span style="color:#669900">"description"</span><span style="color:#c678dd">:</span><span style="color:#669900">"[0-9]{4}"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

查找结果如下,description字段中带有数字1986:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Compilers"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"c"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Alfred V.Aho"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">62.5</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2011-01-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"In the time since the 1986 edition of this book, the world of compiler designhas changed significantly."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

模糊查询(fuzzy query)

fuzzy是通过计算词项与文档的编辑距离来得到结果的,例如查找description字段还有分词"1986"的时候,不小心输入了"1987",通过fuzzy查询也能得到结果,只是得分变低了,请求内容如下所示:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"fuzzy"</span>:<span style="color:#999999">{</span><span style="color:#669900">"description"</span><span style="color:#c678dd">:</span><span style="color:#669900">"1987"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

搜索到的文档如下所示,得分只有0.5942837,低于用"1986"查询的0.79237825:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5942837</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5942837</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"2"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Compilers"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"c"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Alfred V.Aho"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">62.5</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2011-01-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"In the time since the 1986 edition of this book, the world of compiler designhas changed significantly."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

需要注意的是,fuzzy查询时消耗资源较大;

复合查询

常用到的复合查询是bool query,可以用下表中的条件组合查询:

属性 作用
must 必须匹配,相当于SQL中的AND
should 可以匹配,相当于SQL中的OR
must_not 必须不匹配
filter 和must一样,但是不评分

以下条件,搜索的是title中带有java,但是不包含core的文档:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"bool"</span>:<span style="color:#999999">{</span><span style="color:#669900">"must"</span>:<span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"java"</span><span style="color:#999999">}</span>   <span style="color:#999999">}</span>,<span style="color:#669900">"must_not"</span>:<span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"core"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

得到的文档中,带有core词项的已经被过滤了:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">3</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">0.5754429</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Bruce Eckel"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">70.1</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2015-07-06"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java should be read cover to cover by every Java programmer, then kept close at hand for frequent reference. The exercises are challenging, and the chapter on Collections is superb!"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

脚本查询

可用脚本进行查询,如下是查询价格大于100的所有文档:

<span style="color:#000000"><code class="language-shell">GET englishbooks/_search<span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"bool"</span>:<span style="color:#999999">{</span><span style="color:#669900">"must"</span>:<span style="color:#999999">{</span><span style="color:#669900">"script"</span>:<span style="color:#999999">{</span><span style="color:#669900">"script"</span>:<span style="color:#999999">{</span><span style="color:#669900">"inline"</span><span style="color:#c678dd">:</span><span style="color:#669900">"doc['price'].value>500"</span>,<span style="color:#669900">"lang"</span><span style="color:#c678dd">:</span><span style="color:#669900">"painless"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>  <span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

得到的结果只有price大于500的文档:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">8</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"1"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Deep Learning"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"python"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Yoshua Bengio"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">549</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-11-18"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"written by three experts in the field, deep learning is the only comprehensive book on the subject."</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

指定排序字段

默认的排序方式是按照评分来排序的(也就是相关度排序),可以用sort属性来设置排序字段,下面的请求指定了按照price字段降序排序:

<span style="color:#000000"><code class="language-shell"><span style="color:#999999">{</span><span style="color:#669900">"query"</span>:<span style="color:#999999">{</span><span style="color:#669900">"term"</span>:<span style="color:#999999">{</span><span style="color:#669900">"title"</span><span style="color:#c678dd">:</span><span style="color:#669900">"java"</span><span style="color:#999999">}</span><span style="color:#999999">}</span>,<span style="color:#669900">"sort"</span>:<span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"price"</span>:<span style="color:#999999">{</span><span style="color:#669900">"order"</span><span style="color:#c678dd">:</span><span style="color:#669900">"desc"</span><span style="color:#999999">}</span><span style="color:#999999">}</span><span style="color:#999999">]</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

得到结果:

<span style="color:#000000"><code class="language-json"><span style="color:#999999">{</span><span style="color:#669900">"took"</span><span style="color:#999999">:</span> <span style="color:#98c379">4</span><span style="color:#999999">,</span><span style="color:#669900">"timed_out"</span><span style="color:#999999">:</span> <span style="color:#56b6c2">false</span><span style="color:#999999">,</span><span style="color:#669900">"_shards"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"successful"</span><span style="color:#999999">:</span> <span style="color:#98c379">5</span><span style="color:#999999">,</span><span style="color:#669900">"skipped"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">,</span><span style="color:#669900">"failed"</span><span style="color:#999999">:</span> <span style="color:#98c379">0</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"total"</span><span style="color:#999999">:</span> <span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"max_score"</span><span style="color:#999999">:</span> <span style="color:#c678dd">null</span><span style="color:#999999">,</span><span style="color:#669900">"hits"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#c678dd">null</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"3"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Core Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Horstmann"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">85.9</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2016-06-01"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"The book is aimed at experienced programmers who want to learn how to write useful Java applications and applets. "</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"sort"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#98c379">85.9</span><span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#999999">{</span><span style="color:#669900">"_index"</span><span style="color:#999999">:</span> <span style="color:#669900">"englishbooks"</span><span style="color:#999999">,</span><span style="color:#669900">"_type"</span><span style="color:#999999">:</span> <span style="color:#669900">"IT"</span><span style="color:#999999">,</span><span style="color:#669900">"_id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"_score"</span><span style="color:#999999">:</span> <span style="color:#c678dd">null</span><span style="color:#999999">,</span><span style="color:#669900">"_source"</span><span style="color:#999999">:</span> <span style="color:#999999">{</span><span style="color:#669900">"id"</span><span style="color:#999999">:</span> <span style="color:#669900">"4"</span><span style="color:#999999">,</span><span style="color:#669900">"title"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java"</span><span style="color:#999999">,</span><span style="color:#669900">"language"</span><span style="color:#999999">:</span> <span style="color:#669900">"java"</span><span style="color:#999999">,</span><span style="color:#669900">"author"</span><span style="color:#999999">:</span> <span style="color:#669900">"Bruce Eckel"</span><span style="color:#999999">,</span><span style="color:#669900">"price"</span><span style="color:#999999">:</span> <span style="color:#98c379">70.1</span><span style="color:#999999">,</span><span style="color:#669900">"publish_time"</span><span style="color:#999999">:</span> <span style="color:#669900">"2015-07-06"</span><span style="color:#999999">,</span><span style="color:#669900">"description"</span><span style="color:#999999">:</span> <span style="color:#669900">"Thinking in Java should be read cover to cover by every Java programmer, then kept close at hand for frequent reference. The exercises are challenging, and the chapter on Collections is superb!"</span><span style="color:#999999">}</span><span style="color:#999999">,</span><span style="color:#669900">"sort"</span><span style="color:#999999">:</span> <span style="color:#999999">[</span><span style="color:#98c379">70.1</span><span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">]</span><span style="color:#999999">}</span>
<span style="color:#999999">}</span>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

以上就是常用的搜索操作了,至此,《elasticsearch实战三部曲》系列就全部完成,三篇文章列举的是一些常用的基本操作,希望能帮助读者您快速熟悉elasticsearch,后面咱们再一起深入实战;

elasticsearch实战三部曲之三:搜索操作相关推荐

  1. elasticsearch实战三部曲之二:文档操作

    本文是<elasticsearch实战三部曲>系列的第二篇,上一篇文章我们动手熟悉了索引相关的基本操作,现在一起来熟悉文档相关的操作: 系列文章链接 <elasticsearch实战 ...

  2. elasticsearch实战三部曲之一:索引操作

    从本章开始,我们一起来实战elasticsearch,熟悉相关操作和命令,为后续的深入学习打好基础: 三部曲介绍 整个系列由以下三篇文章构成: 索引操作实战,也就是本文的主要内容: 文档操作实战: 搜 ...

  3. elasticsearch实战篇

    文章目录 1.新建SpringBoot项目 依赖 2.实现 配置模块 config 控制层 controller 模型层 model 服务层 service 工具 util 主类 单元测试 1.新建S ...

  4. Elasticsearch实战(十三)---聚合搜索Aggs聚合及Count,Avg操作

    Elasticsearch实战- 聚合搜索Aggs聚合及Count,Avg操作 文章目录 Elasticsearch实战- 聚合搜索Aggs聚合及Count,Avg操作 1.聚合搜索 bucket 桶 ...

  5. Elasticsearch项目实战,商品搜索功能设计与实现!

    推荐大家去看原文博主的文章,条理清晰阅读方便,转载是为了方便以后个人查阅 https://juejin.im/post/5e94587f51882573be11cb83?utm_source=gold ...

  6. Elasticsearch实战之(商品搜索API实现)

    Elasticsearch实战之(商品搜索API实现) 1.案例介绍 某医药电商H5商城基于Elasticsearch实现商品搜索 2.案例分析 2.1.数据来源 商品库 - 平台运营维护 商品库 - ...

  7. kubernetes下的Nginx加Tomcat三部曲之三:实战扩容和升级

    本章是<kubernetes下的Nginx加Tomcat三部曲系列>的终篇,今天咱们一起在kubernetes环境对下图中tomcat的数量进行调整,再修改tomcat中web工程的源码, ...

  8. ElasticSearch实战系列02 SpringBoot + ElasticSearch 7.7 实现高仿QQ用户搜索:中文+拼音混合检索,并高亮显示

    本文导读 本文仿照QQ的用户搜索,搭建一个中文+拼音的混合检索系统,并高亮显示检索字段.全文共分为以下几部分: 1.项目简介,包括需求描述与分析等: 2.项目开发,通过两个版本的index,验证并完成 ...

  9. Elasticsearch实战(十一)---前缀模糊匹配搜索 prefix search

    Elasticsearch实战- 前缀模糊匹配搜索 prefix/wildcard/regexp search 文章目录 Elasticsearch实战- 前缀模糊匹配搜索 prefix/wildca ...

最新文章

  1. EPSON机器人的以太网通讯简单总结
  2. The Future of Silverlight --December 2, 2010 at 9:00
  3. 机器学习资源和路线图
  4. spring mvc 如何传递集合参数(list,数组)
  5. 搭搭机器人科技活动中心怎么样_搭搭乐乐机器人怎么样?感受科技创收力量
  6. centos 6.3安装libmcrypt-2.5.8不成功解决方案
  7. pycharm常用设置(keymap设置及eclipse常用快捷键总结)
  8. BZOJ 1211: [HNOI2004]树的计数 purfer序列
  9. PTA—求整数段和(C语言)
  10. 数据结构——红黑树(red-black tree)
  11. Swagger 教程
  12. Apple EDI X12 业务报文解析(一)—— 850采购订单
  13. 网络语言y c,惊为天人!当网络流行语翻译成诗词,中文歌曲翻译成英文......
  14. SwiftUI CoreSpotlight 实战之实现Spotlight搜索(教程含源码)
  15. 从play_mp3例程出发理解ESP32-ADF的使用方法
  16. sapi/cgi/php-cgi,sapi/cgi/php-cgi
  17. 学习笔记——神经网络压缩
  18. Android集成友盟推送功能
  19. 这是一篇让你从早吃到晚的『台南美食攻略』
  20. 应用内版本更新库UpdateVersion

热门文章

  1. JVM、JRE和JDK的概念
  2. Shell中的常用操作
  3. 大连理工大学网络教育学院2014年3月份计算机原理课程补考试卷,大连理工大学网络教育2014年3月份自动化控制原理考试模.doc...
  4. python圆的半径计算圆的周长列表_python计算圆周长、面积、球体体积并画出圆
  5. 有sql漏洞的php脚本,DedeCms V57 plus/search.php 文件SQL注射0day漏洞脚本安全 -电脑资料...
  6. c语言输入r1 r2垫片的面积,2011学生C语言上机实验
  7. accessors 作用_lombok @Accessors用法详解(一看就能就懂)
  8. leetcode-寻找两个正序数组的中位数
  9. tensordot 的源码解读
  10. pytorch 入门(二) cnn 手写数字识别