文档是结合几个博客整理出来的,内容大部分为转载内容。在使用过程中,对一些疑问点进行了整理与解析。

Elasticsearch java api 基本搜索部分详解

ElasticSearch 常用的查询过滤语句

一、所使用版本的介绍

使用的是elasticsearch2.4.3版本,在此只是简单介绍搜索部分的api使用

二、简单的搜索

使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最简单搜索的全部的过程以及代码,之后将对不同的搜索只是针对函数进行介绍

(1)DSL搜索

对于最简单的DSL搜索,对一个词进行搜索使用url直接进行通信,例如,如果对于一个字段,

搜索具体的一个term或者query,DSL如下所示:

{“query”:{"term":{"title":"molong1208 blog"}}}

这个搜索的含义是:在title字段,搜索内容为molong1208 blog;上面是DSL的写法,实际上对于简单的查询,也可以直接使用url查询,不带json格式,假设我们所使用的服务器ip是localhost,对于如上的查询可以写为:

localhost:9200/index/type/_search? q=title:molong1208 blog

这个写法与上边的DSL语言是同样的功能的,但是这种写法只是一些简单的查询才可以用,例如显示想要的字段,按照某一字段排序等

localhost:9200/index/type/_search? q=title:molong1208 blog&fields=name,title&sort=id:desc&pretty=true

上述url的意思就是在index/type里面的title字段搜索内容,并且显示的字段为name以及title,按照id降序排序,输出的格式为美化的json格式

(2)使用java api 实现简单搜索

1、建立连接

java api使用搜索的时候,必须先进行连接,在直接url的时候是端口9200,但是在使用程序的时候为9300,如下所示,建立客户端的连接,在connection类里面给出初始化函数

     private static void open()
{
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "molong").build(); try {
client = TransportClient.builder().settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

在此使用的是TransportClient连接,还有一个Nodeclient,没使用过,在此不做介绍

2、进行查询

查询的时候,需要建立一个SearchRequestBuilder,这里面将给出对于哪一个index或者type进行查询,并且所有的设置都可以在这里面进行实现,例如模糊查询,范围查询,前缀查询等

SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type")

上述代码的意思是对于index的type进行查询,其中client即使得到的建立链接,下一步就是要将查询词给进去

    SearchResponse myresponse=responsebuilder.setQuery(
QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))
.setFrom(0).setSize(10).setExplain(true).execute().actionGet();

3、展示

    SearchHits hits = myresponse.getHits();
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println(hits.getHits()[i].getSourceAsString());}

4、常用的方法说明

setFrom(0):类似于分页的下标、索引,默认为0
setSize(10):分页的每页展示的数量,默认为10

三、搜索时其他api的实现

读DSL的时候我们可以看到,查询有很多的查询,比如说多域,比如说过滤等查询条件,下面就针对 Elasticsearch服务器开发中一些基本查询的DSL给出在java api实现的一些形式,其中很多形式不同的之处只是上述塞查询词时候的setQuery里面的不同,所以在此只是讲述里面的函数不同

(1)基本查询

         SearchResponse myresponse=responsebuilder.setQuery(
//1.基本查询
QueryBuilders.matchPhraseQuery("name", "岳云鹏18")
)
.setFrom(0).setSize(10)
// .setExplain(true)
.execute().actionGet();

matchPhraseQuery(String name, Object text):name表示字段名称,text表示字段所对应的内容。

(2)多词条查询

 SearchResponse myresponse=responsebuilder.setQuery(
//2.多词条查询 ?
//term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
QueryBuilders.termsQuery("levle","3","2")
)
.setFrom(0).setSize(10)
// .setExplain(true)
.execute().actionGet();

term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)

详情参考:ElasticSearch 常用的查询过滤语句

