elasticsearch---search in depth之full-text search

来源:互联网 发布:大庆电视台网络直播 编辑:程序博客网 时间:2024/05/21 09:48

full-text中两个关键因素:analyzed和relevance。

1:term-based or full-text

query可以划分两类:term-based-query和full-text-query。

term-based-query:低级别的query,比如term-query,fuzzzy-query等。这些都是直接操作inverted-index。不存在analysis的过程。

full-text-query:高级query。比如match-query,querystring等。这些query是知晓mapping的,因此,如果你是作用于一个date-field,则你输入的查询条件自动当成date类型处理。

如果你作用于一个not-analyzed的field,则你输入的查询条件就会当做一个完成的term,如果是一个analyzed的field,则会翻译成几个term。一旦翻译成一个term-list,就会转变成地级别的查询执行,然后汇总结果。

2:match_query

match_query是一种高级查询。因此是知晓mapping的,有analysis这个过程。

比如一个查询 query : { "match" : {"title" : "quick!"}}.执行过程如下

(1)获得field-type.这里title是string类型。

(2)analysis这个string:去掉!

(3)获取匹配的doc

(4)根据算法计算score

3:multi-word query

类似与单个term的match-query。只不过变成了多个term,执行过程其实是翻译成多个term-query,然后用一个bool-query包装起来,可以指定operator,也可以控制匹配的准确度,比如一个qurery翻译成多个term,则指定minimun_should_match来决定要匹配到的百分比。

4:combineing query

可以把各个相关的query通过bool-query包装起来完成复杂的查询。跟filter不同。filter只有两方面选择,要么包含,要么不包含。query则是计算相关性的。比如一个bool-query,有must,must_not,should组合而成,should部分是可以包含也可以不包含的,只是包含的部分相关性会更强一些,score更高,而在filer中,这部分信息是不会有的。这个情形下,score的计算规则是:所有match到的must和should子查询的score相加,然后除以总共must和should子查询的个数。must_not只是起到排除doc的作用,不计算得分。

5:how match use bool query

不再赘述。

6:boosting query clause

通过调整boost参数,来控制每一个子查询的权重。

7:control analysis

不多赘述。可以在不同层面配置分析器。在查询和索引过程中,应用顺序稍有差别。

查询和索引过程一般用一致的分析器,当然根据需求也可以不一样。

8:relevance is broken

看上去是出问题了。。。。其实不然。

当数据量很少的时候会出现诡异现象,相关性强的居然score值低。根据TF/IDF算法,term在一个doc中出现的频率越高,得分越高,term在整个index中出现的频率越高,得分越低(说明这个term很普遍,不是关键信息)。在数据量很少的时候会出现偏差,因为es默认计算标准并不是整个index,而是针对单个shard。懂了吧。数据量少,term分布不均匀,就会出现上述情况。在数据量多的情况下,这种偏差可以忽略了,因为整体计算跟单个shard计算差不多。当然可以指定查询方式,选在dfs*,可以强制不在单个shard上计算,而是整体计算。但是不推荐这么做,代价高意义也不大。

0 0
原创粉丝点击