ElasticSearch5.x实践_day06_01_Query DSL
2017-08-01 00:00
323 查看
摘要: ElasticSearch5.x实践_day06_01_Query DSL
+ Leaf query clauses:叶子节点的查询子句,主要用于检索特定字段的特定值,例如match、term、range查询。这些子句可以嵌套自己。 (query已被废弃)
+ Compound query clauses:复合子句,用于组合多个叶子查询子句,形成逻辑,例如bool或者dis_max查询,或者行为修改(例如constant_score查询)
查询子句在query上下文与filter上下文表现有所区别。
+ 年龄是否大于18岁
+ 状态是否是正常
大量使用过滤上下文时,过滤查询会被ES自动缓存,加速性能。当查询子句放入“filter”参数中时,会被置于过滤环境中,例如bool查询中的filter或者must_not、constant_score中的filter参数以及聚集中的filter,都是过滤上下文环境。具体过滤如何缓存,会单独介绍。
![](https://static.oschina.net/uploads/img/201708/01223603_rjVJ.jpg)
1. 查询参数,表示查询上下文
2. bool查询,其中两个match查询子句(3和4),位于查询上下文中,用于计算匹配程度
5. 过滤参数,表示过滤上下文
6. 过滤上下文中的term查询,用于过滤数据
7. 过滤上下文中的range擦好像,用于过滤数据
如果对于某个查询条件,希望更改其计算_score的权重,可以使用boost参数:
相关(relevance):相关是将查询到相关的文档结果进行排名的一种能力,这种相关度可以是根据TF/IDF、地理位置相似性(geolocation)、模糊相似,或者其他的一些算法得出。
分析(analysis):将一个文本块转换为唯一的、规范化的token的过程,目的是为了(a)创建反向索引以及(b)查询反向索引。
当我们提到相关与分析的时候,我们已经身处查询上下文之中,而不是过滤。
+ 如果我们用它来查询 时间(date) 或 整数(integer),他们会将查询字符串用分别当作 时间 和 整数。
+ 如果查询一个准确的(未分析过的 not_analyzed)字符串字段,它会将整个查询字符串当成一个术语。
+ 但是如果要查询一个全文字段(分析过的 analyzed),它会讲查询字符串传入到一个合适的分析器,然后生成一个供查询的术语列表。
一旦查询组成了一个术语列表,它会对每个术语逐一执行低层次的查询,然后将结果合并,为每个文档生成一个最终的相关性分数。
注意:
当我们想要准确查询一个未分析过(not_analyzed)的字段之前,需要仔细想想,我们询还是一个过到底是想要一个查滤。
单术语查询通常可以用是非问题表示,所以更适合用过滤来表达,而且这样子可以有效利用过滤的缓存。
下面对全文本查询进行详细介绍:
其中message是字段名称,可以根据情况替换。上面的查询会先对this is a test进行分词,对每个term进行匹配并合并结果。
operator:其操作符operator可以设定为and或者or,用于控制查询结构的构建。
minimum_should_match:当存在多个should可选时,可以通过minimum_should_match来设定最少匹配的should条件个数。
analyzer:可以控制文本分析器
lenient:默认为false,当设定为true时,可以忽略类型不匹配导致的异常
fuzziness==> prefix_length,表明这个范围的字符需要精准匹配,如果不指定prefix_lengh和fuzziniess参数,该查询负担较重。
例如:下面例子会查询包含this is a test短语,且顺序与其一致(中间不能间隔其他)的文档。
有时不希望对顺序要求过于严格,可以通过设定slop,指定可以移动查询字符串的token的次数,最终使其顺序一致。如果slop足够大,其检索与忽略顺序一致。例如
参见文章==>
可以对各字段分配不同权重,例如下面例子中,subject的权重是message的三倍:
multi match查询包括以下几种类型:
http://blog.csdn.net/bigbigtreewhu/article/details/53353738#match-all-query-1
概述
Elasticsearch提供基于Json的查询功能,将DSL查询看做AST树的话,包含两种子句类型:+ Leaf query clauses:叶子节点的查询子句,主要用于检索特定字段的特定值,例如match、term、range查询。这些子句可以嵌套自己。 (query已被废弃)
+ Compound query clauses:复合子句,用于组合多个叶子查询子句,形成逻辑,例如bool或者dis_max查询,或者行为修改(例如constant_score查询)
查询子句在query上下文与filter上下文表现有所区别。
查询context与过滤context
查询上下文
查询上下文中的查询子句,用于计算文档与该查询的相似程度,同时计算_score用于衡量相似度。当查询子句放入query中时,此时该查询子句就处于查询上下文中。例如:POST http://node1:9200/my_index/_search { "query":{ "match":{ "message":"test" } } }
过滤上下文
过滤上下文中的查询子句主要解决“这个文档是否符合这个查询子句”,其结果不是相似度,结果只有“是”或者“否”。过滤上下文主要用于过滤数据,例如+ 年龄是否大于18岁
+ 状态是否是正常
大量使用过滤上下文时,过滤查询会被ES自动缓存,加速性能。当查询子句放入“filter”参数中时,会被置于过滤环境中,例如bool查询中的filter或者must_not、constant_score中的filter参数以及聚集中的filter,都是过滤上下文环境。具体过滤如何缓存,会单独介绍。
示例
总结:将影响文档相似度计算的查询,放入query上下文中,将其他的查询放入filter的上下文中。POST http://node1:9200/my_index/_search { "query":{ "bool":{ "must":[ {"match":{"title":"Search"}}, {"match":{"content":"Elasticsearch"}} ], "filter":[ {"term":{"status":"published"}}, {"range":{"publish_date":{"gte":"2015-01-01"}}} ] } } }
![](https://static.oschina.net/uploads/img/201708/01223603_rjVJ.jpg)
1. 查询参数,表示查询上下文
2. bool查询,其中两个match查询子句(3和4),位于查询上下文中,用于计算匹配程度
5. 过滤参数,表示过滤上下文
6. 过滤上下文中的term查询,用于过滤数据
7. 过滤上下文中的range擦好像,用于过滤数据
Match All Query
Match All Query
最简单的查询:匹配所有文档,对每个文档打分_score为1.0,相当于关系数据库中的select * from tablePOST http://node1:9200/my_index/_search { "query": { "match_all": {} } }
如果对于某个查询条件,希望更改其计算_score的权重,可以使用boost参数:
POST http://node1:9200/my_index/_search { "query": { "match_all": {"boost" : 1.2} } }
Match None Query
与全检索相反,可以使用match_none,不匹配任何文档POST http://node1:9200/my_index/_search { "query": { "match_none": {} } }
全文检索
全文搜索两个最重要的方面是:相关(relevance):相关是将查询到相关的文档结果进行排名的一种能力,这种相关度可以是根据TF/IDF、地理位置相似性(geolocation)、模糊相似,或者其他的一些算法得出。
分析(analysis):将一个文本块转换为唯一的、规范化的token的过程,目的是为了(a)创建反向索引以及(b)查询反向索引。
当我们提到相关与分析的时候,我们已经身处查询上下文之中,而不是过滤。
Full text queries
高层级的全文检索,通常会对文本的整体内容进行分析查询。在检索前会使用每个字段的analyzer对查询字段进行分词。+ 如果我们用它来查询 时间(date) 或 整数(integer),他们会将查询字符串用分别当作 时间 和 整数。
+ 如果查询一个准确的(未分析过的 not_analyzed)字符串字段,它会将整个查询字符串当成一个术语。
+ 但是如果要查询一个全文字段(分析过的 analyzed),它会讲查询字符串传入到一个合适的分析器,然后生成一个供查询的术语列表。
一旦查询组成了一个术语列表,它会对每个术语逐一执行低层次的查询,然后将结果合并,为每个文档生成一个最终的相关性分数。
注意:
当我们想要准确查询一个未分析过(not_analyzed)的字段之前,需要仔细想想,我们询还是一个过到底是想要一个查滤。
单术语查询通常可以用是非问题表示,所以更适合用过滤来表达,而且这样子可以有效利用过滤的缓存。
下面对全文本查询进行详细介绍:
Match Query匹配查询
match查询接受文本、数值、时间类型的数据,对其进行分析,构建查询。简单示例:POST http://node1:9200/my_index/_search { "query":{ "match":{ "message":"this is a test" } } }
其中message是字段名称,可以根据情况替换。上面的查询会先对this is a test进行分词,对每个term进行匹配并合并结果。
match
match是布尔类型的查询,通过对提供的文本进行analyze,构建一个boolean的查询。operator:其操作符operator可以设定为and或者or,用于控制查询结构的构建。
minimum_should_match:当存在多个should可选时,可以通过minimum_should_match来设定最少匹配的should条件个数。
analyzer:可以控制文本分析器
lenient:默认为false,当设定为true时,可以忽略类型不匹配导致的异常
Fuzziness
fuziness可以开启模糊匹配功能。通过设定模糊参数,修改匹配时可以容忍的差距,该值最后在0-2之间,值越大,则计算时间越长。例如下面的例子中,名称多了一个a,通过模糊匹配也能查找出来:PUT http://node1:9200/my_index { "mappings":{ "my_type":{ "properties":{ "name":{ "type":"text", "analyzer":"simple" } } } } } POST http://node1:9200/my_index/my_type/1 {"name":"Vacuum Cleaner"} POST http://node1:9200/my_index/my_type/1 {"name":"Turkey Baster"} POST http://node1:9200/my_index/_search { "query":{ "match":{ "name":{ "query":"Vacuum", "fuzziness":2, "prefix_length":1 } } } }
fuzziness==> prefix_length,表明这个范围的字符需要精准匹配,如果不指定prefix_lengh和fuzziniess参数,该查询负担较重。
zero terms query
cutoff frequency
指定文档频率match_phrase
短语匹配,通过对查询字符串进行分词,并记录token的位置关系,然后对待查询的字段进行过滤查询分析。例如:下面例子会查询包含this is a test短语,且顺序与其一致(中间不能间隔其他)的文档。
POST http://node1:9200/my_index/my_type/1 {"name":"hello boy my name is joy"} POST http://node1:9200/my_index/my_type/2 {"name":"hello my name boy joy is"} POST http://node1:9200/my_index/_search { "query":{ "match_phrase":{ "name":"name is" } } } --> 只能查询出 { "took": 19, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 1, "max_score": 0.53484553, "hits": [ { "_index": "my_index", "_type": "my_type", "_id": "1", "_score": 0.53484553, "_source": { "name": "hello boy my name is joy" } } ] } }
有时不希望对顺序要求过于严格,可以通过设定slop,指定可以移动查询字符串的token的次数,最终使其顺序一致。如果slop足够大,其检索与忽略顺序一致。例如
POST http://node1:9200/my_index/_search { "query":{ "match_phrase":{ "name":{ "query":"is name", "slop":10 } } } } --> { "took": 12, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 2, "max_score": 0.2481963, "hits": [ { "_index": "my_index", "_type": "my_type", "_id": "1", "_score": 0.2481963, "_source": { "name": "hello boy my name is joy" } }, { "_index": "my_index", "_type": "my_type", "_id": "2", "_score": 0.16159163, "_source": { "name": "hello my name boy joy is" } } ] } }
Match Phrase Prefix Query
与match_phrase类似,但最后一个token作为前缀进行匹配,其最长的匹配长度由max_expansions设定:POST http://node1:9200/my_index/_search { "query":{ "match_phrase_prefix":{ "message":{ "query":"quick brown f", "max_expansions":10 } } } }
参见文章==>
multi match query
允许对多个字段进行同时检索:POST http://node1:9200/my_index/_search { "query":{ "multi_match":{ "query":"this is a test", "fields":["subject","message"] } } }
可以对各字段分配不同权重,例如下面例子中,subject的权重是message的三倍:
{ "query":{ "multi_match":{ "query":"this is a test", "fields":["subject^3","message"] } } }
multi match查询包括以下几种类型:
best_fields
将每个match查询封入dis_max中,这样可以保证精确匹配得分更高http://blog.csdn.net/bigbigtreewhu/article/details/53353738#match-all-query-1
相关文章推荐
- ElasticSearch5.x实践_day02_01_ElasticSearch Update
- ElasticSearch5.x实践_day01_01_ElasticSearch基础概念
- ElasticSearch5.x实践_day05_01_Mapping_Field datatype
- ElasticSearch5.x实践_day03_01_curl
- ElasticSearch5.x实践_day05_04_Mapping参数
- ElasticSearch5.x实践_day01_02_ElasticSearch集群部署
- ElasticSearch5.x实践_day05_03_Mapping_Meta-Fields(元数据)
- ElasticSearch5.x实践_day05_02_Mapping的写入、查看与修改
- AngularJS实践(01)
- React 实践记录 01 组件开发入门
- elasticsearch5.x(一)elasticsearch、logstash、kibana安装步骤(windows)
- Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
- 前端构建实践01:用 Bower 管理前端依赖
- centos7安装elasticsearch5.x
- ANDROID NDK实践开发系列--(01) 使用ndk编译c可执行程序
- elasticsearch5.x下载与启动
- Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
- Elasticsearch入门实践
- Unity3D实践系列01,创建项目
- Elasticserch基础-01