一.keyword 字段和keyword数据类型
1、测试准备数据
2、查询mapping
测试2:使用articleID.keyword搜索
结果:
默认是analyzed的text类型的field,建立倒排索引的时候,就会对所有的articleID分词,分词以后,原本的articleID就没有了,只有分词后的各个word存在于倒排索引中。
term,是不对搜索文本分词的,XHDK-A-1293-#fJ3 -->
XHDK-A-1293-#fJ3;但是articleID建立索引的时候,XHDK-A-1293-#fJ3 -->
xhdk,a,1293,fj3
XHDK-A-1293-#fJ3;但是articleID建立索引的时候,XHDK-A-1293-#fJ3 -->
xhdk,a,1293,fj3
5、定义keyword数据类型的字段
(1)删除索引 DELETE /forum
(2)重建索引
(4)测试articleID查询
6、小结
(1)term filter:根据exact
value进行搜索,数字、boolean、date天然支持
value进行搜索,数字、boolean、date天然支持
(2)text需要建索引时指定为not_analyzed,才能用term
query
query
二、filter执行原理深度剖析
1、bitset机制
每个filter根据在倒排索引中搜索的结果构建一个bitset(位集),用以存储搜索的结果。简单的数据结构去实现复杂的功能,可以节省内存空间,提升性能。bitset,就是一个二进制的数组,数组每个元素都是0或1,用来标识一个doc对一个filter条件是否匹配,如果匹配就是1,不匹配就是0。比如:[0, 1, 1]。
遍历每个过滤条件对应的bitset,优先从最稀疏的开始搜索,查找满足所有条件的document(先遍历比较稀疏的bitset,就可以先过滤掉尽可能多的数据发)
2、caching
bitset机制
bitset机制
跟踪query,在最近256个query中超过一定次数的过滤条件,缓存其bitset。对于小segment(<1000,或<3%),不缓存bitset。在最近的256个filter中,有某个filter超过了一定的次数,次数不固定,就会自动缓存这个filter对应的bitset。filter针对小segment获取到的结果,可以不缓存,segment记录数<1000,或者segment大小<index总大小的3% segment数据量很小,此时哪怕是扫描也很快;segment会在后台自动合并,小segment很快就会跟其他小segment合并成大segment,此时就缓存也没有什么意义,segment很快就消失了。
cache biset的自动更新:如果document有新增或修改,那么cached
bitset会被自动更新
bitset会被自动更新
3、filter与query的对比
三、基于bool组合多个filter条件来搜索数据
1、搜索发帖日期为2017-01-01,或者帖子ID为XHDK-A-1293-#fJ3的帖子,同时要求帖子的发帖日期绝对不为2017-01-02
2、搜索帖子ID为XHDK-A-1293-#fJ3,或者是帖子ID为JODL-X-1937-#pV7而且发帖日期为2017-01-01的帖子
四、term和terms
五、filter
range
range
测试数据:
为帖子数据增加浏览量的字段
六、match
query 精准查询
query 精准查询
bool组合多个搜索条件,如何计算relevance
score
score