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. java复习整理(六 异常处理)

    一.异常简介  在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性.        ...

  2. vue jsonp解决跨域处理

    1.安装vue jsonp npm i -S vue-jsonp 2.在main.js中导入vue-jsonp import VueJsonp from 'vue-jsonp' 通过use方法,挂载到 ...

  3. 快速了解Android重要机制

    转自 http://www.jianshu.com/p/5f6d79323923 一.Android系统底层研究 关于底层的知识点不是在一篇文章中能讲解清楚,参见本人的Android底层研究系列,不断 ...

  4. 关于Bootstrap 利用radio实现tab切换的一个问题

    1.html代码 <div class="col-sm-10 nav nav-tabs" id="typelist" role="tablist ...

  5. [摸鱼] 配置的vim的使用攻略!

    vim使用攻略 <>=f 折叠与缩进 开:<>[^fuck]cc 关:<>cu 缩进一块使用V选中,按>> [Ctrl]V 以列为单位选 za,打开或关 ...

  6. centos 7 安装配置mod_security

    1.旧版本安装过程: http://blog.secaserver.com/2011/10/install-mod_security-apache2-easiest/ http://www.cnblo ...

  7. xen 不同后端存储方案的性能对比

    概述 在xen平台下,一般使用文件来模拟一个磁盘.在xen中使用文件来模拟磁盘有3种方式, blkback 直接操作 blktap2 直接将文件映射为一个裸块设备,这样vm可以直接用phy的方式进行文 ...

  8. dnspod 批量添加记录

    #!/usr/bin/python #-*- coding: utf-8 -*- import os,requests,json import re,xlsxwriter,time import xl ...

  9. Kubernetes-服务发布

    #发布服务有三种方式,第一种把端口映射到所有节点比较适合发布一些tcp/udp的服务对于应用层像http的会导致无法获取到原始客户端IP,第二种需要用到云服务才行,第三种是ingress http服务 ...

  10. python--io

    import io # io模块里面主要使用StringIo和BytesIo # StringIo f = io.StringIO() # 像使用open函数创建文件一样,生成一个句柄 # 可以直接向 ...