@@ -6,6 +6,12 @@ Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格
66
77ES 全文查询主要用于在全文字段上,主要考虑查询词与文档的相关性(Relevance)。
88
9+ ### intervals query
10+
11+ [ ** ` intervals query ` ** ] ( https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-intervals-query.html ) 根据匹配词的顺序和近似度返回文档。
12+
13+ intervals query 使用** 匹配规则** ,这些规则应用于指定字段中的 term。
14+
915### match query
1016
1117match query ** 用于搜索单个字段** ,首先会针对查询语句进行解析(经过 analyzer),主要是对查询语句进行分词,分词后查询语句的任何一个词项被匹配,文档就会被搜到,默认情况下相当于对分词后词项进行 or 匹配操作。
@@ -241,13 +247,24 @@ GET books/_search
241247
242248# # 词项查询
243249
244- 全文查询在执行查询之前会分析查询字符串,词项查询时对倒排索引中存储的词项进行** 精确匹配操作** 。词项级别的查询通常用于结构化数据,如数字、日期和枚举类型。
245-
246250** ` Term` (词项)是表达语意的最小单位** 。搜索和利用统计语言模型进行自然语言处理都需要处理 Term。
247251
248- 在 ES 中,term 查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项。并且使用相关度计算公式为每个包含该词项的文档进行相关度计算 。
252+ 全文查询在执行查询之前会分析查询字符串 。
249253
250- 可以通过 Constant Score 将查询转换成一个 Filtering,避免算法,并利用缓存,提高性能。
254+ 与全文查询不同,词项查询不会分词,而是将输入作为一个整体,在倒排索引中查找准确的词项。并且使用相关度计算公式为每个包含该词项的文档进行相关度计算。一言以概之:** 词项查询是对词项进行精确匹配** 。词项查询通常用于结构化数据,如数字、日期和枚举类型。
255+
256+ 词项查询有以下类型:
257+
258+ - ** [` exists` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html)**
259+ - ** [` fuzzy` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)**
260+ - ** [` ids` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html)**
261+ - ** [` prefix` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html)**
262+ - ** [` range` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)**
263+ - ** [` regexp` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html)**
264+ - ** [` term` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)**
265+ - ** [` terms` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html)**
266+ - ** [` type` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-type-query.html)**
267+ - ** [` wildcard` query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html)**
251268
252269# ## exists query
253270
@@ -301,22 +318,147 @@ GET kibana_sample_data_ecommerce/_search
301318
302319为了找到相似的词条,fuzzy query 会在指定的编辑距离内创建搜索词条的所有可能变体或扩展集。然后返回完全匹配任意扩展的文档。
303320
304- ` ` `
321+ ` ` ` bash
305322GET books/_search
306323{
307- " query" : {
308- " fuzzy" : {
309- " title" : " javascritp"
310- }
311- }
324+ " query" : {
325+ " fuzzy" : {
326+ " user.id" : {
327+ " value" : " ki" ,
328+ " fuzziness" : " AUTO" ,
329+ " max_expansions" : 50,
330+ " prefix_length" : 0,
331+ " transpositions" : true,
332+ " rewrite" : " constant_score"
333+ }
334+ }
335+ }
312336}
313337` ` `
314338
315339注意:如果配置了 [` search.allow_expensive_queries` ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则 fuzzy query 不能执行。
316340
341+ # ## ids query
342+
343+ [** ` ids query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html) 根据 ID 返回文档。 此查询使用存储在 ` _id` 字段中的文档 ID。
344+
345+ ` ` ` bash
346+ GET /_search
347+ {
348+ " query" : {
349+ " ids" : {
350+ " values" : [" 1" , " 4" , " 100" ]
351+ }
352+ }
353+ }
354+ ` ` `
355+
356+ # ## prefix query
357+
358+ [** ` prefix query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html#prefix-query-ex-request) 用于查询某个字段中包含指定前缀的文档。
359+
360+ 比如查询 ` user.id` 中含有以 ` ki` 为前缀的关键词的文档,那么含有 ` kind` 、` kid` 等所有以 ` ki` 开头关键词的文档都会被匹配。
361+
362+ ` ` ` bash
363+ GET /_search
364+ {
365+ " query" : {
366+ " prefix" : {
367+ " user.id" : {
368+ " value" : " ki"
369+ }
370+ }
371+ }
372+ }
373+ ` ` `
374+
375+ # ## range query
376+
377+ [** ` range query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html) 即范围查询,用于匹配在某一范围内的数值型、日期类型或者字符串型字段的文档。比如搜索哪些书籍的价格在 50 到 100 之间、哪些书籍的出版时间在 2015 年到 2019 年之间。** 使用 range 查询只能查询一个字段,不能作用在多个字段上** 。
378+
379+ range 查询支持的参数有以下几种:
380+
381+ - ** ` gt` ** :大于
382+
383+ - ** ` gte` ** :大于等于
384+
385+ - ** ` lt` ** :小于
386+
387+ - ** ` lte` ** :小于等于
388+
389+ - ** ` format` ** :如果字段是 Date 类型,可以设置日期格式化
390+
391+ - ** ` time_zone` ** :时区
392+
393+ - ** ` relation` ** :指示范围查询如何匹配范围字段的值。
394+
395+ - ** ` INTERSECTS` (Default)** :匹配与查询字段值范围相交的文档。
396+ - ** ` CONTAINS` ** :匹配完全包含查询字段值的文档。
397+ - ** ` WITHIN` ** :匹配具有完全在查询范围内的范围字段值的文档。
398+
399+ 示例:数值范围查询
400+
401+ ` ` ` bash
402+ GET kibana_sample_data_ecommerce/_search
403+ {
404+ " query" : {
405+ " range" : {
406+ " taxful_total_price" : {
407+ " gt" : 10,
408+ " lte" : 50
409+ }
410+ }
411+ }
412+ }
413+ ` ` `
414+
415+ 示例:日期范围查询
416+
417+ ` ` ` bash
418+ GET kibana_sample_data_ecommerce/_search
419+ {
420+ " query" : {
421+ " range" : {
422+ " order_date" : {
423+ " time_zone" : " +00:00" ,
424+ " gte" : " 2018-01-01T00:00:00" ,
425+ " lte" : " now"
426+ }
427+ }
428+ }
429+ }
430+ ` ` `
431+
432+ # ## regexp query
433+
434+ [** ` regexp query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html) 返回与正则表达式相匹配的 term 所属的文档。
435+
436+ [正则表达式](https://zh.wikipedia.org/zh-hans/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F)是一种使用占位符字符匹配数据模式的方法,称为运算符。
437+
438+ 示例:以下搜索返回 ` user.id` 字段包含任何以 ` k` 开头并以 ` y` 结尾的文档。 ` .* ` 运算符匹配任何长度的任何字符,包括无字符。匹配项可以包括 ` ky` 、` kay` 和 ` kimchy` 。
439+
440+ ` ` ` bash
441+ GET /_search
442+ {
443+ " query" : {
444+ " regexp" : {
445+ " user.id" : {
446+ " value" : " k.*y" ,
447+ " flags" : " ALL" ,
448+ " case_insensitive" : true,
449+ " max_determinized_states" : 10000,
450+ " rewrite" : " constant_score"
451+ }
452+ }
453+ }
454+ }
455+ ` ` `
456+
457+ > 注意:如果配置了[` search.allow_expensive_queries` ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl-allow-expensive-queries) ,则 [** ` regexp query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html) 会被禁用。
458+
317459# ## term query
318460
319- [term query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 用来查找指定字段中包含给定单词的文档,term 查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到,应用场景为查询人名、地名等需要精准匹配的需求。
461+ [** ` term query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 用来查找指定字段中包含给定单词的文档,term 查询不被解析,只有查询词和文档中的词精确匹配才会被搜索到,应用场景为查询人名、地名等需要精准匹配的需求。
320462
321463示例:
322464
@@ -370,7 +512,7 @@ DELETE my-index-000001
370512
371513# ## terms query
372514
373- ** ` terms query` ** 与 ** ` term query` ** 相同,但可以搜索多个值。
515+ [ ** ` terms query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html) 与 [ ** ` term query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html) 相同,但可以搜索多个值。
374516
375517terms query 查询参数:
376518
@@ -425,146 +567,49 @@ GET my-index-000001/_search?pretty
425567DELETE my-index-000001
426568` ` `
427569
428- # ## range query
429-
430- ** ` range query` ** 即范围查询,用于匹配在某一范围内的数值型、日期类型或者字符串型字段的文档。比如搜索哪些书籍的价格在 50 到 100 之间、哪些书籍的出版时间在 2015 年到 2019 年之间。** 使用 range 查询只能查询一个字段,不能作用在多个字段上** 。
431-
432- range 查询支持的参数有以下几种:
433-
434- - ** ` gt` ** :大于
435-
436- - ** ` gte` ** :大于等于
437-
438- - ** ` lt` ** :小于
439-
440- - ** ` lte` ** :小于等于
441-
442- - ** ` format` ** :如果字段是 Date 类型,可以设置日期格式化
443-
444- - ** ` time_zone` ** :时区
445-
446- - ** ` relation` ** :指示范围查询如何匹配范围字段的值。
447-
448- - ** ` INTERSECTS` (Default)** :匹配与查询字段值范围相交的文档。
449- - ** ` CONTAINS` ** :匹配完全包含查询字段值的文档。
450- - ** ` WITHIN` ** :匹配具有完全在查询范围内的范围字段值的文档。
570+ # ## type query
451571
452- 示例:数值范围查询
572+ > 7.0.0 后废弃
453573
454- ` ` ` bash
455- GET kibana_sample_data_ecommerce/_search
456- {
457- " query" : {
458- " range" : {
459- " taxful_total_price" : {
460- " gt" : 10,
461- " lte" : 50
462- }
463- }
464- }
465- }
466- ` ` `
574+ [** ` type query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-type-query.html) 用于查询具有指定类型的文档。
467575
468- 示例:日期范围查询
576+ 示例:
469577
470578` ` ` bash
471- GET kibana_sample_data_ecommerce /_search
579+ GET /_search
472580{
473581 " query" : {
474- " range" : {
475- " order_date" : {
476- " time_zone" : " +00:00" ,
477- " gte" : " 2018-01-01T00:00:00" ,
478- " lte" : " now"
479- }
582+ " type" : {
583+ " value" : " _doc"
480584 }
481585 }
482586}
483587` ` `
484588
485- # ## prefix query
486-
487- ** ` prefix` ** 查询用于查询某个字段中以给定前缀开始的文档,比如查询 title 中含有以 java 为前缀的关键词的文档,那么含有 java、javascript、javaee 等所有以 java 开头关键词的文档都会被匹配。查询 description 字段中包含有以 win 为前缀的关键词的文档,查询语句如下:
488-
489- ` ` `
490- GET books/_search
491- {
492- " query" : {
493- " prefix" : {
494- " description" : " win"
495- }
496- }
497- }
498- ` ` `
499-
500589# ## wildcard query
501590
502- wildcard query 中文译为通配符查询,支持单字符通配符和多字符通配符, ` ? ` 用来匹配一个任意字符, ` * ` 用来匹配零个或者多个字符 。
591+ [ ** ` wildcard query` ** ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html) 即通配符查询,返回与通配符模式匹配的文档 。
503592
504- 以 H ? tland 为例,Hatland、Hbtland 等都可以匹配,但是不能匹配 Htland, ` ? ` 只能代表一位。H * tland 可以匹配 Htland、Habctland 等 ,` * ` 可以代表 0 至多个字符。 ** 和 prefix 查询一样,wildcard 查询的查询性能也不是很高,需要消耗较多的 CPU 资源。 **
593+ ` ? ` 用来匹配一个任意字符 ,` * ` 用来匹配零个或者多个字符。
505594
506- 下面举一个 wildcard 查询的例子,假设需要找某一作者写的书,但是忘记了作者名字的全称,只记住了前两个字,那么就可以使用通配符查询,查询语句如下:
595+ 示例:以下搜索返回 ` user.id ` 字段包含以 ` ki ` 开头并以 ` y ` 结尾的术语的文档。这些匹配项可以包括 ` kiy ` 、 ` kity ` 或 ` kimchy ` 。
507596
508- ` ` `
509- GET books /_search
597+ ` ` ` bash
598+ GET /_search
510599{
511600 " query" : {
512601 " wildcard" : {
513- " author" : " 李永*"
514- }
515- }
516- }
517- ` ` `
518-
519- # ## regexp query
520-
521- Elasticsearch 也支持正则表达式查询,通过 regexp query 可以查询指定字段包含与指定正则表达式匹配的文档。可以代表任意字符, “a.c.e” 和 “ab...” 都可以匹配 “abcde”,a{3}b{3}、a{2,3}b{2,4}、a{2,}{2,} 都可以匹配字符串 “aaabbb”。
522-
523- 例如需要匹配以 W 开头紧跟着数字的邮政编码,使用正则表达式查询构造查询语句如下:
524-
525- ` ` `
526- GET books/_search
527- {
528- " query" : {
529- " regexp" : {
530- " postcode" : " W[0-9].+"
531- }
532- }
533- }
534- ` ` `
535-
536- # ## type query
537-
538- type query 用于查询具有指定类型的文档。例如查询 Elasticsearch 中 type 为 computer 的文档,查询语句如下:
539-
540- ` ` `
541- GET books/_search
542- {
543- " query" : {
544- " type" : {
545- " value" : " computer"
546- }
547- }
548- }
549- ` ` `
550-
551- # ## ids query
552-
553- ids query 用于查询具有指定 id 的文档。类型是可选的,也可以省略,也可以接受一个数组。如果未指定任何类型,则会查询索引中的所有类型。例如,查询类型为 computer,id 为 1、3、5 的文档,** 本质上是对文档 ` _id` 的查询,所以对应的 value 是字符串类型** ,查询语句如下:
554-
555- ` ` `
556- GET books/_search
557- {
558- " query" : {
559- " ids" : {
560- " type" : " computer" ,
561- " values" : [" 1" , " 3" , " 5" ]
602+ " user.id" : {
603+ " value" : " ki*y" ,
604+ " boost" : 1.0,
605+ " rewrite" : " constant_score"
606+ }
562607 }
563608 }
564609}
565610` ` `
566611
567- ES 查询中如果要排除一些指定的 id 列表可以结合 ids query 和 bool 查询的 must_not,具体参照 [Elasticsearch(ES)不匹配或排除指定的 id 列表 ](https://www.knowledgedict.com/tutorial/ elasticsearch- query-exclude-ids .html)。
612+ > 注意:如果配置了[ ` search.allow_expensive_queries ` ](https://www.elastic.co/guide/en/elasticsearch/reference/current/ query-dsl.html#query-dsl-allow-expensive-queries) ,则[ ** ` wildcard query ` ** ](https://www.elastic.co/guide/en/ elasticsearch/reference/current/ query-dsl-wildcard-query .html) 会被禁用 。
568613
569614# # 复合查询
570615
0 commit comments