Elasticsearch java api 基本搜索部分详解
一、所使用版本的介绍
使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的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();
上述代码就是讲所要查询的词塞进去,其中setfrom,setsize是指一页显示的多少,从第几个开始,显示size个数据
3、展示
SearchHits hits = myresponse.getHits();
for (int i = 0; i < hits.getHits().length; i++) {
System.out.println(hits.getHits()[i].getSourceAsString());}
其中还可以使用hits.getHits()[i].getSource(),这是一个map的格式,可以将具体要展示的进行展示出来
三、搜索时其他api的实现
读DSL的时候我们可以看到,查询有很多的查询,比如说多域,比如说过滤等查询条件,下面就针对Elasticsearch服务器开发中一些基本查询的DSL给出在java api实现的一些形式,其中很多形式不同的之处只是上述塞查询词时候的setQuery里面的不同,所以在此只是讲述里面的函数不同
(1)基本查询
responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))
所使用的是matchPhraseQuery(field,text)函数,这个函数的参数有两个,其中对应text的部分是要解析的,例如,molong1208 blog 可能经过解析之后会解析成molong1208 以及blog然后再进行查询的
(2)多词条查询
responsebuilder.setQuery(QueryBuilders.termsQuery("title", "molong1208","blog","csdn"))
对于三个词molong1208,blog,csdn在title字段进行查询,如果有三者中的任意一个即算匹配
(3)match_all查询
responsebuilder.setQuery(QueryBuilders.matchAllQuery())
(4)常用词查询
responsebuilder.setQuery(QueryBuilders.commonTermsQuery("name", "lishici"))
可以在后面设置具体的cutoffFrequency
(5)match查询
只使用过matchPhraseQuery函数,具体用法见上述所示
(6)multi_match查询
responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))
multiMatchQuery(text,fields)其中的fields是字段的名字,可以写好几个,每一个中间用逗号分隔
(7)query_string查询
responsebuilder.setQuery(QueryBuilders.queryStringQuery(""))
没使用过这个查询,所以对此查询不是很熟悉,所对应的是Elasticsearch服务器开发的3.3.7,具体使用的时候可以再深究如何使用
(8)simple_query_string查询
responsebuilder.setQuery(QueryBuilders.simpleQueryStringQuery(""))
同上所示,3.3.8
(9)标识符查询
个人理解应该是类似如下的查询,具体请各位用的时候再次去研究具体哪一个
GetResponse getresponse = client.prepareGet("users", "user", "3").get();
(10)前缀查询
responsebuilder.setQuery(QueryBuilders.prefixQuery("title", "mo"))
前一个参数为使用的field后一个参数为所使用的前缀词
(11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查询
responsebuilder.setQuery(QueryBuilders.fuzzyQuery("title", "malong"))
在所使用的版本,没发现如何使用fuzzy_like_this以及fuzzy_like_this_field的函数,不清楚是否有这个功能,只发现有fuzzy查询,后面可以设置boost等值
(12)通配符查询
responsebuilder.setQuery(QueryBuilders.wildcardQuery("title", "molo?g"))
(13)more_like_this,more_like_this_field
responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))
responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))
有两个方法,其中第二个是在_all范围内进行查询,第一个后面还有很多可以设置,有需要用的可以具体参考
(14)rang查询
responsebuilder.setQuery(QueryBuilders.rangeQuery("age").gt(10).lt(20))
对于某一个field,大于多少,小于多少
(15)dismax查询
responsebuilder.setQuery(QueryBuilders.disMaxQuery().add(QueryBuilders.termQuery("title", "molong1208")))
(16)正则表达式查询
responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))
四、bool查询
上述只是大概给出了具体的查询方式,有些时候可能我们所想要的为比较复杂的查询,例如想要查一个在某个字段必须有某个值,并且另一个字段必须有另外一个值的情况,这种时候就可以使用bool查询,例如下所示
responsebuilder.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.multiMatchQuery(query, "name","title","title_1")).must(QueryBuilders.multiMatchQuery(query2, "title2","title3")))
上述的意思是,在title或者title_1或者name字段有query,并且在title2或者title3字段有query2的结果召回来
当然,可以根据自己的情况,有should,must_not等选择
五、过滤器
在使用过滤的时候,版本2.1.0仅仅有postfilter,例如
responsebuilder.setPostFilter(QueryBuilders.existsQuery("title"))
表示的就是exists过滤,对有title字段的过滤,个人是这么理解的,可能有误
responsebuilder.setPostFilter(QueryBuilders.missingQuery("title"))
这个的意义与上面的完全不同,可以参考Elasticsearch服务器开发具体章节的介绍
且postfilter为对结果级进行过滤即搜索出来的结果,对结果进行过滤的,可以理解为后置的过滤器,es大部分都是先过滤后聚合,这个可以设置为先聚合后过滤
Elasticsearch java api 基本搜索部分详解相关推荐
- Spring和Elasticsearch全文搜索整合详解
Spring和Elasticsearch全文搜索整合详解 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web ...
- 【elasticsearch】Elasticsearch 7.X Scripting 脚本使用详解
1.概述 转载:Elasticsearch 7.X Scripting脚本使用详解 0.题记 除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少. 一方面 ...
- 40000+字超强总结?阿里P8把Java全栈知识体系详解整理成这份PDF
40000 +字长文总结,已将此文整理成PDF文档了,需要的见文后下载获取方式. 全栈知识体系总览 Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 ...
- ElasticSearch——Spring Boot 集成 ES 操作详解
文章目录 ElasticSearch--Spring Boot 集成 ES 操作详解 1.SpringBoot 集成 ES 2.索引的API操作详解 3.文档的API操作详解 ElasticSearc ...
- Java对接微信公众平台详解
Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...
- Java Thread的interrupt方法详解
Java Thread的interrupt方法详解 一.概述 interrupt方法的目的是给线程发出中断信号,但是不保证线程真的会中断 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应 ...
- Elasticsearch Java API 6.2(java client)
前言 本节描述了Elasticsearch提供的Java API,所有的Elasticsearch操作都使用客户端对象执行,所有操作本质上都是完全异步的(要么接收监听器,要么未来返回). 此外,客户端 ...
- java中的进制输出转换_Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
- 《Java和Android开发实战详解》——1.2节Java基础知识
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
最新文章
- tf.nn.embedding_lookup()的用法
- ORA-01031: insufficient privileges的解决方法
- [转] React Hot Loader 3 beta 升级指南
- crm创建和编辑全局选项集
- java51游戏_Java作业实践(一)魔板游戏
- 一篇文章带你详解 HTTP 协议之报文首部及字段详解(中)
- oracle日记账单据编号未生成_商管财务数据平台Oracle与共享未付池差异如何核对、解决?...
- react学习(15)---antdesign form两种验证
- 格力电器2018年年度权益分派方案出炉:共派发90亿元
- Navicat执行sql文件
- linux系统如何重置密码
- linux 查看文件夹大小
- 微信语音导出-微信收藏语音导出-微信语音转MP3文件
- 君正Ingenic X1000E_halley2 更改Logo
- 云南人,你的家乡在哪里?
- 虚拟桌面分屏_办公人员必备技能,WINDOWS桌面分屏,多个桌面视图互不干扰
- 毫秒转换成对应到达时间
- element-ui 表格合并问题
- 微信聊天机器人:软件和源代码,适合小白~(含wxpy、pyinstaller、腾讯AI智能问答、django等模块)
- DDOS压力测试平台源码
热门文章
- 从txt导入10个数据c语言,怎么将txt中带逗号的数据导入定义好的数据结构中
- Apache网页优化概述
- 中标麒麟linux系统忘记root密码,中标麒麟(龙芯CPU)--忘记root密码怎么修改?
- java程序中可以如何异常处理?_如何处理罗茨鼓风机在运行过程中出现异常噪音和叶片的运行特性...
- app式成语_疯狂的成语app
- 新疆计算机一级考试试题视作题,2014新疆计算机一级考试试题汇总
- idea取消comiit_IDEA 合并多次commit为一个?
- ckks方案优化最好的_网站优化关键词怎么选?好的关键词长什么样?
- matlab矩阵初等变换矩阵,实验一 MATLAB基本操作及矩阵初等运算
- php ppt read_php怎么读取ppt文字内容并在浏览器中显示出来?