(3)match_all查询

 SearchResponse myresponse=responsebuilder.setQuery(
//3.查询全部
QueryBuilders.matchAllQuery()
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

有点类似于mysql语法:select * from tableName

(4)常用词查询

 SearchResponse myresponse=responsebuilder.setQuery(
//4.常用词查询
QueryBuilders.commonTermsQuery("name", "岳云鹏18")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

个人觉得与(1)基本查询matchPhraseQuery(String name, Object text)类似

(5)match查询

只使用过matchPhraseQuery函数,具体用法见上述所示

(6)multi_match查询

 SearchResponse myresponse=responsebuilder.setQuery(
//6.multiMatchQuery(text,fields)其中的fields是字段的名字,可以写好几个,每一个中间用逗号分隔
QueryBuilders.multiMatchQuery("13", "name","address")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

multiMatchQuery(Object text, String... fieldNames):text为文本值,fieldNames为字段名称。

举例说明:name、address为字段名称,13为文本值。查询name字段或者address字段文本值为13的结果集。

(7)query_string查询

 SearchResponse myresponse=responsebuilder.setQuery(
//7.query_string查询 (所有字段内容包含以下文本的)
QueryBuilders.queryStringQuery("13")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

查询任意字段文本值为13的结果集。multi_match为指定某几个字段,query_string是查所有的字段。

(8)simple_query_string查询

 SearchResponse myresponse=responsebuilder.setQuery(
//8.simple_query_string查询
QueryBuilders.simpleQueryStringQuery("13")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

个人觉得与query_string没太大区别,感兴趣的可以深入研究

(9)标识符查询

这个没有研究,直接语法有兴趣的可以深入研究

GetResponse getresponse = client.prepareGet("users", "user", "3").get();

(10)前缀查询

 SearchResponse myresponse=responsebuilder.setQuery(
//8.前缀查询 (一个汉字,字符小写)
// QueryBuilders.prefixQuery("name", "云")
QueryBuilders.prefixQuery("name", "12")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

详情参考:ElasticSearch 常用的查询过滤语句

(11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查询

SearchResponse myresponse=responsebuilder.setQuery(
//9.fuzzy_like_this,fuzzy_like_this_field,fuzzy查询
//fuzzyQuery:使用模糊查询匹配文档查询
QueryBuilders.fuzzyQuery("name", "鹏16")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

只发现了这个方法fuzzyQuery(String name, String value),也许高版本的会有其他方法

(12)通配符查询

wildcard查询和prefix查询类似,也是一个基于词条的低级别查询。但是它能够让你指定一个模式(Pattern),而不是一个前缀(Prefix)。它使用标准的shell通配符:?用来匹配任意字符,*用来匹配零个或者多个字符。

 SearchResponse myresponse=responsebuilder.setQuery(      

                 //10.通配符查询 ?用来匹配任意字符,*用来匹配零个或者多个字符
// QueryBuilders.wildcardQuery("name", "岳*")
QueryBuilders.wildcardQuery("createTime", "?ue*")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

有一点需要注意的是:由于?用来匹配字符的,而非字符串。查询中文的使用?是无效的。

(13)more_like_this,more_like_this_field

    responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))
    responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))

详情参考:http://blog.csdn.net/lu_wei_wei/article/details/51088125

(14)rang查询

range过滤允许我们按照指定范围查找一批数据

范围操作符包含:

  • gt :: 大于
  • gte:: 大于等于
  • lt :: 小于
  • lte:: 小于等于
         SearchResponse myresponse=responsebuilder.setQuery(      

                 //12.rang查询
QueryBuilders.rangeQuery("age").gt(10).lt(20)
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

(15)dismax查询

 将子查询union 到一起,没个文档的分数是 子查询中相同文档的得分最大值。 
例: 北京大饭店 酒索引得分 0; 店 得分 1; 大得分1.1 最后的结果是 北京大饭店相关度得分1.1
  
    QueryBuilders.disMaxQuery()
.add(QueryBuilders.termQuery("hotelName","酒"))
.add(QueryBuilders.termQuery("hotelName","店"))
.add(QueryBuilders.termQuery("hotelName","大"));

(16)正则表达式查询

         SearchResponse myresponse=responsebuilder.setQuery(      

                 //14.正则表达式查询
QueryBuilders.regexpQuery("createTime", "dec.*")
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

注意

prefix,wildcard以及regexp查询基于词条进行操作。如果你在一个analyzed字段上使用了它们,它们会检查字段中的每个词条,而不是整个字段。

比如,假设我们的title字段中含有"Quick brown fox",它会产生词条quick,brown和fox。

这个查询能够匹配:

{ "regexp": { "title": "br.*" }}

而不会匹配:

{ "regexp": { "title": "Qu.*" }}
{ "regexp": { "title": "quick br*" }}
 Elasticsearch正则表达式语法: https://www.cnblogs.com/xing901022/p/6797597.html

四、bool查询

bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:

  • must :: 多个查询条件的完全匹配,相当于 and。
  • must_not :: 多个查询条件的相反匹配,相当于 not。
  • should :: 至少有一个查询条件匹配, 相当于 or。
  SearchResponse myresponse=responsebuilder.setQuery(      

                 //15.bool查询
QueryBuilders.boolQuery()
.must(QueryBuilders.multiMatchQuery("13", "name"))
.must(QueryBuilders.multiMatchQuery("13", "address"))
)
.setFrom(0).setSize(100)
// .setExplain(true)
.execute().actionGet();

multiMatchQuery(Object text, String... fieldNames)用法参考(6)multi_match查询

Elasticsearch java api 基本搜索部分详解的更多相关文章

  1. Elasticsearch Java API深入详解

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

  2. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  3. 【elasticsearch】搜索过程详解

    elasticsearch 搜索过程详解 本文基于elasticsearch8.1.在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的 ...

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

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

  5. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

  6. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  7. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  8. java 关键字final static native详解

    java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...

  9. Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

随机推荐

  1. MVC-HtmlHelper简单总结

    Asp.Net MVC - Htmlhelper 总结 HtmlHelper是一个返回Html字符串的方法.返回的字符串可以是任意类型.例如你可以使用HtmlHelper方法返回一个标准的html标签 ...

  2. 【NOIP2016 Day1 T2】天天爱跑步

    题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...

  3. Thrift - 快速入门

    简单实例 有homebrew的话,直接执行以下命令即可,brew会处理相关依赖(https://thrift.apache.org/docs/install/). brew install thrif ...

  4. javascript方法的方法名慎用close

    通常我们在定义了与window同名的方法时,会自动覆盖掉window同名的方法.close()方法也不例外.示例: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  5. Gridview 动态添加行

    /// <summary> /// 首次加载绑定 /// </summary> private void DataLoad()         { list.Add(new P ...

  6. LeetCode 339. Nested List Weight Sum (嵌套列表重和)$

    Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...

  7. LeetCode 1. Two Sum (两数之和)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  8. css 权重 特殊性

    选择器的特异性由 CSS2 规范定义如下:     !important的规则比其他的权值都大     p{color: red !important} 如果声明来自于“style”属性,而不是带有选 ...

  9. MSSQL 备份数据库还原

    -- 完整还原RESTORE DATABASE XXXX FROM DISK = 'd:\XXXX.bak' WITH MOVE 'XXXX' TO 'D:\MSSQL\Data\XXXX.mdf', ...

  10. Python学习中的一些小例子

    这篇文章包括用Python编写的斐波那契数列,三位数的水仙花数和百钱买百鸡的基础代码 斐波那契数列: ''' def hanshu(n): n_1 = 1 n_2 = 1 m = n sumn = 0 ...