1. 词条查询(Term Query) 

词条查询是ElasticSearch的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条。term
查询 会查找我们设定的准确值。term 查询本身很简单,它接受一个字段名和我们希望查找的值。

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

  • /**
  • public static void termQuery(Client client, String index, String type) {
  • // Query
  • TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("country", "AWxhOn".toLowerCase());
  • // Search
  • SearchRequestBuilder 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) {
  • // Query
  • TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("country", "比利时", "德国");
  • // Search
  • SearchRequestBuilder 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) {
  • // Query
  • RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
  • .from(19);
  • .to(21);
  • .includeLower(true);
  • .includeUpper(true);
  • //RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);
  • // Search
  • SearchRequestBuilder 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) {
  • // Query
  • ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("name");
  • // Search
  • SearchRequestBuilder 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) {
  • // Query
  • PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("country", "葡萄");
  • // Search
  • SearchRequestBuilder 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){
  • // Query
  • WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("country", "西*牙");
  • // Search
  • SearchRequestBuilder 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){
  • // Query
  • RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("country", "(西班|葡萄)牙");
  • // Search
  • SearchRequestBuilder 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 for  fields,
    and a margin
    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){
  • // Query
  • FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("country", "洗班牙");
  • // 最大编辑距离
  • .fuzziness(Fuzziness.ONE);
  • // 公共前缀
  • .prefixLength(0);
  • // Search
  • SearchRequestBuilder 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){
  • // Query
  • FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("age", "18");
  • .fuzziness(Fuzziness.TWO);
  • // Search
  • SearchRequestBuilder 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)的更多相关文章

  1. Elasticsearch Java API—多条件查询(must)

    多条件设置 //多条件设置 MatchPhraseQueryBuilder mpq1 = QueryBuilders .matchPhraseQuery("pointid",&qu ...

  2. Elasticsearch java api 常用查询方法QueryBuilder构造举例

    转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...

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

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  4. Elasticsearch Java API 很全的整理

    Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...

  5. Elasticsearch Java API深入详解

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

  6. 第08章 ElasticSearch Java API

    本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...

  7. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  8. ElasticSearch AggregationBuilders java api常用聚会查询

    以球员信息为例,player索引的player type包含5个字段,姓名,年龄,薪水,球队,场上位置.index的mapping为: "mappings": { "pl ...

  9. ElasticSearch Java api 详解_V1.0

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

随机推荐

  1. eclipse快捷键及各种设置

    1.提示键配置一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项 ...

  2. 从零开始--Spring项目整合(1)使用maven框架搭建项目

    这些年一直在用spring的框架搭建项目,现在开始我们从零开始利用Spring框架来搭建项目,目前我能想到有Spring.SpringMVC.SpringJDBC.Mybatis.WebSockt.R ...

  3. webpack最佳入门实践系列(3)

    6.使用图片 6.1.尝试在css中引入图片 在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张 ...

  4. Linux 软连接 & 硬链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...

  5. IOS-使用CAShapLayer绘制扇形

    IOS-使用CAShapLayer绘制扇形 为了增加应用体验感,我们动态绘制扇形或者饼状图效果. 这里我们使用CAShapeLayer,这样就不必再-(void)draw函数内绘制图形 参考代码 -( ...

  6. [ CodeVS冲杯之路 ] P1063

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1063/ 本来是想写石子合并的,结果把题目看错了,写成了合并果子…… 凑合交了上去,直接A了…… 题目将可以将任意两堆合 ...

  7. 在iOS上实现一个简单的日历控件

    http://blog.csdn.net/jasonblog/article/details/21977481 近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表. 不过再怎么复杂的控件, ...

  8. linux缺页异常处理--用户空间【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7870769 版权声明:本文为博主原创文章,未经博主允许不得转载. 用户空间的缺页异常可以分为两 ...

  9. Centos 6.3 nginx代理配置

    1. 查看nginx所在位置 $ nginx -t /etc/nginx/nginx.conf 2. 配置 user  nobody; #启动服务的用户 worker_processes  ; err ...

  10. CodeForces 450B Jzzhu and Sequences 【矩阵快速幂】

    Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...