主要是涉及ElasticSearch查询条件相对模糊,查询速度相对慢,实时查询时应尽量避免这些方式,但是这些查询方式又具有自己独特不可代替的功能,还是还有必要。
参考官网 Elasticsearch Reference [7.10] » Query DSL » Term-level queries
文章目录
一、prefix查询
- 一、prefix查询
- 1.1、RESTful 代码
- 1.2、java 代码
- 二、fuzzy查询
- 2.1、RESTful 代码
- 2.1、java 代码
- 三、wildcard查询
- 3.1、RESTful 代码
- 3.1、java 代码
- 四、range查询
- 4.1、RESTful 代码
- 4.1、java 代码
- 五、regexp查询
- 5.1、RESTful 代码
- 5.1、java 代码
- 注意:prefix,fuzzy,wildcard,regexp查询相对都是精确的条件,查询效率也是相抵较低,业务要求实时性高的场景,**应该避免使用**。
- 关注我的公众号【宝哥大数据】, 更多干货
前缀查询,可以通过一个关键字 去指定一个field的前缀,从而查询到指定的文档
1.1、RESTful 代码POST /sms-logs-index/_search
{
"query": {
"prefix": {
"corpName": {
"value": "上海"
}
}
}
}
1.2、java 代码
@Test
public void prefixQuery() throws IOException {
//1。创建request对象,查询用的对象一般都是SearchRequest对象
SearchRequest mySearchRequest = new SearchRequest(index);
//2,指定查询条件,依赖查询条件的对象SearchSourceBuilder的对象
SearchSourceBuilder builder = new SearchSourceBuilder();
// 查询套路, 只需要修改此处
builder.from(0).size(10).query(QueryBuilders.prefixQuery("corpName", "上海"));
mySearchRequest.source(builder);
//3. 执行查询
SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);
//4. 获取到_source中的数据,并展示
//注意RESTFUL风格上是两个hits,所以这里要两次getHits()
for (SearchHit hit : search.getHits().getHits()) {
Map result = hit.getSourceAsMap();
System.out.println(result);
}
}
二、fuzzy查询
模糊查询,我们输入字符的大概,ES就可以根据输入的内容去大概匹配一下结果, 同时也支持输入关键字的错别字,所以fuzzy
查询本身相对不太精确和稳定,即错别字太多也可能导致查询无结果,需要则中使用。 不同于 MySQL 的 Like 查询,比 Like 查询要强大。
fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length
-
fuzziness:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段
- 操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1,
- 如中文集团到中威集团编辑距离就是1,只需要修改一个字符;
- 该参数默认值为0,即不开启模糊查询,一样的,
- 如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也抓出来。
-
prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配
- 如这里等于1,则表示开头的中字必须匹配,不匹配则不返回
- 默认值也是0
- 加大prefix_length的值可以提高效率和准确率。
注意:这两个参数不是只适用于fuzzy查询,match查询一样适用。
2.1、RESTful 代码POST /sms-logs-index/_search
{
"query": {
"fuzzy": {
"corpName": {
"value": "中文集团"
,"fuzziness":1
,"prefix_length": 1
}
}
}
}
#fuzzy查询2 允许编辑两次距离
POST /sms-logs-index/_search
{
"query": {
"fuzzy": {
"corpName": {
"value": "中文集团"
,"fuzziness":2
}
}
}
}
2.1、java 代码
// 查询套路, 只需要修改此处
builder.from(0).size(10).query(QueryBuilders.fuzzyQuery("corpName", "中文集团").fuzziness(Fuzziness.TWO));
三、wildcard查询
通配查询,和MySQL
中的 Like 是一个套路,可以在查询时,在字符串中指定通配符*和占位符?
# wildcard 查询 利用*做通配符
POST /sms-logs-index/_search
{
"query": {
"wildcard": {
"corpName": {
"value": "*集团"
}
}
}
}
3.1、java 代码
// 查询套路, 只需要修改此处
builder.from(0).size(10).query(QueryBuilders.wildcardQuery("corpName", "*集团"));
四、range查询
范围查询,只针对数值类型(字符类型则不适用), 对某一个field进行大于或者小于的范围查询。
4.1、RESTful 代码# range查询
POST /sms-logs-index/_search
{
"query": {
"range": {
"fee": {
"gte": 100,
"lte": 500
}
}
}
}
4.1、java 代码
// 查询套路, 只需要修改此处
builder.from(0).size(10).query(QueryBuilders.rangeQuery("fee").gte(100).lte(500));
五、regexp查询
正则表达式查询,通过编写的正则表达式进行内容匹配
5.1、RESTful 代码# regexp查询
POST /sms-logs-index/_search
{
"query": {
"regexp": {
"moblie": "13[0-9]{9}"
}
}
}
5.1、java 代码
// 查询套路, 只需要修改此处
builder.from(0).size(10).query(QueryBuilders.regexpQuery("moblie", "13[0-9]{9}"));
注意:prefix,fuzzy,wildcard,regexp查询相对都是精确的条件,查询效率也是相抵较低,业务要求实时性高的场景,应该避免使用。
关注我的公众号【宝哥大数据】, 更多干货