3.3
基本查询
3.3.1
词条查询
词条查询是未经分析的,要跟索引文档中的词条完全匹配
注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜索;
因为Crime一词在建立索引时已经变成了crime。
{
"query": {
"term": {
"title": "crime"
}
}
}
在词条查询汇总可包含加权属性,影响给定词条的重要程度
{
"query": {
"term": {
"value": "crime",
"boost": 10.0
}
}
}
3.3.2
多词条查询
获取所有在tags字段中含有novel或book的文档
{
"query": {
"term": {
"tags": [
"novel",
"book"
],
"minium_match": 1
}
}
}
3.3.3
match_all查询
得到索引中的所有文档
{
"query": {
"term": {
"match_all": {}
}
}
}
包含权值,将赋给所有跟它匹配的文档【(?,有何必要?)】
{
"query": {
"term": {
"match_all": {
"boost": 2.0
}
}
}
}
3.3.4
常用词查询
为提高常用词的查询相关性和精确性
例如,"crime and punishment"
"and"非常常见,对文档得分的影响非常低;
解决办法:
将查询分为2组,第一组包含重要的词,出现的频率较低;
第二组包含高频率的、不那么重要的词;
先执行第一个查询,Elasticsearch从第一组的所有词中计算分数,这样通常都很重要的低频词总是被列入考虑范围;
然后,Elasticsearch对第二组中的词执行二次查询,但只为与第一个查询中匹配的文档计算得分;
这样只计算了相关文档的得分,实现了更高的性能;
{
"query": {
"common": {
"title": {
"query": "crime and punishment",
"cutoff_frequency": 0.001
}
}
}
}
【cutoff_frequency 此参数设置为0.001意味着频率<=0.1%的词将出现在低频词组中】
查询可使用下列参数。
query:这个参数定义了实际的查询内容。
cutoff_frequency:这个参数定义一个百分比(0.001表示0.1%)或一个绝对值(当此
属性值>=1时)。这个值用来构建高、低频词组。此参数设置为0.001意味着频率<=0.1%的
词将出现在低频词组中。
low_freq_operator:这个参数可以设为or或and,默认是or。它用来指定为低频词组
构建查询时用到的布尔运算符。如果希望所有的词都在文档中出现才认为是匹配,应该
把它设置为and。
high_freq_operator:这个参数可以设为or或and,默认是o。它用来指定为高频词组
构建查询时用到的布尔运算符。如果希望所有的词都在文档中出现才认为是匹配,那么
应该把它设置为and。
minimum_should_match:不使用low_freq_operator和high_freq_operator参数
的话,可以使用minimum_should_match参数。和其他查询一样,它允许指定匹配的文
档中应该出现的查询词的最小个数。
boost:这个参数定义了赋给文档得分的加权值。
analyzer:这个参数定义了分析查询文本时用到的分析器名称。默认值为default
analyzer。
disable_coord:此参数的值默认为false,它允许启用或禁用分数因子的计算,该计
算基于文档中包含的所有查询词的分数。把它设置为true,得分不那么精确,但查询将
稍快。
【不像词条查询和多词条查询,常用词查询是经过Elasticsearch分析的。】
3.3.5
match查询
match查询把query参数中的值拿出来,加以分析,然后构建相应的查询。使用match查询
时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建
立索引时相同的分析器处理。请记住,match查询(以及将在稍后解释的multi_match查询)不
支持Lucene查询语法。但是,它是完全符合搜索需求的一个查询处理器。
{
"query": {
"match": {
"title": "crime and punishment"
}
}
}
{
"query": {
"fuzzy": {
"title": "crme"
}
}
}
{
"query": {
"wildcard": {
"title": "cr?me"
}
}
}
上面的查询将匹配所有在title字段含有crime、and或punishment词条的文档。
3.3.5
match查询
match查询把query参数中的值拿出来,加以分析,然后构建相应的查询。使用match查询
时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建
立索引时相同的分析器处理。请记住,match查询(以及将在稍后解释的multi_match查询)不
支持Lucene查询语法。但是,它是完全符合搜索需求的一个查询处理器。
1. 布尔值匹配查询
布尔匹配查询分析提供的文本,然后做出布尔查询。有几个参数允许控制布尔查询匹配行为,
如下所示。
operator:此参数可以接受or和and,控制用来连接创建的布尔条件的布尔运算符。默
认值是or。如果希望查询中的所有条件都匹配,可以使用and运算符。
analyzer:这个参数定义了分析查询文本时用到的分析器的名字。默认值为default
analyzer。
fuzziness:可以通过提供此参数的值来构建模糊查询(fuzzy query)。它为字符串类型
提供从0.0到1.0的值。构造模糊查询时,该参数将用来设置相似性。
prefix_length:此参数可以控制模糊查询的行为。有关此参数值的更多信息,请参阅
3.3.11节。
max_expansions:此参数可以控制模糊查询的行为。有关此参数值的更多信息,请参
阅3.3.11节。
zero_terms_query:该参数允许指定当所有的词条都被分析器移除时(例如,因为停
止词),查询的行为。它可以被设置为none或all,默认值是none。在分析器移除所有查
询词条时,该参数设置为none,将没有文档返回;设置为all,则将返回所有文档。
cutoff_frequency:该参数允许将查询分解成两组:一组低频词和一组高频词。参阅
3.3.4节,看看这个参数怎么用。
这些参数应该封装在运行查询的字段名称里。所以如果想对title字段运行一个简单的布尔
匹配查询,发送如下查询:
{
"query": {
"match": {
"title": {
"query": "crime and punishment",
"operator": "and"
}
}
}
}
2、match_pharse查询
从分析后的文本中构建短语查询,而不是布尔子句。
slop 定义文本查询中的词条和词条之间可以有多少个未知词条,已被视为跟一个短语匹配。默认0,例如slop=1,“a b”和"a and b"被视为匹配。
analyzer 定义分析器。
{"query":{
"match_pharse":{
"title":{
"query":"crime punishment",
"slop":1
}
}
}}
3、match_pharse_prefix
同match_pharse,但允许查询文本的最后一个词条只做前缀匹配;
{"query":{
"match_pharse_prefix":{
"title":{
"query":"crime and punishm",
"slop":1,
"max_expansions":20
}
}
}}
3.3.6
multi_match
不是针对单个字段,而是可以通过fields参数针对多个字段查询。
{"query":{
"multi_match":{
"query":"crime and punishm",
"fields":["title","otitle"]
}
}}
3.3.7
query_string查询
支持Apache Lucene查询语法
{ "query" : { "query_string" : { "query" : "title:crime^10 +title:punishment -otitle:cat +author:(+Fyodor +dostoevsky)", "default_field" : "title" } } }
title字段中包含crime词条的文档,且这些文档有10的加权
title字段包含punishment,而otitle字段不包含cat
像大多数Elasticsearch查询一样,query_string提供下列参数控制查询行为。
query:此参数指定查询文本。
default_field:此参数指定默认的查询字段,默认值由index.query.default_
field属性指定,默认为_all。
default_operator:此参数指定默认的逻辑运算符(or或and),默认值是or。
allow_leading_wildcard:此参数指定是否允许通配符作为词条的第一个字符,默认
值为true。
lowercase_expand_terms:此参数指定查询重写是否把词条变成小写,默认值为true,
意味着重写后的词条将小写。
enable_position_increments:此参数指定查询结果中的位置增量是否打开,默认值
是true。
fuzzy_max_expansions:使用模糊查询时,此参数指定模糊查询可被扩展到的最大词
条数,默认值是50。
fuzzy_prefix_length:此参数指定生成的模糊查询中的前缀长度,默认值为0。欲了
解更多信息,请参阅3.3.11节。
fuzzy_min_sim:此参数指定模糊查询的最小相似度,默认值为0.5。欲了解更多信息,
请参阅3.3.11节。
phrase_slop: 此参数指定短语溢出值,默认值为0。欲了解更多信息,请参阅3.3.5节。
boost:此参数指定使用的加权值,默认值为1.0。
analyze_wildcard:此参数指定是否应该分析通配符查询生成的词条,默认为false,
意味着词条不会被分析。
auto_generate_phrase_queries:此参数指定是否自动生成短语查询。其默认值为
false,这意味着不会自动生成。
minimum_should_match:此参数控制有多少生成的Boolean should子句必须与文档
匹配,才能认为它是匹配的。它可以是百分比,例如50%,这意味着至少有50%的给定词
条必须匹配。它也可以是整数值,如2,这意味着至少2个词条必须匹配。
lenient:此参数的取值true或false。如果设置为true,格式方面的失败将被忽略。
DisMax是Disjunction Max的缩写。Disjunction指搜索执行可以跨多个字段,每个字段可以给
予不同的权重。Max意味着,对于给定词条,只有最高分会包括在最后的文档评分中,而不是所
有包含该词条的所有字段分数之和(简单的布尔查询才会这样)。
注意,Elasticsearch可以重写query_string查询,正因为如此,Elasticsearch使我们能够传
递额外的参数来控制重写方法。有关此过程的详细信息,请参阅3.2节。
DisMax是Disjunction Max的缩写。Disjunction指搜索执行可以跨多个字段,每个字段可以给 予不同的权重。Max意味着,对于给定词条,只有最高分会包括在最后的文档评分中,而不是所 有包含该词条的所有字段分数之和(简单的布尔查询才会这样)。
针对多字段的query_string查询
{ "query" : { "query_string" : { "query" : "crime punishment", "fields" : [ "title", "otitle" ], "use_dis_max" : true } } }
3.3.8
simple_query_string查询使用Lucene的最新查询解析器之一:SimpleQueryParser。 类似字符串查询,它接受Lucene查询语法;然而不同的是,simple_query_string查询在解析 错误时不会抛出异常。它丢弃查询无效的部分,执行其余部分,示例如下:
{ "query" : { "simple_query_string" : { "query" : "title:crime^10 +title:punishment -otitle:cat +author:(+Fyodor +dostoevsky)", "default_operator" : "and" } } }
3.3.9
标识符查询
仅用提供的标识符来过滤返回的文档
针对内部的_uid字段运行,不需要启用_id字段
{ "query" : { "ids" : { "values" : [ "10", "11", "12", "13" ] } } }
限定文档为book类型
{ "query" : { "ids" : { "type" : "book", "values" : [ "10", "11", "12", "13" ] } } }
3.3.10
前缀查询
特定的字段以给定的前缀开始
{"query":{"prefix":{"title":"cri"}}}
加入加权属性
{"query":{"prefix":{"title":{"value":"cri","boost":3.0}}}}
3.3.11
fuzzy_like_this查询
fuzzy_like_this查询类似于more_like_this查询。它查找所有与提供的文本类似的文 档,但是它有点不同于more_like_this查询。它利用模糊字符串并选择生成的最佳差分词条。 如果针对title和otitle字段的fuzzy_like_this查询来查找所有类似于crime punishment 的文档,可以运行以下查询:
{ "query" : { "fuzzy_like_this" : { "fields" : ["title", "otitle"], "like_text" : "crime punishment" } } }
fuzzy_like_this查询支持以下查询参数。
fields:此参数定义应该执行查询的字段数组,默认值是_all字段。
like_text:这是一个必需参数,包含用来跟文档比较的文本。
ignore_tf:此参数指定在相似度计算期间,是否应忽略词频,默认值为false,意味
着将使用词频。
max_query_terms:此参数指定生成的查询中能包括的最大查询词条数,默认值为25。
min_similarity:此参数指定差分词条(differencing terms)应该有的最小相似性,默
认值为0.5。
prefix_length:此参数指定差分词条的公共前缀长度,默认值为0。
boost:此参数指定使用的加权值,默认值为1.0。
analyzer:这个参数定义了分析所提供文本时用到的分析器名称。
3.3.12
fuzzy_like_this_field查询
fuzzy_like_this_field查询和fuzzy_like_this查询类似,但它只能对应单个字段。 正因为如此,它不支持多字段属性。作为替代,应该把查询参数封装到字段名称中。查询title 字段的一个示例查询类似于下面这样:
{ "query" : { "fuzzy_like_this_field" : { "title" : { "like_text" : "crime and punishment" } } } }
3.3.13
fuzzy查询
{ "query" : { "fuzzy" : { "title" : "crme" } } }
查询响应如下所示:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0,
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "library",
"_type": "book",
"_id": "4",
"_score": 0.15342641,
"_source": {
"title": "Crime and Punishment",
"otitle": "Преступлéние и наказáние",
"author": "Fyodor Dostoevsky",
"year": 1886,
"characters": [
"Raskolnikov",
"Sofia Semyonovna Marmeladova"
],
"tags": [],
"copies": 0,
"available": true
}
}
]
}
}
}
即使犯了一个拼写错误,Elasticsearch仍然设法找到我们感兴趣的文档。
可以使用下面的参数来控制fuzzy查询的行为。
value:此参数指定了实际的查询。
boost:此参数指定了查询的加权值,默认为1.0。
min_similarity:此参数指定了一个词条被算作匹配所必须拥有的最小相似度。对字
符串字段来说,这个值应该在0到1之间,包含0和1。对于数值型字段,这个值可以大于1,
比如查询值是20,min_similarity设为3,则可以得到17~23的值。对于日期字段,可
以把min_similarity参数值设为1d、2d、1m等,分别表示1天、2天、1个月。
prefix_length:此参数指定差分词条的公共前缀长度,默认值为0。
max_expansions:此参数指定查询可被扩展到的最大词条数,默认值是无限制。
参数应该封装在查询针对的字段名称里。所以如果想修改前面的查询,并添加额外的参数,
查询将如下所示:
{ "query" : { "fuzzy" : { "title" : { "value" : "crme", "min_similarity" : 0.2 } } } }
3.3.14
通配符查询
{ "query" : { "wildcard" : { "title" : "cr?me" } } }
加权
{ "query" : { "wildcard" : { "title" : { "value" : "cr?me", "boost" : 20.0 } } } }
3.3.15 more_like_this 查询
more_like_this查询让我们能够得到与提供的文本类似的文档。Elasticsearch支持几个参数
来定义more_like_this查询如何工作,如下所示。
fields:此参数定义应该执行查询的字段数组,默认值是_all字段。
like_text:这是一个必需的参数,包含用来跟文档比较的文本。
percent_terms_to_match:此参数定义了文档需要有多少百分比的词条与查询匹配才
能认为是类似的,默认值为0.3,意思是30%。
min_term_freq:此参数定义了文档中词条的最低词频,低于此频率的词条将被忽略,
默认值为2。
max_query_terms:此参数指定生成的查询中能包括的最大查询词条数,默认值为25。
值越大,精度越大,但性能也越低。
stop_words:此参数定义了一个单词的数组,当比较文档和查询时,这些单词将被忽略,
默认值为空数组。
min_doc_freq:此参数定义了包含某词条的文档的最小数目,低于此数目时,该词条将
被忽略,默认值为5,意味着一个词条至少应该出现在5个文档中,才不会被忽略。
max_doc_freq:此参数定义了包含某词条的文档的最大数目,高于此数目时,该词条将
被忽略,默认值为无限制。
min_word_len:此参数定义了单词的最小长度,低于此长度的单词将被忽略,默认值为0。
max_word_len:此参数定义了单词的最大长度,高于此长度的单词将被忽略,默认值为
无限制。
boost_terms:此参数定义了用于每个词条的加权值,默认值为1。
boost:此参数定义了用于查询的加权值,默认值为1。
analyzer:此参数指定了针对我们提供的文本的分析器名称。
{ "query" : { "more_like_this" : { "fields" : [ "title", "otitle" ], "like_text" : "crime and punishment", "min_term_freq" : 1, "min_doc_freq" : 1 } } }
3.3.16
more_like_this_field查询
{ "query" : { "more_like_this_field" : { "title" : { "like_text" : "crime and punishment", "min_term_freq" : 1, "min_doc_freq" : 1 } } } }
more_like_this查询中的所有其他参数都可以同样的方式作用于more_like_this_ filed查询。
3.3.17
范围查询
范围查询只能针对单个字段,查询参 数应封装在字段名称中。
{ "query" : { "range" : { "year" : { "gte" : 1700, "lte" : 1900 } } } }
3.3.18
最大分查询
{
"query": {
"dismax": {
"tie_breaker": 0.99,
"boost": 10.0,
"queries": [
{
"match": {
"title": "crime"
}
},
{
"match": {
"author": "fyodor"
}
}
]
}
}
}
文档最后得分计算
最大分查询非常有用,因为它会生成一个由所有子查询返回的文档组成的并集并将它返回。
这个查询好的一面是,我们可以控制较低得分的子查询对文档最后得分的影响。
文档的最后得分是这样计算的:最高分数的子查询的得分之和,加上其余子查询的得分之和
乘以tie参数的值。所以,可以通过tie_breaker参数来控制较低得分的查询对最后得分的影响。
把tie_breaker设为1.0,得到确切的总和;把tie_breaker设为0.1,结果,除最高得分的查
询外,只有所有查询总得分的10%被加到最后得分里。
可以看到,我们在查询中包含了tie_breaker和boost参数。此外,在queries参数中指定
了一组查询,这些查询将执行并产生结果文档的并集。
3.3.19
正则表达式查询
{ "query" : { "regexp" : { "title" : { "value" : "cr.m[ae]", "boost" : 10.0 } } } }
3.4
复合查询
复合查询就是支持可以把多个查询连接起来,或者改变其他查询的行为。
3.4.1
布尔查询
should:被它封装的布尔查询可能被匹配,也可能不被匹配。被匹配的should节点数目由minimum_should_match参数控制。
must:被它封装的布尔查询必须被匹配,文档才会返回。
must_not:被它封装的布尔查询必须不被匹配,文档才会返回。
boost:此参数指定了查询使用的加权值,默认为1.0。加权值越高,匹配文档的得分越高。
minimum_should_match:此参数的值描述了文档被视为匹配时,应该匹配的should
子句的最少数量。举例来说,它可以是个整数值,比如2,也可以是个百分比,比如75%。
更多有关信息,参见 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/
uery-dsl-minimum-should-match.html。
disable_coord:此参数的默认值为false,允许启用或禁用分数因子的计算,该计算
是基于文档包含的所有查询词条。如果得分不必太精确,但要查询快点,那么应该将它
设置为true。
{
"query": {
"bool": {
"must": {
"term": {
"title": "crime"
}
},
"should": {
"range": {
"year": {
"from": 1900,
"to": 2000
}
}
},
"must_not": {
"term": {
"otitle": "nothing"
}
}
}
}
}
3.4.2
加权查询
{
"query": {
"boosting": {
"positive": {
"term": {
"title": "crime"
}
},
"negative": {
"range": {
"year": {
"from": 1800,
"to": 1900
}
}
},
"negative_boost": 0.5
}
}
}
查询title字段中含有crime词条,希望这样的文档得 分不被改变,同时要year字段在1800~1900内的文档,但这样文档的得分要有一个0.5的加权。
加权查询中有三个节点 需要定义:positive部分,包含所返回文档得分不会被改变的查询;negative部分,返回的文 档得分将被降低;negative_boost部分,包含用来降低negative部分查询得分的加权值。 加权查询的优点是,positive部分和negative部分包含的查询结果都会出现在搜索结果 中,而某些查询的得分将被降低。如果使用布尔查询的must_not节点,将得不到这样的结果。
3.4.3
constant_score查询
如果希望 title字段包含crime词条的所有文档的得分为2.0,可以发出以下查询:
{ "query" : { "constant_score" : { "query" : { "term" : { "title" : "crime" } }, "boost" : 2.0 } } }
constant_score查询封装了另一个查询(或过滤),并为每一个所封装查询(或过滤)返 回的文档返回一个常量得分。它允许我们严格控制与一个查询或过滤匹配的文档得分。
3.4.4
索引查询
假设我们有一个别名:books,它持有 两个索引:library和users,我们希望使用别名;然而,我们希望在那些索引上执行不同的查 询,为此,发送以下查询:
{
"query": {
"indices": {
"indices": [
"library"
],
"query": {
"term": {
"title": "crime"
}
},
"no_match_query": {
"term": {
"user": "crime"
}
}
}
}
}
上述查询中,query属性中的查询将执行在library索引上,no_match_query属性中的查
询将执行在集群中其他所有索引上。
no_match_query属性也可以是个字符串值,而不是一个查询。这个字符串值可以是all或
者none,默认是all。设置为all,索引中不匹配的所有文档都会返回;设置为none,索引中不
匹配的文档将不会返回。
Elasticsearch公开的一些查询,如 custom_score查询、custom_
boost_factor查询和custom_filters_scores查询,已经被function_
score查询取代,5.4.3节将描述。我们决定省略这些查询的描述,因为它们在
Elasticsearch的未来版本中可能会被删除。