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. code forces 994C

    C. Two Squares time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. hibernate用配置文件的方式实现orm

    本文主要讲用配置文件的方式讲如何把一个对象和数据库中的表关联起来,其实用配置文件本质是和用注解的方式是一样的. 思路:1.写一个domain对象(如Person.java) 2.写这个domain对象 ...

  3. VMware Storage VMotion概述及功能

    可以跨存储阵列实时迁移虚拟机磁盘文件.VMware Storage VMotion 使您可以在共享存储位置之间和跨共享存储位置重新分配虚拟机磁盘文件,同时保证连续的服务供应和事务处理的完整性. 1.可 ...

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

    10.css模块化 10.1.什么是css模块? CSS模块就是所有的类名都只有局部作用域的CSS文件,当你在一个JavaScript模块中导入一个CSS文件时,CSS模块将会定义一个对象,将文件中类 ...

  5. 【ZOJ4063】Tournament(构造)

    题意:n个人要打m轮比赛 每一轮每个人都要有一个对手.而且每个对手只能打一次.假设a与b打了,c与d打了, 那么后面的任意一轮如果a与c打了,那么b就必须和d打 问是否存在方案,输出字典序最小的一组, ...

  6. eclipse非主窗口的停靠(正常), 恢复, 最小化, 最大化的切换

    1. pydev package Explorer的停靠与内嵌等 正常的情况

  7. Linux用户态定时器用法以及犯错总结【转】

    转自:http://blog.csdn.net/csdn_logo/article/details/48525703 版权声明:本文为博主原创文章,欢迎转载,转载请注明出处,多谢合作. 采样的时候要用 ...

  8. Android控件点击事件

    1. 介绍 本文介绍了Android控件的点击事件 Android控件点击(onClick)事件可以用如下三种方式来实现 2. 实现onClick方法 在layout的xml中指定onClick方法, ...

  9. usb驱动的基本结构和函数简介【转】

    转自:http://blog.csdn.net/jeffade/article/details/7698404 几个重要的结构 struct--接口 struct usb_interface { /* ...

  10. HDU 6305.RMQ Similar Sequence-笛卡尔树+数学期望 (2018 Multi-University Training Contest 1 1008)

    6305.RMQ Similar Sequence 这个题的意思就是对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0,1]的实数,B的重量为B的所有 ...