1. 词条查询(Term Query)

词条查询是ElasticSearch的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条。term

查询 会查找我们设定的准确值。term 查询本身很简单,它接受一个字段名和我们希望查找的值。

下面代码查询将匹配 college 字段中含有"California"一词的文档。记住,词条查询是未经分析的,因此需要提供跟索引文档中的词条完全匹配的词条。请注意,我们使用小写开头的california来搜索,而不是California,因为California一词在建立索引时已经变成了california(默认分词器)。

/**

publicstaticvoidtermQuery(Clientclient,Stringindex,Stringtype){

// Query

TermQueryBuildertermQueryBuilder =QueryBuilders.termQuery("country","AWxhOn".toLowerCase());

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(termQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

2. 多词条查询(Terms Query)

词条查询(Term Query)允许匹配单个未经分析的词条,多词条查询(Terms Query)可以用来匹配多个这样的词条。只要指定字段包含任一我们给定的词条,就可以查询到该文档。

下面代码得到所有在 country 字段中含有 “德国” 或 "比利时" 的文档。

/**

publicstaticvoidtermsQuery(Clientclient,Stringindex,Stringtype){

// Query

TermsQueryBuildertermsQueryBuilder =QueryBuilders.termsQuery("country","比利时","德国");

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(termsQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

输出结果:

.sjf.open.api.QueryAPI-----------QueryAPIid 9score 0.4898842source {country=比利时,name=阿扎尔,club=切尔西俱乐部}

.sjf.open.api.QueryAPI-----------QueryAPIid 4score 0.39103588source {country=德国,name=穆勒,club=拜仁慕尼黑俱乐部}

.sjf.open.api.QueryAPI-----------QueryAPIid 1score 0.25427115source {country=比利时,name=德布劳内,club=曼城俱乐部}

3. 范围查询(Range Query)

范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是基于字符串的。范围查询只能针对单个字段。

方法:

(1)gte() :范围查询将匹配字段值大于或等于此参数值的文档。

(2)gt() :范围查询将匹配字段值大于此参数值的文档。

(3)lte() :范围查询将匹配字段值小于或等于此参数值的文档。

(4)lt() :范围查询将匹配字段值小于此参数值的文档。

(5)from()

开始值  to() 结束值  这两个函数与includeLower()和includeUpper()函数配套使用。

includeLower(true) 表示 from() 查询将匹配字段值大于或等于此参数值的文档;

includeLower(false) 表示 from() 查询将匹配字段值大于此参数值的文档;

includeUpper(true) 表示 to() 查询将匹配字段值小于或等于此参数值的文档;

includeUpper(false) 表示 to() 查询将匹配字段值小于此参数值的文档;

/**

publicstaticvoidrangeQuery(Clientclient,Stringindex,Stringtype){

// Query

RangeQueryBuilderrangeQueryBuilder =QueryBuilders.rangeQuery("age");

.from(19);

.to(21);

.includeLower(true);

.includeUpper(true);

//RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(rangeQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.execute().actionGet();

// 结果

(searchResponse);

}

上面代码中的查询语句与下面的是等价的:

QueryBuilderqueryBuilder =QueryBuilders.rangeQuery("age").gte(19).lte(21);

输出结果:

.sjf.open.api.QueryAPI-----------QueryAPIid 9score 1.0source {college=计算机学院,school=麻省理工大学,sex=boy,name=廖力生,age=21}

.sjf.open.api.QueryAPI-----------QueryAPIid 2score 1.0source {college=通信学院,school=西安电子科技大学,sex=boy,name=李源一,age=19}

.sjf.open.api.QueryAPI-----------QueryAPIid 4score 1.0source {college=电子工程学院,school=中国科技大学,sex=girl,name=王俊辉,age=21}

.sjf.open.api.QueryAPI-----------QueryAPIid 1score 1.0source {college=计算机学院,school=西安电子科技大学,sex=boy,name=徐欣,age=21}

.sjf.open.api.QueryAPI-----------QueryAPIid 11score 1.0source {college=计算机学院ddddd,school=中国科技大学,sex=girl,name=王俊辉2,age=21}

4. 存在查询(Exists Query)

如果指定字段上至少存在一个no-null的值就会返回该文档。

/**

publicstaticvoidexistsQuery(Clientclient,Stringindex,Stringtype){

// Query

ExistsQueryBuilderexistsQueryBuilder =QueryBuilders.existsQuery("name");

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(existsQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

举例说明,下面的几个文档都会得到上面代码的匹配:

第一个是字符串,是一个非null的值。

第二个是空字符串,也是非null。

第三个使用标准分析器的情况下尽管不会返回词条,但是原始字段值是非null的(Even though the standard analyzer would emit zero tokens, the original field is non-null)。

第五个中至少有一个是非null值。

下面几个文档不会得到上面代码的匹配:

"bar"}

第一个是null值。

第二个没有值。

第三个只有null值,至少需要一个非null值。

第四个与指定字段不匹配。

5. 前缀查询(Prefix Query)

前缀查询让我们匹配这样的文档:它们的特定字段已给定的前缀开始。下面代码中我们查询所有country字段以"葡萄"开始的文档。

/**

publicstaticvoidprefixQuery(Clientclient,Stringindex,Stringtype){

// Query

PrefixQueryBuilderprefixQueryBuilder =QueryBuilders.prefixQuery("country","葡萄");

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(prefixQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

输出结果:

.sjf.open.api.QueryAPI-----------QueryAPIid 3score 1.0source {country=葡萄牙,name=C罗,club=皇家马德里俱乐部}

备注:

进行下面前缀查询,没有查找到相应信息,但是数据源中是有的:

QueryBuilderqueryBuilder =QueryBuilders.prefixQuery("club","皇家马德里");

产生以上差别的主要原因是club字段(默认mapping配置)进行了分析器分析了,索引中的数据已经不在是"皇家马德里",而country字段没有进行分析(mapping配置not_analyzed)。

6. 通配符查询(Wildcard Query)

通配符查询允许我们获取指定字段满足通配符表达式的文档,和前缀查询一样,通配符查询指定字段是未分析的(not analyzed)。

可以使用星号代替0个或多个字符,使用问号代替一个字符。星号表示匹配的数量不受限制,而后者的匹配字符数则受到限制。这个技巧主要用于英文搜索中,如输入““computer*”,就可以找到“computer、computers、computerised、computerized”等单词,而输入“comp?ter”,则只能找到“computer、compater、competer”等单词。注意的是通配符查询不太注重性能,在可能时尽量避免,特别是要避免前缀通配符(以以通配符开始的词条)。

/**

publicstaticvoidwildcardQuery(Clientclient,Stringindex,Stringtype){

// Query

WildcardQueryBuilderwildcardQueryBuilder =QueryBuilders.wildcardQuery("country","西*牙");

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(wildcardQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

输出结果:

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 8score 1.0source {country=西班牙,name=托雷斯,club=马德里竞技俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 6score 1.0source {country=西班牙,name=布斯克茨,club=巴萨罗那俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 7score 1.0source {country=西班牙,name=哈维,club=巴萨罗那俱乐部}

7. 正则表达式查询(Regexp Query)

正则表达式查询允许我们获取指定字段满足正则表达式的文档,和前缀查询一样,正则表达式查询指定字段是未分析的(not analyzed)。正则表达式查询的性能取决于所选的正则表达式。如果我们的正则表达式匹配许多词条,查询将很慢。一般规则是,正则表达式匹配的词条数越高,查询越慢。

/**

publicstaticvoidregexpQuery(Clientclient,Stringindex,Stringtype){

// Query

RegexpQueryBuilderregexpQueryBuilder =QueryBuilders.regexpQuery("country","(西班|葡萄)牙");

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(regexpQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

输出结果:

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 8score 1.0source {country=西班牙,name=托雷斯,club=马德里竞技俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 6score 1.0source {country=西班牙,name=布斯克茨,club=巴萨罗那俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 7score 1.0source {country=西班牙,name=哈维,club=巴萨罗那俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 3score 1.0source {country=葡萄牙,name=C罗,club=皇家马德里俱乐部}

8. 模糊查询(Fuzzy Query)

如果指定的字段是string类型,模糊查询是基于编辑距离算法来匹配文档。编辑距离的计算基于我们提供的查询词条和被搜索文档。如果指定的字段是数值类型或者日期类型,模糊查询基于在字段值上进行加减操作来匹配文档(The fuzzy query uses

similarity based on Levenshtein edit distance for fields,

and a margin

on numeric and date fields)。此查询很占用CPU资源,但当需要模糊匹配时它很有用,例如,当用户拼写错误时。另外我们可以在搜索词的尾部加上字符 “~” 来进行模糊查询。

8.1 string类型字段

模糊查询生成所有可能跟指定词条的匹配结果(在fuzziness指定的最大编辑距离范围之内)。然后检查生成的所有结果是否是在索引中。

下面代码中模糊查询country字段为”西班牙“的所有文档,同时指定最大编辑距离为1(fuzziness),最少公共前缀为0(prefixLength),即不需要公共前缀。

/**

publicstaticvoidfuzzyQuery(Clientclient,Stringindex,Stringtype){

// Query

FuzzyQueryBuilderfuzzyQueryBuilder =QueryBuilders.fuzzyQuery("country","洗班牙");

// 最大编辑距离

.fuzziness(Fuzziness.ONE);

// 公共前缀

.prefixLength(0);

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(fuzzyQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

输出结果:

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 8score 1.6931472source {country=西班牙,name=托雷斯,club=马德里竞技俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 6score 1.4054651source {country=西班牙,name=布斯克茨,club=巴萨罗那俱乐部}

.sjf.open.api.queryAPI.TermQueryAPI-----------TermQueryAPIid 7score 1.0source {country=西班牙,name=哈维,club=巴萨罗那俱乐部}

8.2 数字和日期类型字段

与范围查询(Range Query)的around比较类似。形成在指定值上上下波动fuzziness大小的一个范围:

field value <=+fuzziness

下面代码在18岁上下波动2岁,形成[17-19]的一个范围查询:

/**

publicstaticvoidfuzzyQuery2(Clientclient,Stringindex,Stringtype){

// Query

FuzzyQueryBuilderfuzzyQueryBuilder =QueryBuilders.fuzzyQuery("age","18");

.fuzziness(Fuzziness.TWO);

// Search

SearchRequestBuildersearchRequestBuilder =client.prepareSearch(index);

.setTypes(type);

.setQuery(fuzzyQueryBuilder);

// 执行

SearchResponsesearchResponse =searchRequestBuilder.get();

// 结果

(searchResponse);

}

java term_[ElasticSearch]Java API 之 词条查询(Term Level Query)相关推荐

  1. ArcGIS Server Java 9.3 REST API的中文查询问题的解决方案

    [2009.2.18补注]这个问题在SP1 for Linux中修复,SP1 for Windows下问题更加严重,如果打了SP1 for Windows,还想使用REST服务,就必须使用Linux或 ...

  2. Elasticsearch Java API 分组、聚合、嵌套相关查询

    Elasticsearch Java API 分组.聚合.嵌套相关查询 翼支付监控系统正使用es做后端存储,这边我们是将日志计算处理过后的数据通过kafka储存到es.选择用es作为数据储存端是考虑到 ...

  3. Elasticsearch java api 基本搜索部分详解

    一.所使用版本的介绍 使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的api使用 二.简单的搜索 使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最 ...

  4. in the java search_Search API – Using scrolls in Java - Elasticsearch Java API 手册

    Using scrolls in Java 一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据).Scro ...

  5. ElasticSearch Java Api(四) -删除索引

    删除可以是删除整个索引库,也可以根据文档id删除索引库下的文档,还可以通过query查询条件删除所有符合条件的数据. 一.删除整个索引库 下面的例子会删除indexName索引: DeleteInde ...

  6. Elasticsearch Java API四种实现方式

    0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...

  7. Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案

    在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端RestHighLevelClient标记为弃用状态.同时推出了全新的Java API客户端Elastics ...

  8. SpringBoot整合最新Elasticsearch Java API Client 7.16教程

    文章目录 前言 一.Elasticsearch和Kibana 7.16版本安装 二.pom.xml文件引入依赖 三.代码实例 总结 前言 最新在学习SpringBoot整合es的一些知识,浏览了网上的 ...

  9. Elasticsearch8.0版本中Elasticsearch Java API Client客户端的基本使用方法

    关于Elasticsearch Java API Client客户端如何连接以及如何对索引和文档进行基本的增删改查操作请查看我的上一篇博文:Elasticsearch RestHighLevelCli ...

最新文章

  1. java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程
  2. Rust —— 一门没有GC的语言
  3. vue自学入门-1(Windows下搭建vue环境)
  4. spi的dma方式前四个字节_前嗅教你大数据:常见几种编码介绍
  5. UVA 11468 - Substring AC自动机+DP
  6. C# 操作Gmap简单使用方法
  7. substrate 学习记录(一):Substrate 安装 + 创建测试链 + 启动私有网络
  8. eda技术试卷_EDA技术试题库-试题库
  9. 【bzoj4011】【HNOI2015】落忆枫音【树形DP】
  10. 前端展示m3u8视频
  11. 文件属性安全组误删恢复
  12. [计算机数值分析]牛顿下山法求方程的根
  13. 【自动驾驶】Frenet坐标系与Cartesian坐标系(二)
  14. SOHO中国高管建“老鼠仓”吸钱 大企成空壳谁之责?
  15. [分享]NOAA磁偏角计算器
  16. UTF、Unicode、ASCII及中文编码
  17. 一个硬件创业者的自述:我这20年
  18. Ubuntu Kylin中编译运行cgminer挖矿软件
  19. 微信网页授权登录且实现access_token分布式管理
  20. CSS布局——960gs

热门文章

  1. Java学习笔记四:static关键字
  2. VC++ 删除当前读取行 代码
  3. Java关于 class类的基础方法
  4. 洛谷P2995奇数偶数
  5. HTML5纯Web前端也能开发直播,不用开发服务器(使用face2face)
  6. P3796 【模板】AC自动机(加强版)
  7. 提示缺少python.h解决办法
  8. 模电知识,大师 书本
  9. 选择指定的MySQL数据库
  10. 在Editplus中搭建Ruby开发环境