目前在做基于ElasticSearch的搜索实现,采用ElasticSearch提供的Java API实现,用TransportClient连接到ES的Cluster。
根据经验,一个搜索请求应该走这样的流程:
- Analyzer分析Query Term
- 根据Analyzer的结果构建TermQuery
- 发送Query请求给ES
- 处理返回结果
想找一段Sample Code,可是一直没找到ES里合适的Analyzer类,很奇怪为什么直接发JSON请求很简单的事,Java处理起来这么复杂(用JSON请求见:http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html)。
静态在StackOverFlow的一个问题里无意看到了这个类:QueryStringQueryBuilder,一切问题迎刃而解了
代码解析
1 创建客户端
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true)
.put("client", true)
.put("data",false)
.put("clusterName","elasticsearch")
.build();
client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(hostName, 9300));
2 创建StringQuery对象:
QueryStringQueryBuilder = new QueryStringQueryBuilder(parameters.getQueryTerm());
queryStringBuilder.useDisMax(true);
queryStringBuilder.field("title",160);
queryStringBuilder.field("desc",1);
3 构建SearchRequest
SearchRequestBuilder builder= client.prepareSearch("indexName")
.setTypes("collectionName")
.setSearchType(SearchType.DEFAULT)
.setFrom(parameters.getStart())
.setSize(parameters.getCount());
builder.setQuery(queryStringBuilder);
这样,一个基本ElasticSearch请求就构建成功了。
Query 还是 Filter
以前一直弄不清楚为什么Filter也干一些Query可以做的事情,比如查询的附件条件是分类值为”1“,用TermQuery可是实现,用TermFilter也可以实现,为什么有重复的功能。
根据这里(http://es-cn.medcl.net/guide/reference/query-dsl/),可以看出,Filter最大的好处是可以实现缓存,并且不需要计算得分。
完善后的搜索
根据上面的结论,重新把搜索条件里的其他限定条件用Filter实现,代替掉原来的Query实现:
FilterBuilder categoryFilterBuilder = FilterBuilders.termFilter("categoryId", parameters.getCategoryId());
String[] ids = new String[parameters.getTypeIds().size()];
parameters.getTypeIds().toArray(ids);
FilterBuilder inFilter = FilterBuilders.inFilter("typeId", ids);
builder.setFilter(filterBuilder);
最后执行搜索:
SearchResponse response = builder.execute().actionGet();
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java调用Elasticsearch(ES)提供的API进行数据搜索。Elasticsearch是一个流行的开源全文搜索引擎,具有分布式、实时、可扩展性等特性,广泛应用于大数据分析和日志检索等领域。...
Elasticsearch (ES) 是一个分布式、RESTful风格的搜索和数据分析引擎,广泛用于实时数据检索、分析和存储。在Java开发中,我们通常使用官方提供的Java REST Client来与ES集群进行交互。 Java REST Client是Elastic...
在这个基于Elasticsearch 2.1.1的Java API基本操作代码示例中,我们将探讨如何利用Java API进行常见的数据操作,如索引创建、文档插入、查询以及更新。 首先,为了使用Elasticsearch的Java API,我们需要在项目中...
2. **Java API**:Elasticsearch提供了Java REST客户端,使得开发者可以直接通过Java代码与ES集群进行交互。这个API简化了与ES通信的复杂性,并且性能高效。 3. **Elasticsearch安装与配置**:在开始编写Java程序...
**Elasticsearch Java API**是Elasticsearch官方提供的用于与Elasticsearch服务器进行交互的Java客户端库。在Java应用程序中,我们通常会使用这个API来创建、查询、更新和删除索引中的数据。Elasticsearch 2.3版本的...
4. **实时监控**:通过Jest调用Elasticsearch的监控接口,获取集群健康状态、节点信息等。 通过学习和实践这些基本概念和操作,你将能熟练地使用Elasticsearch和Java Jest库构建自己的搜索引擎和分析系统。在实际...
**Elasticsearch Java API**是Elasticsearch与Java应用程序交互的主要工具,它允许开发者在Java环境中无缝地创建、管理和查询Elasticsearch索引。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,用于...
本示例代码是关于如何在Java环境中使用Elasticsearch进行操作的一个实例。 在Java中,我们通常使用官方提供的`Elasticsearch Java Client`来与Elasticsearch服务器进行交互。`com.text.elasticsearch`这个文件夹...
"elasticsearch-java-demo"这个项目很可能是展示如何在 Java 中使用 Spring Boot 整合 Elasticsearch 的示例。它可能包含了初始化数据、执行查询、插入和更新数据的示例代码。这个项目对于学习和理解如何在实际应用...
Elasticsearch是一个开源的全文搜索引擎,基于Lucene构建,提供实时、分布式、可扩展的数据存储和搜索能力。它设计用于处理大量数据,同时保持高性能和高可用性。在2.3.3版本中,Elasticsearch已经是一个非常成熟的...
SpringBoot整合Elasticsearch是现代Java开发中常见的一项任务,因为SpringBoot的便捷性和Elasticsearch的高效搜索能力,使得这种结合在数据检索、分析和日志存储等领域广泛应用。本项目"springboot-elasticsearch-...
Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,被广泛用于实时的索引和搜索,尤其在大数据分析和实时数据检索方面表现卓越。它使用Java开发,并且提供了丰富的Java API供开发者进行操作。本实例主要...
4. **使用工具类**:在业务代码中,通过工具类调用Elasticsearch的相关功能,例如搜索、插入、更新或删除数据。 5. **异常处理**:确保在操作Elasticsearch时捕获并处理可能出现的异常,保证系统的稳定运行。 6. *...
"test-es-client.zip_M4M_elastic_elasticsearch"这个压缩包文件,显然包含了与Elasticsearch客户端相关的代码或配置,用于在M4M(可能是Machine to Machine通信或某种项目代号)环境中调用Elasticsearch服务。...
Elasticsearch 是一个开源的全文搜索引擎,它以其高效、可扩展和易用性而广受开发者欢迎。Java API 是 Elasticsearch 提供的一种客户端接口,允许开发者使用 Java 语言与 Elasticsearch 服务器进行交互。离线文档是...
在Java代码中,通过`Subject`对象和`LoginContext`来调用KerberosLoginModule进行登录操作。登录成功后,可以从`Subject`中获取到验证过的凭据,用于后续的授权和服务请求。 3. **示例代码** ```java import ...
虽然提供的压缩包文件列表没有包含具体的代码示例,但在实际操作中,调用Java WebService的Delphi代码可能类似以下形式: ```delphi uses SoapHTTPClient; var WebServiceClient: TMyWebService; // 假设已根据...
Elasticsearch是一个强大的分布式搜索引擎,广泛应用于数据存储和检索。其Java API允许开发者直接通过Java代码与Elasticsearch集群交互,实现数据的增删改查、索引管理和集群操作等功能。以下是对Elasticsearch Java...
《Java Elasticsearch实战》这本书主要探讨了如何利用Java API与Elasticsearch进行深度集成,从而实现高效的数据检索和分析。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,广泛应用于日志分析、...