Elasticsearch查询
Query DSL Elasticsearch提供了一个基于JSON的完整的查询DSL(领域特定语言)。它定义的查询语言由两种类型的子句组成:“叶子查询子句”和“组合查询子句”。 叶子查询子句 叶子查询子句查找特定字段中的特定值,例如 match、term 或 range 查询。 复合查询子句 复合查询子句包装其他叶子或复合查询,并用于以逻辑方式组合多个查询(如 bool 或 dis_max 查询),或更改其行为(如 constant_score 查询)。 1.? Query and filter context 查询子句的行为取决于它是用在查询上下文(query context)还是用在过滤器上下文(filter context): 1.1.? Query context 在查询上下文中的查询子句回答了“这个文档与这个查询子句的匹配程度是怎样的?”问题。除了决定文档是否匹配以外,查询子句还会计算一个“_score”,它表示文档与其他文档的相关程度。 1.2.? Filter context 在过滤器上下文中,一个查询子句回答了“这个文档与查询子句匹配吗?”的问题。这个答案是简单的Yes或者No,也不会计算分数。过滤上下文主要用于过滤结构化数据,例如:
( PS:Query VS Filter
) 频繁使用的过滤器将被Elasticsearch自动缓存,以提高性能。 当查询子句中被传递了一个filter参数时过滤器上下文就生效了。例如,bool查询中的filter参数或者must_not参数。 下面是一个查询子句的例子,这个查询将匹配满足以下所有条件的文档:
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d' { query": { bool: { must: [ { match": { title": Search }},{ content": Elasticsearch }} ],filter: [ { term": { statuspublished }},1)">rangepublish_dategte2015-01-01 }}} ] } } } ' 关于上面的查询子句作如下说明:
(PS:类比SQL的话,match相当于模糊查询,term相当于精确查询,range相当于范围查询) 2.? Match All Query 最简单的查询,匹配所有文档,使它们的_score为1.0 curl -X GET : { match_all: {} } } ' _score可以被改变,通过用boost参数 curl -X GET boost" : 1.2 } } } ' 与match_all相反的是match_none,它不匹配任何文档 curl -X GET match_none' 3.??Full text queries 3.1.? Match Query match查询接受文本/数值/日期类型的数据,分析它们,并构造一个查询。 match是一种布尔类型的查询。这意味着它对提供的文本进行分析,并在分析的过程中为提供的文本构造一个布尔查询。operator 选项可以设置为 or 或者 and 以此来控制布尔子句(默认是 or )。例如: curl -X GET : { messagethis is a test } } } ' 注意,查询语句都是以“query”开头的,这里“message”是字段名 你也可以加一些参数,比如: curl -X GET : { ,1)">operatorand } } } } ' (PS:match是模糊查询) 3.2.??Match Phrase Query match_phrase 查询与 match类似,但是它是用于精确匹配或单词接近匹配的。例如: curl -X GET match_phrase' 当然,你也可以加参数 curl -X GET analyzermy_analyzer' 这里“analyzer”是用来设置用那个分析器来分析文本 3.3.? Match Phrase Prefix Query 类似于match_phrase查询,但是对最后一个单词进行通配符搜索。 match_phrase_prefix允许文本的最后一个单词进行前缀匹配 curl -X GET match_phrase_prefixquick brown f' 除了match_phrase允许的那些参数外,match_phrase_prefix还可以接受一个max_expansions参数,它是用来控制最后一个单词可以扩展多少后缀(默认50)。 curl -X GET max_expansions10' 3.4.? Multi Match Query multi_match 相当于 match 的多字段版本 顾名思义,multi_match可以指定多个字段,而match只能针对一个字段 curl -X GET { : { multi_match : { ": fields": [ subject", ] } } } ' 另外,字段可以用通配符,例如下面的例子中可以查询 title , first_name , last_name 等字段: curl -X GET Will Smith*_name' 单个字段可以被提升,例如: curl -X GET " : [ subject^3' 上面的例子,subject字段的重要性是message字段的三倍 3.5.? Query String Query 支持Lucene查询字符串语法,允许指定 AND | OR | NOT ,并且在单个查询字符串中进行多字段查询 curl -X GET query_stringdefault_fieldthis AND that OR thus' query_string查询解析输入并围绕操作符拆分文本,每个文本部分都是独立分析的,例如: curl -X GET (new york city) OR (big apple)' 上面的例子中,将被拆分成 “new york city” 和 “big apple” 两部分,并且每一部分都被分析器独立分析 注意,按操作符拆分 query_string的参数包括: query 实例被解析的查询文本 default_field 如果没有指定前缀字段的话,这是默认的查询字段。(默认查询所有字段) default_operator 如果没有明确指定操作符的话,那么这是默认的操作符。例如,如果默认操作符是OR的话,那么“my name is jack”将被翻译成“my OR name OR is OR jack”,同理,如果是AND,则被翻译成“my AND name AND is AND jack” analyzer 用来解析查询字符串的解析器的名字 allow_leading_wildcard 如果设置了,那么 * 或 ? 允许作为第一个字符。默认是true lenient 如果设置为true,则格式失败将被忽略 在query_string中,多字段查询应该这样写: curl -X GET " : [name],1)">this AND that' 等价于 curl -X GET : { (content:this OR name:this) AND (content:that OR name:that)' 上面两个是等价的 3.6.??Simple Query String Query simple_query_string 是query_string的一个更简单、更健壮、更适合面向用户的版本 使用SimpleQueryParser解析上下文的查询。与常规的query_string查询不同,simple_query_string查询永远不会抛出异常,并丢弃查询的无效部分。 curl -X GET simple_query_string : { "fried eggs" +(eggplant | potato) -frittata": [title^5bodydefault_operator } } } ' 3.7.? 实例练习 准备数据 // 删除索引 curl -X DELETE 192.168.1.134:9200/book" 创建索引 curl -X PUT settingsnumber_of_shards1 },1)">mappings_docproperties": { typetext },1)">author": { introduction: { dateformatyyyy-MM-dd } } } } } ' 查看索引 curl -X GET 192.168.1.134:9200/book?pretty 插入文档 curl -X PUT 192.168.1.134:9200/book/_doc/1Hello Javazhangsan2008-11-15This is a book for novice. } 查看文档 curl -X GET 192.168.1.134:9200/book/_search?pretty' ? match查询(注意,match查询只能是针对单个字段) 这个例子中,我们用“Java”查询到2条,接下来用“Java入门”将查到5条 这是因为解析器会将“Java入门”拆分为“Java”和“入门”两个单词,而且默认的操作符是or 也就是说,查询的结果是title中包含“Java”或者“入门”的记录 现在变成查询title中同时包含“Java”和“入门”的记录,因此只有1条 ?multi_match多字段查询 ?match_phrase查询 对比不难发现,同样的关键字“Java从”,用match查出5条,用match_phrase只查出1条 ? query_string查询 4.? Term level queries(单词级别查询) 全文本查询会在执行之前对查询字符串进行分析,而单词级别查询会对存储在反向索引中的精确的term进行操作。 这些查询通常用于结构化的数据,比如:numbers , dates ,enums 等,而不是对全文本字段。 (PS:也就是说,全文本查询之前要先对文本内容进行分词,而单词级别的查询直接在相应字段的反向索引中精确查找,单词级别的查询一般用于数值、日期等类型的字段上) 4.1.? Term Query 在指定的字段中查找包含指定的精确的term的文档 term查询将在反向索引(或者叫倒排索引)中查找包含特定的精确的term的文档。例如: curl -X POST " : { userKimchy } } } ' 上面的例子,在user字段的反向索引中查找包含精确的Kimchy的文档 还可以指定一个boost参数,使这个term查询比另一个查询具有更高的相关性得分。例如: curl -X GET should: [ { : { : { valueurgent2.0 } } },{ normal } } ] } } } ' 这个例子中,urgent查询子句有一个boost参数值为2.0,这就意味着它的重要程度是后面的normal查询子句的两倍,normal子句默认的boost是1.0 4.2.? Terms Query 查找包含指定字段中指定的任何确切term的文档 筛选出与所提供的terms中任何一个匹配的文档 curl -X GET termskimchyelasticsearch]} } } 4.3.? Range Query |