elasticsearch的查询是通过执行json格式的查询条件,在java api中就是构造QueryBuilder对象,elasticsearch完全支持queryDSL风格的查询方式,QueryBuilder的构建类 是QueryBuilders,filter的构建类是FilterBuilders。下面是构造QueryBuilder的例子:
import static org.elasticsearch.index.query.FilterBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*; QueryBuilder qb1 = termQuery("name", "kimchy"); QueryBuilder qb2 = boolQuery() .must(termQuery("content", "test1")) .must(termQuery("content", "test4")) .mustNot(termQuery("content", "test2")) .should(termQuery("content", "test3")); QueryBuilder qb3 = filteredQuery( termQuery("name.first", "shay"), rangeFilter("age") .from(23) .to(54) .includeLower(true) .includeUpper(false) );
其中qb1构造了一个TermQuery,对name这个字段进行项搜索,项是最小的索引片段,这个查询对应lucene本身的TermQuery。 qb2构造了一个组合查询(BoolQuery),其对应lucene本身的BooleanQuery,可以通过must、should、mustNot 方法对QueryBuilder进行组合,形成多条件查询。 qb3构造了一个过滤查询,就是在TermQuery的基础上添加一个过滤条件RangeFilter,这个范围过滤器将限制查询age字段大于等于 23,小于54的结果。除了这三个,elasticsearch还支持很多种类的查询方式,迟点写个介绍。
构造好了Query就要传到elasticsearch里面进行查询,下面是例子:
SearchResponse response = client.prepareSearch("test") .setQuery(query) .setFrom(0).setSize(60).setExplain(true) .execute() .actionGet();
这句的意思是,查询test索引,查询条件为query,从第0条记录开始,最多返回60条记录。返回结果为SearchResponse,下面解析SearchResponse:
SearchHits hits = searchResponse.getHits(); for (int i = 0; i < 60; i++) { System.out.println(hits.getAt(i).getSource().get("field")); }
获得SearchResponse中的SearchHits,然后hits.getAt(i).getSource().get("field")获得field字段的值。
批量添加删除
elasticsearch支持批量添加或删除索引文档,java api里面就是通过构造BulkRequestBuilder,然后把批量的index/delete请求添加到BulkRequestBuilder里 面,执行BulkRequestBuilder。下面是个例子:
import static org.elasticsearch.common.xcontent.XContentFactory.*; BulkRequestBuilder bulkRequest = client.prepareBulk(); bulkRequest.add(client.prepareIndex("twitter", "tweet", "1") .setSource(jsonBuilder() .startObject() .field("user", "kimchy") .field("postDate", new Date()) .field("message", "trying out Elastic Search") .endObject() ) ); bulkRequest.add(client.prepareIndex("twitter", "tweet", "2") .setSource(jsonBuilder() .startObject() .field("user", "kimchy") .field("postDate", new Date()) .field("message", "another post") .endObject() ) ); BulkResponse bulkResponse = bulkRequest.execute().actionGet(); if (bulkResponse.hasFailures()) { //处理错误 }
使用More like
基于内容的推荐通常是给定一篇文档信息,然后给用户推荐与该文档相识的文档。Lucene的api中有实现查询文章相似度的接口,叫 MoreLikeThis。Elasticsearch封装了该接口,通过Elasticsearch的More like this查询接口,我们可以非常方便的实现基于内容的推荐。
先看一个查询请求的json例子:
{ "more_like_this" : { "fields" : ["title", "content"], "like_text" : "text like this one", } }
其中:
fields是要匹配的字段,如果不填的话默认是_all字段
like_text是匹配的文本。
除此之外还可以添加下面条件来调节结果
percent_terms_to_match:匹配项(term)的百分比,默认是0.3
min_term_freq:一篇文档中一个词语至少出现次数,小于这个值的词将被忽略,默认是2
max_query_terms:一条查询语句中允许最多查询词语的个数,默认是25
stop_words:设置停止词,匹配时会忽略停止词
min_doc_freq:一个词语最少在多少篇文档中出现,小于这个值的词会将被忽略,默认是无限制
max_doc_freq:一个词语最多在多少篇文档中出现,大于这个值的词会将被忽略,默认是无限制
min_word_len:最小的词语长度,默认是0
max_word_len:最多的词语长度,默认无限制
boost_terms:设置词语权重,默认是1
boost:设置查询权重,默认是1
analyzer:设置使用的分词器,默认是使用该字段指定的分词器
下面介绍下如何用java api调用,一共有三种调用方式,不过本质上都是一样的,只不过是做了一些不同程度的封装。
MoreLikeThisRequestBuilder mlt = new MoreLikeThisRequestBuilder(client, "indexName", "indexType", "id"); mlt.setField("title");//匹配的字段 SearchResponse response = client.moreLikeThis(mlt.request()).actionGet();
这种是在查询与某个id的文档相似的文档。这个接口是直接在client那调用的,比较特殊。还有两种就是构造Query进行查询:
MoreLikeThisQueryBuilder query = QueryBuilders.moreLikeThisQuery(); query.boost(1.0f).likeText("xxx").minTermFreq(10);
这里的boost、likeText方法完全和上面的参数对应的。下面这种就是把要匹配的字段作为参数传进来,参数和MoreLikeThisQueryBuilder是一样的:
MoreLikeThisFieldQueryBuilder query = QueryBuilders.moreLikeThisFieldQuery(fieldname)
相关推荐
分布式搜索elasticsearch java API 之(四)--- 删除索引数据 7 分布式搜索elasticsearch java API 之(五)--- 搜索 8 分布式搜索elasticsearch java API 之(六)--- 批量添加删除索引 9 分布式搜索elasticsearch ...
ElasticSearch是个开源的分布式的搜索引擎,它可以近乎实时的存储、检索数据;... ElasticSearch提供javaAPI,使用者可以通过javaAPI调用,但是7.0以后不会提供普通javaAPI,需要使用高级APIrest-high-level调用。
好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个开源的高拓展的分布式全文搜索引擎它可以近乎实时的存储、检索数据;本身拓展性很好,可以拓展到上百台服务器,处理PB级别的数据。es也是用Java开发并使用...
Elasticsearch是一个基于Java编写的高性能搜索引擎,使用了分布式架构,可以处理海量的数据,并提供实时搜索和分析能力。Elasticsearch的数据存储和搜索能力非常强大,支持文本、数字、地理位置等多种类型的数据,并...
使用springboot集成了elasticsearch,封装了常用api,并使用自定义注解创建mapping,简化开发,开箱即用。注:使用的是elasticsearch 5.x版本
包含所因的索引建立、删除、查看,批量创建索引;搜索Query、过滤器 、分组高亮显示;以及创建Mapping
Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 我们建立一个网站或应用程序,并要...
启动解压目录下的bin名称的文件夹,双击elasticsearch.bat文件,就可以启动elasticsearch,启动成功界面如下:启动成功后,会在解压目录下增加2个文件件,data用于数据存储,logs用于日志记录,可以自己创建plugins目录中...
真正的海量技术栈,虽然是3个JAVA的大型项目集群课程,但是其中却包含了非常的技术内容,非常的强大,推荐给有JAVA开发基础和工程师们进行学习...├─103、全文检索-ElasticSearch-Docker安装ES.avi ├─104、全文检索
- 全文检索引擎:ElasticSearch - 分布式链路追踪:SkyWalking - 分布式文件系统:Alibaba OSS - 分布式系统网关:Spring Cloud Gateway - 分布式协调系统:Spring Cloud Alibaba Nacos Server - 分布式配置中心:...
Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 Elasticsearch 不仅仅是 Lucene,
elasticsearch 基于 lucene,隐藏了 lucene 的复杂性,提供了简单易用的 restful api / Java api 接口(另外还有其他语言的 api 接口)。 分布式的文档存储引擎 分布式的搜索引擎和分析引擎 分布式,支持 PB ...
2Elasticsearch 是基于 Apache Lucene 的开发的分布式的、开源的搜索分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。 Elasticsearch 因其简单的 REST API、分布式特性、高性能、可扩展而闻名...
s这门技术有点特殊,跟比如其他的像纯java的课程,比如分布式课程,或者大数据类的课程,比如hadoop,spark,storm等。不太一样 2、es非常重要的一个api,是它的restful api,你自己思考一下,掌握这个es的restful ...
Redis(缓存穿透、缓存击穿、缓存雪崩)、elasticsearch搜索(Java rest高级api)、消息中间件(RabbitMQ发送与接受消息)、阿里云通信、开源单点登陆系统CAS、分布式事务、微信扫码支付(微信支付二维码、支付回调逻辑处理...
类似谷歌、百度这种大数据全文搜索引擎的场景都可以使用ElasticSearch作为底层支持框架,可见ElasticSearch提供的搜索能力确实强大,世面上很多时候我们简称ElasticSearch为es。Logstash是ELK的中央数据流引擎,用于...
讲座:Elasticsearch 完整指南 重要更新:由于版本 7 类型将被删除,默认类型应替换为_doc类型 第 1 部分 - 入门 第 2 课 - Elasticsearch 介绍 Elasticsearch 是一个分析和全文搜索引擎。 它在应用程序中启用搜索...
项目框架elasticsearch-parent: jar和插件依赖工程elasticsearch-dao: 数据接口层elasticsearch-redis: 数据缓存层或消息队列层elasticsearch-web: API接口服务层elasticsearch-core: 核心业务层备注: 框架持续更新...