1、查询方式
有两种查询方式,一种是通过在url中指定查询条件 ,另外一种是通过DSL查询。都是使用GET方法
1.1 分页查询
from | 指定从文档的什么位置开始,默认值0 |
size | 指定一次查询返回多少结果 |
curl 'localhost:9200/library/_search?pretty' -d '{"from":9, "size":20,"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
1.2 返回版本号
设置version的布尔值,默认值是false
curl 'localhost:9200/library/_search?pretty' -d '{"version":true,"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
1.3 分数限制
设置min_score
curl 'localhost:9200/library/_search?pretty' -d '{"min_score":0.75,"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
1.4 设置返回字段
设置fields的数组类型
curl 'localhost:9200/library/_search?pretty' -d '{"fields":["title","year"],"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
1.5 source过滤
设置_source布尔值来控制响应中是否包含_source
curl 'localhost:9200/library/_search?pretty' -d '{"_source":false,"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
设置_source的数组来控制响应中的_source返回字段
curl 'localhost:9200/library/_search?pretty' -d '{"_source":["title","otitle"],"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
设置_source值为包含include,exclude对象来控制响应中的_source返回字段
curl 'localhost:9200/library/_search?pretty' -d '{"_source":{"include":["*"], "exclude":"title"},"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
1.6 使用脚本字段
通过设置script_fields
curl 'localhost:9200/library/_search?pretty' -d '{"script_fields":{"correctYear":{"script":"doc[\"year\"].value - 1800"}},"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
通过设置params将参数传到脚本 中
curl 'localhost:9200/library/_search?pretty' -d '{"script_fields":{"correctYear":{"script":{"source":"doc[\"year\"].value - params.paramYear", "params":{"paramYear":1800}}}},"query":{"query_string":{"query":"title:crime"}}}' -H "Content-Type:application/json"
2、查询过程
2.1 查询类型
通过请求参数search_type来设置,支持的查询类型有
query_then_fetch | 第一步,执行查询得到对文档进行排序和分级所需信息。这一步在所有的分片上执行,然后,只在相关分片上查询文档的实际内容 |
dfs_query_then_fetch | 跟query_then_fetch相似,但它包含一个额外阶段,执行分布式词频的计算 |
curl 'localhost:9200/library/_search?pretty&search_type=query_then_fetch' -d '{"query":{"term":{"title":"crime"}}}' -H "Content-Type:application/json"
2.2 查询偏好
通过设置请求参数preference,支持的类型有
_primary | 只在主分片上执行搜索,不使用副本 |
_primary_first | 如果主分片可用,只在主分片上执行搜索,否则才在其他分片上执行 |
_replica | 只在副本分片上执行执行 |
_replica_first | 如果副本分片可用,只在副本分片上执行搜索,否则才在主分片上执行 |
_local | 在可能的情况下,只在发送请求的节点上的可用分片上执行搜索 |
_only_node:node_id | 只在提供标识符的节点上执行搜索 |
_only_node:node_spec | 只在指定节点描述符的节点上执行搜索。 |
_prefer_node:node_i | 尝试在提供标识符的节点上执行搜索,如果该节点不可用,则使用其他的可用节点。 |
_shards:1,2 | 在提供标识符的分片上执行操作(在这个例子中,分片1和2) |
自定义值 | 可以传入任何自定义字符串值,具有相同值的请求将在相同的分片上执行 |
2.3 搜索分片api
在_search_shards REST端点执行这个API
3、简单查询
3.1 词条查询
词条查询是未经分析的,需要提供精确的词条。可以在词条查询中包含加权属性,它影响给定词条的重要程序。
{
"query": {
"term": {
"title": "crime"
}
}
}
3.2 多词条查询
{
"query": {
"terms": {
"tags": ["novel", "book"]
}
}
}
3.3 match_all查询
能够匹配索引中的所有文档
{
"query": {
"match_all": {}
}
}
也可以在查询中包含加权值,会赋值给所有跟它匹配的文档
{
"query": {
"match_all": {
"boost": 2.0
}
}
}
3.4 exsists查询
查询文档中指定的字段是否存在值。
不存在有以下几种情况
- source中的字段为null或者[]
- 在mapping中字段设置了"index":false
- 在mapping中字段的长度超过了ignore_above
- 在mapping中设置了ignore_malformed,并且字段值格式不对
{
"query": {
"exists": {
"field": "tags"
}
}
}
3.5 常用词查询
在7.3.0中已经过期,不推荐使用
{
"query": {
"common": {
"title": {
"query": "crime and punishment",
"cutoff_frequency": 0.001
}
}
}
}
可用的参数有
query | 实际的查询内容 |
cutoff_frequency | 百分比或者绝对值。这个值用来构建高、低频词组 |
low_freq_operator | 可以设为or或者and。默认是or。用来指定为低频词组构建查询时用到的布尔运算符。如果希望所有的记都在文档中出现才认为是匹配,应该把它设置为and |
high_freq_operator | 可以设为or或者and。默认是or。用来指定为高频词组构建查询时用到的布尔运算符。如果希望所有的记都在文档中出现才认为是匹配,应该把它设置为and |
minimum_should_match | 不使用low_freq_operator和high_freq_operator参数的话,可以使用minimum_should_match参数。和其他查询一样,它允许指定匹配的文档中应该出现的查询词的最小个数 |
boost | 定义赋给文档得分的加权值。 |
analyzer | 定义分析查询文本时用到的分析器名称。默认值是default analyzer |
disable_coord | 默认值为false。它允许启用或禁用分数因子的计算。该计算基于文档中包含的所有查询词的分数 |
3.6 match查询
匹配查询把query中的参数取出,分析然后构造查询。当使用match查询时,会为字段选择合适的查询器,传给match查询的词条将被建立索引时相同的分析器处理。
match查询不支持lucen查询语法 。
{
"query": {
"match": {
"title": "crime and punishment"
}
}
}
3.6.1 布尔匹配查询
分析给定的文本,构造布尔查询。匹配查询的默认类型就是这个。有些参数来控制布尔查询
operator | 取值为or或者and。控制用于连接创建的布尔条件的布尔运算符。默认值是or。如果想要所有的词项满足匹配,需要设置为and运算符。 |
analyzer | 指定用于分析查询文本的分析器名字。默认是default anaylzer. |
fuzziness | 提供允许构造模糊查询的参数值。这个参数值不同场景会有差异。对于数组字段,值为数字。对于日期类型字段,可以设置为millisecond或者time值。对于text类型字段,可以设置为0,1,2,auto |
prefix_length | 控制模糊查询行为 |
max_expansions | 控制模糊查询行为 |
zero_terms_query | 指定当所有词条被分析器移除时的查询行为。可以设置为none,all。默认值是none |
cutoff_frequency | 将查询分成两组:高频词条组和低频词条组。 |
lenient | 取值为ture,false。当设置为true时,忽略由于数据不兼容导致的异常。 |
3.6.2 match_phrase查询
与布尔查询相似,不同的是,它从分析后的文本中构建短语查询,而不是布尔子句。
可用的参数有
slop | 是一个整数值。定义了文本查询中的词条和词条之间可以有多少个未知词条,以被视为跟一个短语匹配。默认值是0,意味着不允许有额外的词条 |
analyzer | 指定用于分析查询文本的分析器名字。默认值是default analyzer. |
3.6.3 match_phrase_prefix查询
与match_phrase查询一样,另外,允许查询文本最后一个词条前缀匹配。
可用的参数除了match_phrase使用的参数外,还包括
max_expansions | 控制有多少前缀被重写成最后的词条 |
3.7 multi_match查询
与match相同,但是支持多字段fields参数。match查询参数可以用于multi_match。独有的参数有
tie_breaker | 指定高分项和低分项的平衡,取值为0-1。当使用的时候,文档分数是最高分项加上所有其它文本匹配字段分数乘以tie_breaker |
3.8 query_string查询
支持lucene查询语法。支持的参数有
query | 指定查询文本 |
default_field | 指定默认的查询字段。默认值为index.query.default_field属性指定,默认为_all |
default_operator | 指定默认的逻辑运算符(or或and),默认为or |
analyzer | 指定用于分析query参数的分析器名称 |
allow_leading_wildcard | 指定是否允许通配符作为词条的第一个字符,默认为true |
auto_generate_synonyms_phrase_query | 布尔值。设置为true时,会为多词条同义词自动创建匹配短语查询,默认值为true |
enable_position_increments | 布尔值。指定查询结果中的位置增量是否打开 ,默认是true |
fuzzy_max_expansions | 使用模糊查询时,指定模糊查询可被扩展到的最大词条数,默认是50 |
fuzzy_prefix_length | 指定生成的模糊查询中的前缀长度,默认为0. |
phrase_slop | 指定短语溢出值,默认为0 |
boost | 指定使用的加权值,默认为1.0 |
analyze_wildcard | 指定是否应该分析通配符查询生成的词条,默认为false |
fields | 字符串数组。用于查询的字段数组 |
minimum_should_match | 控制有多少生成的boolean should子句必须与文档匹配,才能认为它是匹配的。可以是百分比,也可以是整数值。 |
fuzziness | 控制模糊查询的行为 |
max_determined_states | 默认是10000。用于设置处理正则表达查询时自动机可以持有的状态数。 |
fuzzy_transpositions | 布尔值。模糊匹配的编辑包括两个相邻字符的换位。默认为true。 |
time_zone | 设置用于在日期字段作区间查询的时区 |
lenient | 布尔值。如果设置为true,格式方面的失败将被忽略 |
quote_analyzer | 字符串。用于将查询字符串中的引用文本转成标识的分析器。对于default_field默认是search_quote_analyzer |
quote_field_suffix | 字符串。添加到查询字符串中引用文本的后缀 |
rewrite | 字符串。用于重写查询的方法。 |
3.9 simple_query_string查询
与query_string相似,支持lucene查询语法。但是当解析失败时,不会抛出异常。
支持参数有query,fields,default_operator,analyzer,lowercase_expanded_terms,locale,lenient,minimum_should_match
3.10 标识符查询
用于_uid字段,所以要求禁用_id字段
{
"query": {
"ids": {
"values": ["1", "2", "3"]
}
}
}
3.11 prefix查询
基于某个字段前缀匹配来匹配文档
{
"query": {
"prefix": {
"title": "cri"
}
}
}
3.12 fuzzy查询
用于查找值与给定值相似的文档。词条相似性基于编辑距离算法计算。
{
"query": {
"fuzzy": {
"title": "crme"
}
}
}
支持的参数有
value | 指定实际的查询 |
boost | 指定查询的加权值。默认是1.0 |
fuzziness | 控制生成的模糊查询行为 |
prefix_length | 差异词条的公共前缀长度,默认是0 |
max_expansions | 指定查询扩展的最大词条数,默认是无界的。 |
3.13 wildcard查询
允许使用*和?通配符。也支持加权
{
"query": {
"wildcard": {
"title": "cr?me"
}
}
}
3.14 range查询
查找字段值在某一区间,可用于数值也可用于字符串、日期。用于单字段,并且查询参数需要封装到字段名称。
支持的参数
gte | 值大于等于给定值 |
gt | 值大于给定值 |
lte | 值小于等于给定值 |
lt | 值小于给定值 |
3.15 regexp查询
查询文本中允许使用正则表达式
{
"query": {
"regexp": {
"title": {
"value": "cr.m[ae]",
"boost": 10.0
}
}
}
}
3.16 more_like_this查询
查询得到与提供的类似的文档。支持的参数有
fields | 用于查询的字段数组。默认是_all |
like | 支持两种形式,一种是文本,另外一种是数组。提供返回的文档需要与其相似的值。 |
unlike | 与like修改,是要求不相似 |
min_term_freq | 定义文档中词条的最低词频,低于此频率的词条会忽略。默认是2 |
max_query_terms | 任何生成的查询包含的最大词条数,默认是25 |
stop_words | 定义一个单词的数组,当比较文档和查询时,这些单词被忽略。默认是空数组 |
min_doc_freq | 定义包含某词条的文档的最小数目,低于此数目时,该词条将被忽略。默认值是5 |
max_doc_freq | 定义包含某词条的文档的最大数目,高于此数目时,该词条将被忽略。默认是没有限制 |
min_word_len | 单词的最小长度,低于此长度的单词被忽略,默认值是0 |
max_word_len | 单词的最大长度,高于此长度的单词被忽略,默认值是无限制 |
boost_terms | 词条加权值,默认是0 |
boost | 用于查询的加权值。默认是1 |
include | 指定是否文档在查询的返回结构中是否包含。默认是false,表示输入文档不应该包含。 |
minimum_should_match | 控制在文档中需要匹配的词条数。默认是30% |
analyzer | 用于分析给定文本的分析器名字。 |
3.17 type查询
在7.0.0中已经过期,不推荐使用
{
"query": {
"type": {
"value": "_doc"
}
}
}
4、复合查询
4.1 bool查询
可以封装无查询,通过should,must或者must_not连接。
连接方式
should | 被封装的查询可能匹配,也可能不匹配。匹配的should节点数目由minimum_should_match控制 |
must | 被封装的查询必须匹配,文档才会返回 |
must_not | 被封装的查询必须不被匹配,文档才会返回 |
支持的参数
filter | 指定查询的部分被作为过滤器 |
boost | 指定查询的加权值,默认是1.0 |
minimum_should_match | 匹配要求should子句必须匹配的最小数目 |
disable_coord | 默认值为false。允许启用或禁用分数因子的计算。该计算是基于文档包含的所有查询词条。 |
4.3 dis_max查询
返回所有子查询的并集。支持的参数queries,tie_breaker,boost
4.4 boosting查询
封装两个查询,并且降低其中一个查询返回文档的得分。有三个节点需要定义
positive | 查询对象,必选项。文档得分保持不变的查询 |
negative | 查询对象,必选项。文档得分降低的查询 |
negative_boosting | 必选项,float类型。用于降低第二部分查询得分的加权值 |
4.5 constant_score查询
封装另一个查询,为封装查询返回的每个文档返回一个常量得分。通过使用boost属性指定分数,默认是1.0
最外一层的支持的参数为
filter | 必选项。过滤查询。 |
boost | 可选项,float类型,默认值1.0 |
4.6 indices查询
提供的节点
indices | 索引列表 |
query | 在索引列表上查询 |
not_match_query | 在其它的索引上执行 |
5、span查询
5.1 span_term查询
{
"query": {
"span_term": {
"description": {
"value": "world",
"boost": 5.0
}
}
}
}
5.2 span_firsts查询
{
"query": {
"span_first": {
"match": {
"span_term": {
"description": "world"
}
},
"end": 2
}
}
}
5.3 span_near查询
{
"query": {
"span_near": {
"clauses": [{
"span_term": {
"description": "world"
}
},
{
"span_term": {
"description": "everyone"
}
}
],
"slop": 0,
"in_order": true
}
}
}
5.4 span_or查询
{
"query": {
"span_or": {
"clauses": [{
"span_first": {
"match": {
"span_term": {
"description": "world"
}
},
"end": 2
}
},
{
"span_near": {
"clauses": [{
"span_term": {
"description": "world"
}
},
{
"span_term": {
"description": "everyone"
}
}
],
"slop": 1,
"in_order": true
}
}
]
}
}
}
5.5 span_not查询
5.6 span_within查询
5.7 span_containing查询
5.8 span_multi查询