1.query和filter方法
match_all | 查询所有的数据 |
term | 代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇。 |
bool | 复合型查询,可以包含多个其他的查询条件,包括must,should,must_not等,还可以包含有filter,必须匹配,但它以不评分、过滤模式来进行 |
ids | id字段查询 |
prefix | 前缀查询 |
range | 范围查询,针对date和number类型数据,gte,gt,lte,lt |
terms | 多词语查询,如果要查询的字段索引为not_analyzed类型,则terms查询非常类似于关系型数据库中的in查询 |
wildcard | 通配符查询,*任意(包括0)个字符,?任意一个字符 通配符查询不太注重性能,在可能时应尽量避免,特别是要避免前缀通配符 |
regexp | 正则表达式查询, .标识任意一个字符 |
match | 对一个字段选择合适的分析器,传给match查询的词条将被建立索引时相同的分析器处理。 先检查字段类型是否是analyzed,如果是,则先分词,再去匹配token;如果不是,则直接去匹配token。 match不支持多条件查询 |
exists | 存在查询,询指定字段至少包含一个非null值的数据,如果字段索引为not_analyzed类型,则查询sql中的is not null查询方式,用field |
missing | 缺失值查询,与exists查询正好相反,用field |
在任何搜索中使用过滤器,只需在于query节点相同级别上添加一个filter节点。如果你只想要过滤器,也可以完全省略query节点
2.query与filter对比
1) query会计算每个document相对于搜索条件的相关度,并按照相关度进行排序;
filter仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数;
2) filter有内置的自动cache,可以通过设置_cache为true来缓存数据。如果下一次恰好以相同的查询条件进行查询并且该缓存没有过期,就可以直接从缓存中读取数据,这样就大大加快的查询速度
query无法cache结果
3) query查询速度慢,filter查询速度快
4) query适合全文检索,比如检索包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词
filter适合精确搜索,比如创建日期是否在2013-2014年间、status字段是否为yes