Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容。在使用过程中,对一些疑问点进行了整理与解析。
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 的字符串(未经分析的文本数据类型)
(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();
(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 基本搜索部分详解的更多相关文章
- Elasticsearch Java API深入详解
0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- 【elasticsearch】搜索过程详解
elasticsearch 搜索过程详解 本文基于elasticsearch8.1.在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的 ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- JAVA反射概念及使用详解(超详细)
JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- java 关键字final static native详解
java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...
- Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
随机推荐
- Java跨域问题的处理详解
1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...
- C 实现可变参数
C中可以借助va_list实现可变参数: va_start:使用传入的可变参数的第一个变量初始化va_list va_arg:获取当前可变参数,每次调用时会将指针向后移 va_end:结束 利用这个机 ...
- 循环渐进linux笔记——linux系统基本机构
第一篇 linux的基础介绍 1.linux是一个支持多用户多任务的超棒系统,它具由六个字符控制台,每个控制台都能独立作业,不会互相影响,如果需要在几个字符控制台互相切换的话可以用组合键 ctrl+a ...
- 解决 iframe 在 ios 上不能滚动的问题
HTML代码在使用IFRAME或者其他HTML元素时,你需要使用一个元素(如DIV)来包装他们: <div class="scroll-wrapper"> <i ...
- Java设计模式探讨之单例模式
单例模式是在平时的项目开发中比较常见的一种设计模式,使用比较普遍,网上的资料也是一抓一大把,小Alan也来凑凑热闹,为以后充实点设计模式相关的内容做个简单的开篇. 单例模式是一种创建对象的模式,用于产 ...
- Leetcode题解(十二)
33.Search in Rotated Sorted Array 题目 这道题目如果没有其他要求,直接遍历一遍就可以知道答案,但是,题目给出了是排序了数组,但是数组有可能经过了旋转得到,其解题思路仍 ...
- myeclipse自动保存修改代码
当你修改过代码后,myeclipse往往要你手动的保存代码才能运行这个修改后的代码,要是不保存就会一直运行修改前的代码.只要修改myeclipse中这两项,就可以让它编译运行修改后的代码: Windo ...
- javascript 可多选的下拉框 multiselect
首先引用一个写的很好的博客http://www.cnblogs.com/landeanfen/p/5013452.html 我使用的是bootstrap-multiselect,实现功能是 选择下拉框 ...
- SeaJS之shim插件:解决非cmd规范的插件与sea的区别
SeaJS 中的模块默认都遵守 CMD 规范,但现实中已存在大量普通 JavaScript 类库,比如 jQuery.Underscore 等.使用 shim 插件,可以将这些普通 JS 文件转换成 ...
- vue 2 仿IOS 滚轮选择器 从入门到精通 (一)
大家好,由于最近从事的是微信公众号和APP内嵌 H5开发,避免不了开发一些和native相同的操作功能,就如接下来说的 仿IOS滚轮选择器. 先来个截图: 接下来具体介绍如何实现的.能力有限避免不了错 ...