【ElasticSearch】查询基础篇

elasticsearch的查询有两部分组成:query and filter。

二者的主要区别在于:filter是不计算相关性的,同时能够cache。所以,filter速度要快于query。

先记录一下es提供的各类query。

如下内容只为当作读书笔记,更多详细细节请参见http://www.elasticsearch.org/guide/

第一部分:query

在须要full-text-search和须要计算相关性的状况下,用query。而filter知足不了需求。

(1)match query and multi-match query //and match-all query and minimum should match query

match queries没有“query parsing”的过程,field不支持通配符,前缀等高级特性,只是参照指定的文本进行analysis,执行query,所以失败概率极小,适合search-box。

analyzed类型的query,故可指定analyzer

operator可指定or/and

zero-terms-query可指定none/all

cutoff-frequency可指定absolute值或者relative值

match-phase query可指定slot值,参见后续的search-in-depth

match-phase-prefix query可指定max_expansion

(2)multi-match query

分别执行为单个field的match的查询。所以最终_score值的计算规则各异。

fields可指定执行须要查询的字段,field能够支持通配符等高级特性(match query是不支持的),field可支持(^)指定各个field的boost权重

types可指定如下值,区分不一样的查询行为:

best _fields:_score决定于得分最高的match-clause。field-centric

most_fields:全部match-clause都会考虑在内。field-centric

cross-fields:把fileds当作一个big-fields。term-centric

phase and phase-prefix:每一个field执行相应的query,combine the score

以上都有具体的应用场景和详细的计算规则,具体请参见后续的search-in-depth。

(3)bool query

一种复合查询,把其他类型的查询包裹进来。支持如下三种逻辑关系。

must: AND   

must_not:NOT

should:OR

(4)boosting query

一种复合查询,分为positive子查询和negitive子查询,二者的查询结构都会返回。

positive子查询的score保持不变,negetive子查询的值将会根据negative_boost的值作相应程度的下降。

(5)common term query

一种略高级的查询,充分考虑了stop-word的低优先级,提升了查询精确性。

将terms分为了两种:more-importent(low-frequency) and less important(high-frequency)。less-important好比stop-words,eg:the and。

分组标准由cutoff_frequence决定。两组query构成bool query。must应用于low_frequence,should应用high_frequence。

每一组内部均可以指定operator和mini_should_match。

若是group后只有一组,则默认退化为单组的子查询。

query执行中首先match到more-import这一组的doc,而后在这个基础上去match less-import,而且计算只计算match到的score。保证了效率,也充分考虑了relevance。

(6)constant score query

不计算相关性的query。沿用index过程当中指定的score,。

(7)dismax query

对子查询的结果作union,score沿用子查询score的最大值。这种查询普遍应用于muti-field的查询。具体能够参见后续更新search-in-depth

(8)filtered query

combine another query with any fillter。

若是不指定query,默认为match_all。当应用多个fitler的时候,能够指定strategy属性,expert-level。

(9)fuzzy query and fuzzy like this query and fuzzy like this field query

fuzzy query :主要根据fuzziniess和prefix_length进行匹配distance查询。根据type不一样distance计算不同。

numeric类型的distance相似于区间,string类型则依据Levenshtein distance,即从一个stringA变换到另外一个stringB,须要变换的最小字母数。

若是指定为AUTO,则根据term的length有如下规则:

0-1:彻底一致

1-4:1

>4:2

推荐指定prefix_length,代表这个范围的字符须要精准匹配,若是不指定prefix_lengh和fuzziniess参数,该查询负担较重。

(10)function score query

定义function去改变doc的score

(11)geoshape query

基于地理位置的查询

(12)has child query and has parent query and top children query

默认跟filter同样,query是包裹了一个constant_score的filter。也有相关score的支持。

has_child:匹配child字段,返回匹配到的对应的parent的结果。

has_parent:匹配parent字段,返回匹配到对应child的结果。

top_children query:has_child query的一种,也是查询child字段,不过增长可控制参数,经过factor,incremental_factor以及query的size来肯定子查询的次数,直到知足

size为止,所以,可能须要多轮迭代子查询,因此total_hits有多是不许确的。

(13)ids query

查询指定id。

(14)indices query

在多个索引之中查询,容许提供一个indics参数指定将要查询的索引及相关的查询,同时指定no_match_query在indecs以外的索引中查询,返回结果。

(15)more like this and more like this field query

根据指定的like_text,通过analysis生成若干个基于term的should查询合并成一个bool查询。

min_term_freq/max_term_freq/max_term_num:限制interesting term。

percentage_terms_to_match:限制should查询应该知足的term比例。

more like this query 可指定多个field字段,more like this field query 则在一个field上查询。

(16)nested query

内嵌类型的查询,指定完整的path。

(17)prefix query

前缀查询。

(18)query string query and simple query string query

基于lucence查询语法的查询,指定字段/term/boost等。

simple query string query 跟 query string相似,这是会自动放弃invalid的部分,不会抛出异常。

默认的field是_all。

(19)range query and regrex query and wildcard query

range query:区间查询,日期/string/num。

regrex query:正则查询。

wildcard query:通配符查询。

(20)span-*query

(21)term query and terms query

基于term的查询。

(22)template query

注册一个查询模板,指定模板查询。git

相关文章
相关标签/搜索