一、所使用版本的介绍

使用的是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类里面给出初始化函数

  1. private static void open()

  2. {

  3. Settings settings = Settings.settingsBuilder()

  4. .put("cluster.name", "molong").build();

  5. try {

  6. client = TransportClient.builder().settings(settings).build()

  7. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

  8. } catch (UnknownHostException e) {

  9. // TODO Auto-generated catch block

  10. e.printStackTrace();

  11. }

  12. }

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

2、进行查询

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

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

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

  1. SearchResponse myresponse=responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))

  2. .setFrom(0).setSize(10).setExplain(true).execute().actionGet();

上述代码就是讲所要查询的词塞进去,其中setfrom,setsize是指一页显示的多少,从第几个开始,显示size个数据

3、展示

  1. SearchHits hits = myresponse.getHits();

  2. for (int i = 0; i < hits.getHits().length; i++) {

  3. 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 基本搜索部分详解相关推荐

  1. Spring和Elasticsearch全文搜索整合详解

    Spring和Elasticsearch全文搜索整合详解 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web ...

  2. 【elasticsearch】Elasticsearch 7.X Scripting 脚本使用详解

    1.概述 转载:Elasticsearch 7.X Scripting脚本使用详解 0.题记 除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少. 一方面 ...

  3. 40000+字超强总结?阿里P8把Java全栈知识体系详解整理成这份PDF

    40000 +字长文总结,已将此文整理成PDF文档了,需要的见文后下载获取方式. 全栈知识体系总览 Java入门与进阶面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - 知识点 ...

  4. ElasticSearch——Spring Boot 集成 ES 操作详解

    文章目录 ElasticSearch--Spring Boot 集成 ES 操作详解 1.SpringBoot 集成 ES 2.索引的API操作详解 3.文档的API操作详解 ElasticSearc ...

  5. Java对接微信公众平台详解

    Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...

  6. Java Thread的interrupt方法详解

    Java Thread的interrupt方法详解 一.概述 interrupt方法的目的是给线程发出中断信号,但是不保证线程真的会中断 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应 ...

  7. Elasticsearch Java API 6.2(java client)

    前言 本节描述了Elasticsearch提供的Java API,所有的Elasticsearch操作都使用客户端对象执行,所有操作本质上都是完全异步的(要么接收监听器,要么未来返回). 此外,客户端 ...

  8. java中的进制输出转换_Java I/O : Java中的进制详解

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

  9. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

最新文章

  1. tf.nn.embedding_lookup()的用法
  2. ORA-01031: insufficient privileges的解决方法
  3. [转] React Hot Loader 3 beta 升级指南
  4. crm创建和编辑全局选项集
  5. java51游戏_Java作业实践(一)魔板游戏
  6. 一篇文章带你详解 HTTP 协议之报文首部及字段详解(中)
  7. oracle日记账单据编号未生成_商管财务数据平台Oracle与共享未付池差异如何核对、解决?...
  8. react学习(15)---antdesign form两种验证
  9. 格力电器2018年年度权益分派方案出炉:共派发90亿元
  10. Navicat执行sql文件
  11. linux系统如何重置密码
  12. linux 查看文件夹大小
  13. 微信语音导出-微信收藏语音导出-微信语音转MP3文件
  14. 君正Ingenic X1000E_halley2 更改Logo
  15. 云南人,你的家乡在哪里?
  16. 虚拟桌面分屏_办公人员必备技能,WINDOWS桌面分屏,多个桌面视图互不干扰
  17. 毫秒转换成对应到达时间
  18. element-ui 表格合并问题
  19. 微信聊天机器人:软件和源代码,适合小白~(含wxpy、pyinstaller、腾讯AI智能问答、django等模块)
  20. DDOS压力测试平台源码

热门文章

  1. 从txt导入10个数据c语言,怎么将txt中带逗号的数据导入定义好的数据结构中
  2. Apache网页优化概述
  3. 中标麒麟linux系统忘记root密码,中标麒麟(龙芯CPU)--忘记root密码怎么修改?
  4. java程序中可以如何异常处理?_如何处理罗茨鼓风机在运行过程中出现异常噪音和叶片的运行特性...
  5. app式成语_疯狂的成语app
  6. 新疆计算机一级考试试题视作题,2014新疆计算机一级考试试题汇总
  7. idea取消comiit_IDEA 合并多次commit为一个?
  8. ckks方案优化最好的_网站优化关键词怎么选?好的关键词长什么样?
  9. matlab矩阵初等变换矩阵,实验一 MATLAB基本操作及矩阵初等运算
  10. php ppt read_php怎么读取ppt文字内容并在浏览器中显示出来?