返回顶部

收藏

Java Client调用ElasticSearch做全文搜索代码示例

更多

目前在做基于ElasticSearch的搜索实现,采用ElasticSearch提供的Java API实现,用TransportClient连接到ES的Cluster。 根据经验,一个搜索请求应该走这样的流程:

  1. Analyzer分析Query Term
  2. 根据Analyzer的结果构建TermQuery
  3. 发送Query请求给ES
  4. 处理返回结果

想找一段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();  

标签:ElasticSearch,搜索,java

收藏

0人收藏

支持

1

反对

1

发表评论