[ElasticSearch]Java API 之 词条查询(Term Level Query)
1. 词条查询(Term Query)
词条查询是ElasticSearch的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条。term
查询 会查找我们设定的准确值。term 查询本身很简单,它接受一个字段名和我们希望查找的值。
下面代码查询将匹配 college 字段中含有"California"一词的文档。记住,词条查询是未经分析的,因此需要提供跟索引文档中的词条完全匹配的词条。请注意,我们使用小写开头的california来搜索,而不是California,因为California一词在建立索引时已经变成了california(默认分词器)。
/**public static void termQuery(Client client, String index, String type) {// QueryTermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("country", "AWxhOn".toLowerCase());// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(termQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-term-query.html
2. 多词条查询(Terms Query)
词条查询(Term Query)允许匹配单个未经分析的词条,多词条查询(Terms Query)可以用来匹配多个这样的词条。只要指定字段包含任一我们给定的词条,就可以查询到该文档。
下面代码得到所有在 country 字段中含有 “德国” 或 "比利时" 的文档。
/**public static void termsQuery(Client client, String index, String type) {// QueryTermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("country", "比利时", "德国");// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(termsQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();
// 结果(searchResponse);}
.sjf.open.api.QueryAPI - ---------- QueryAPI id 9 score 0.4898842 source {country=比利时, name=阿扎尔, club=切尔西俱乐部}.sjf.open.api.QueryAPI - ---------- QueryAPI id 4 score 0.39103588 source {country=德国, name=穆勒, club=拜仁慕尼黑俱乐部}.sjf.open.api.QueryAPI - ---------- QueryAPI id 1 score 0.25427115 source {country=比利时, name=德布劳内, club=曼城俱乐部}
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-terms-query.html
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() 查询将匹配字段值小于此参数值的文档;
/**public static void rangeQuery(Client client, String index, String type) {// QueryRangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");.from(19);.to(21);.includeLower(true);.includeUpper(true);//RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(rangeQueryBuilder);
// 执行SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
// 结果(searchResponse);
}
上面代码中的查询语句与下面的是等价的:
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);
输出结果:
.sjf.open.api.QueryAPI - ---------- QueryAPI id 9 score 1.0 source {college=计算机学院, school=麻省理工大学, sex=boy, name=廖力生, age=21}.sjf.open.api.QueryAPI - ---------- QueryAPI id 2 score 1.0 source {college=通信学院, school=西安电子科技大学, sex=boy, name=李源一, age=19}.sjf.open.api.QueryAPI - ---------- QueryAPI id 4 score 1.0 source {college=电子工程学院, school=中国科技大学, sex=girl, name=王俊辉, age=21}.sjf.open.api.QueryAPI - ---------- QueryAPI id 1 score 1.0 source {college=计算机学院, school=西安电子科技大学, sex=boy, name=徐欣, age=21}.sjf.open.api.QueryAPI - ---------- QueryAPI id 11 score 1.0 source {college=计算机学院ddddd, school=中国科技大学, sex=girl, name=王俊辉2, age=21}
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-range-query.html
4. 存在查询(Exists Query)
如果指定字段上至少存在一个no-null的值就会返回该文档。
/**public static void existsQuery(Client client, String index, String type) {// QueryExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("name");// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(existsQueryBuilder);// 执行SearchResponse searchResponse = 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值。
第四个与指定字段不匹配。
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-exists-query.html
5. 前缀查询(Prefix Query)
前缀查询让我们匹配这样的文档:它们的特定字段已给定的前缀开始。下面代码中我们查询所有country字段以"葡萄"开始的文档。
/**public static void prefixQuery(Client client, String index, String type) {// QueryPrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("country", "葡萄");// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(prefixQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}-
输出结果:
.sjf.open.api.QueryAPI - ---------- QueryAPI id 3 score 1.0 source {country=葡萄牙, name=C罗, club=皇家马德里俱乐部}-
备注:
进行下面前缀查询,没有查找到相应信息,但是数据源中是有的:
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("club", "皇家马德里");-
产生以上差别的主要原因是club字段(默认mapping配置)进行了分析器分析了,索引中的数据已经不在是"皇家马德里",而country字段没有进行分析(mapping配置not_analyzed)。
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-prefix-query.html
6. 通配符查询(Wildcard Query)
通配符查询允许我们获取指定字段满足通配符表达式的文档,和前缀查询一样,通配符查询指定字段是未分析的(not analyzed)。
可以使用星号代替0个或多个字符,使用问号代替一个字符。星号表示匹配的数量不受限制,而后者的匹配字符数则受到限制。这个技巧主要用于英文搜索中,如输入““computer*”,就可以找到“computer、computers、computerised、computerized”等单词,而输入“comp?ter”,则只能找到“computer、compater、competer”等单词。注意的是通配符查询不太注重性能,在可能时尽量避免,特别是要避免前缀通配符(以以通配符开始的词条)。
/**public static void wildcardQuery(Client client, String index, String type){// QueryWildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("country", "西*牙");// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(wildcardQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}-
输出结果:
.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 8 score 1.0 source {country=西班牙, name=托雷斯, club=马德里竞技俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 6 score 1.0 source {country=西班牙, name=布斯克茨, club=巴萨罗那俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 7 score 1.0 source {country=西班牙, name=哈维, club=巴萨罗那俱乐部}-
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-wildcard-query.html
7. 正则表达式查询(Regexp Query)
正则表达式查询允许我们获取指定字段满足正则表达式的文档,和前缀查询一样,正则表达式查询指定字段是未分析的(not analyzed)。正则表达式查询的性能取决于所选的正则表达式。如果我们的正则表达式匹配许多词条,查询将很慢。一般规则是,正则表达式匹配的词条数越高,查询越慢。
/**public static void regexpQuery(Client client, String index, String type){// QueryRegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("country", "(西班|葡萄)牙");// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(regexpQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}-
输出结果:
.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 8 score 1.0 source {country=西班牙, name=托雷斯, club=马德里竞技俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 6 score 1.0 source {country=西班牙, name=布斯克茨, club=巴萨罗那俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 7 score 1.0 source {country=西班牙, name=哈维, club=巴萨罗那俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 3 score 1.0 source {country=葡萄牙, name=C罗, club=皇家马德里俱乐部}-
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-regexp-query.html
8. 模糊查询(Fuzzy Query)
如果指定的字段是string类型,模糊查询是基于编辑距离算法来匹配文档。编辑距离的计算基于我们提供的查询词条和被搜索文档。如果指定的字段是数值类型或者日期类型,模糊查询基于在字段值上进行加减操作来匹配文档(The fuzzy query uses
similarity based on Levenshtein edit distance forfields,
and amargin
on numeric and date fields)。此查询很占用CPU资源,但当需要模糊匹配时它很有用,例如,当用户拼写错误时。另外我们可以在搜索词的尾部加上字符 “~” 来进行模糊查询。8.1 string类型字段
模糊查询生成所有可能跟指定词条的匹配结果(在fuzziness指定的最大编辑距离范围之内)。然后检查生成的所有结果是否是在索引中。
下面代码中模糊查询country字段为”西班牙“的所有文档,同时指定最大编辑距离为1(fuzziness),最少公共前缀为0(prefixLength),即不需要公共前缀。
/**public static void fuzzyQuery(Client client, String index, String type){// QueryFuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("country", "洗班牙");// 最大编辑距离.fuzziness(Fuzziness.ONE);// 公共前缀.prefixLength(0);// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(fuzzyQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}-
输出结果:
.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 8 score 1.6931472 source {country=西班牙, name=托雷斯, club=马德里竞技俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 6 score 1.4054651 source {country=西班牙, name=布斯克茨, club=巴萨罗那俱乐部}.sjf.open.api.queryAPI.TermQueryAPI - ---------- TermQueryAPI id 7 score 1.0 source {country=西班牙, name=哈维, club=巴萨罗那俱乐部}-
8.2 数字和日期类型字段
与范围查询(Range Query)的around比较类似。形成在指定值上上下波动fuzziness大小的一个范围:
field value <= +fuzziness-
下面代码在18岁上下波动2岁,形成[17-19]的一个范围查询:
/**public static void fuzzyQuery2(Client client, String index, String type){// QueryFuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("age", "18");.fuzziness(Fuzziness.TWO);// SearchSearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);.setTypes(type);.setQuery(fuzzyQueryBuilder);// 执行SearchResponse searchResponse = searchRequestBuilder.get();// 结果(searchResponse);}-
参考:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-fuzzy-query.html
9. 说明
本代码基于ElasticSearch 2.4.1
[ElasticSearch]Java API 之 词条查询(Term Level Query)的更多相关文章
- Elasticsearch Java API—多条件查询(must)
多条件设置 //多条件设置 MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid",&qu ...
- Elasticsearch java api 常用查询方法QueryBuilder构造举例
转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Elasticsearch Java API 很全的整理
Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...
- Elasticsearch Java API深入详解
0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...
- 第08章 ElasticSearch Java API
本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- ElasticSearch AggregationBuilders java api常用聚会查询
以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置.index的mapping为: "mappings": { "pl ...
- ElasticSearch Java api 详解_V1.0
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
随机推荐
- bzoj 3111 蚂蚁 动态规划
题目描述 在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长. 蚂蚁转弯是有一定特点的,即它的转弯序 ...
- 【IDEA】IDEA集成Tomcat7插件运行项目
Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题.本文将介绍,Maven如何介绍Tomcat插件. Maven Tomcat插件现在主要 ...
- 培训补坑(day5:最小生成树+负环判断+差分约束)
补坑补坑((╯‵□′)╯︵┻━┻) 内容真的多... 一个一个来吧. 首先是最小生成树. 先讲一下生成树的定义 生成树就是在一张图上选取一些边,使得整个图上所有的点都连通. 那么我们要求的最小生成树有 ...
- UVA 10079 Pizze Cutting
题意:N条直线最多把平面分成几个部分 ans=1+(N+1)*N/2; 直线数量 1 2 3 4 …………n把平面分成的块数 2 4 7 11 1+1 1+1+2 1+1+2+3 1+1+2+3+4 ...
- python3使用urllib获取set-cookies
#!/usr/bin/env python # encoding: utf-8 import urllib.request from collections import defaultdict re ...
- 使用windos电脑模拟搭建集群(四)web环境 linux+nginx+jdk+tomcat
1.使用ansible的playbook自动安装两台web主机的nginx 1.配置模块 主机清单 2.创建 playbook目录并编写安装nginx的playbook mkdir -p playbo ...
- jQuery Lazy Load图片懒加载
传送门:官网地址,jQuery Lazy Load v1.7.2下载,Github 使用方法: 1.引用js文件 <script src="jquery.js">< ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
- kuangbin系列【简单搜索】
poj-1321棋盘问题[bfs/回溯] Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36385 Accepted: ...
- SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛*
题目链接 Problems Problem A Problem B bitset…… Problem C Problem D Problem E Problem F Problem G 考虑最小生 ...