【elasticsearch】es-sql中的一些查詢 sql 函数
ES-SQL 中可以写sql 进行数据查询 ,但是个别的查询sql 还是有一定的区别,以下记录一些实际用到的一些函数1、模糊查询非分词字段类型为keyword 的字段使用 like, 和mysql 数据库中的like 使用一样例如mobile like ’%keyword%‘分词字段类型为text 的字段使用 matchPhrase,对应es 中的 match_phrase例如name =matc
ES-SQL 中可以写sql 进行数据查询 ,但是个别的查询sql 还是有一定的区别,以下记录一些实际用到的一些函数
ES-SQL常用语句和示例 http://www.javashuo.com/article/p-msltdbyr-dq.html
1、模糊查询
非分词字段 类型为keyword 的字段 使用 like, 和mysql 数据库中的like 使用一样
例如 mobile like ’%keyword%‘
分词字段 类型为text 的字段 使用 matchPhrase,对应es 中的 match_phrase
例如 name =matchPhrase('keyword')
2、多值查询
in 或者 terms() in_terms() 都可以 。 in 用法和mysql 中in 一样,但是 值过多(几千个)的话 可能会报 sql 超过字符长度(sql有字符长度限制), terms()和in_terms ()一样,并且没上述问题。
例如 type in (‘A’,‘B’,‘C’,‘D’)
或者 type=terms(‘A’,‘B’,‘C’,‘D’)或者 type= in_terms(‘A’,‘B’,‘C’,‘D’)
ES-SQL 也支持 delete 操作,和MySQL 使用一样
例如delete from index where id =1
3、按照字段 pid 去重
SELECT / *! COLLAPSE({“field”:“pid”}) */ * FROM INDEX_ XXXX
4、对于字段是集合类型中的值查询,字段 xxx 集合中 同时 包含 a 又包含 b
xxx = terms ('a') and xxx= terms ('b')
5、 对于es 高版本 中如果是 以下类型的字段 xxx “xxx": { "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }
精确查询 xxx.keyword=‘a’ 模糊查询 xxx.keyword like ‘%a%’,也可以 xxx=‘a’(能不能查询到主要看分词器分词效果)
聚合查询 : group by xxx.keyword 排序 : order by xxx.keyword
错误写法 : group by xxx order by xxx 有可能造成 内存溢出,更严重会集群崩溃
6、minimum_should_match 和 operator=‘OR’
xxx= matchQuery(‘yyy’,operator=‘OR’,minimum_should_match=‘65%’) 匹配度要达65%
minimum_should_match描述参考 https://blog.csdn.net/qq_22985751/article/details/90704189
7、slop 参数 一般是结合 match_phrase使用,slop 表示分词短语间间隔多少分词,也可以匹配(例如 查询quick fox能够匹配含有quick brown fox的文档,需要slop的值为1)
xxx = matchPhrase("yyy",slop=1,minimum_should_match='75%')
8、查询 xx1和 xx2 包含 A 或B或 C (对应 es 中的query_string 查询)
(q= query('((\"A\" OR \"B\" OR \"C\" ))',fields='xx1,xx2',type='phrase',operator='and',tie_breaker=1.0))
9、在es7+版本上,最多获取10000条数据(为了避免OOM),可以用 */*! TRACK_TOTAL_HITS(true) / 返回所有查询结果
SELECT **/*! TRACK_TOTAL_HITS(true) */** * from INDEX
10.先记录 待验证 高亮显示
/*! HIGHLIGHT(field,pre_tags : ['<span class="marke-red">'], post_tags : ['</span>'] ) */*
后续可能 补充,暂时记录
问题
1、 es 二次排序(例如 查询某类文章时在匹配度相关度 的基础上按照时间的排序) 的实现方案 两种(具体用es-sql 不知道怎么写)
1)采用 rescore 进行二次打分
2)采用function_score 查询
更多推荐
所有评论(0)