elasticsearch client用java client 多个and or 条件 怎么写

elasticSearch&java调用
import java.net.InetA
import java.net.UnknownHostE
import java.util.ArrayL
import java.util.I
import java.util.L
import java.util.Map.E
import org.elasticsearch.action.search.SearchR
import org.elasticsearch.action.search.SearchT
import org.elasticsearch.client.C
import org.elasticsearch.client.transport.TransportC
mon.transport.InetSocketTransportAddre
import mon.unit.TimeV
import mon.xcontent.XContentB
import mon.xcontent.XContentF
import org.elasticsearch.index.query.QueryB
import org.elasticsearch.index.query.QueryB
import org.elasticsearch.search.SearchH
public class elastic {
&& &public
static void main(String[] args) throws UnknownHostException {
&// TODO Auto-generated method stub
//创建连接
&&&&&&&&&&
&Client client
=TransportClient.builder().build()
&&&&&&&&&&
.addTransportAddress(new&&
InetSocketTransportAddress(InetAddress.getByName("localhost"),&&
&&&&&&&&&&
&&&&&&&&&&
//用json格式插入数据,插入和查询的数据不支持大写插入大写需要用小写才能查到
&&&&&&&&&&
List jsonData =DataFactory.getInitJsonData();
&&&&&&&&&&
BulkRequestBuilder bulkRequest = client.prepareBulk();
&&&&&&&&&&&
for (int i = 0; i & 1000000; i++) {
&&&&&&&&&&&
//批量插入索引不要使用大写字母会报错
&&&&&&&&&&&
bulkRequest.add(client.prepareIndex("i","t").setSource(jsonData.get(0)));
&&&&&&&&&&&
&&& if (i %
100000 == 0) {
&&&&&&&&&&&&&&&&&&&
bulkRequest.execute().actionGet();
&&&&&&&&&&&&&&&&&&&&&&&
bulkRequest = client.prepareBulk();
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& //索引
&&&&&&&&&&&
//索引类型& article
&&&&&&&&&&&
//prepareIndex(索引,类型,id)
&&&&&&&&&&&&&&&
IndexResponse response = client.prepareIndex("tjs",
"F").setSource(jsonData.get(0)).get();
&&&&&&&&&&&&&&&
if (response.isCreated()) {
&&&&&&&&&&&&&&&&&&
System.out.println("创建成功!");
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&
//按照索引 索引类型 和id进行条件查询
GetResponse response = client.prepareGet("blog", "article",
"AVgoQMt1zYcoo438fMgr")
.execute().actionGet();
& Map rpMap = response.getSource();
& if (rpMap == null) {
System.out.println("empty");
& Iterator& rpItor =
rpMap.entrySet().iterator();
& while (rpItor.hasNext()) {
&& Entry rpEnt =
rpItor.next();
System.out.println(rpEnt.getKey() + " : " +
rpEnt.getValue());
//一般查询
QueryBuilder query =&&
QueryBuilders.fuzzyQuery("code", "abc");
SearchRequestBuilder sbuilder =&&
client.prepareSearch("typeName") // index name
.setTypes("F") // type name
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(query)
//.setPostFilter(QueryBuilders.rangeQuery("eventCount").from(1).to(18))&&
.setFrom(0).setSize(20).setExplain(true);
// System.out.println(sbuilder.toString());
SearchResponse response =&&
sbuilder.execute().actionGet();
for(SearchHit hit:response.getHits()){
&Iterator& rpItor =
hit.getSource().entrySet().iterator();
(rpItor.hasNext()) {
Entry rpEnt = rpItor.next();
System.out.println(rpEnt.getKey() + " : " +
rpEnt.getValue());
&&&&&&&&&&
&& //查看索引和type是否存在
IndicesExistsResponse& response
= client.admin().indices().exists( new
IndicesExistsRequest().indices(new
String[]{"indexName"})).actionGet();
& TypesExistsResponse& response =
client.admin().indices().typesExists(new TypesExistsRequest(new
String[]{"indexName"}, "typeName")).actionGet();
System.out.println(response.isExists());
&&&&&&&&&&
//多种方式查询
&&&&&&&&&&&&&
// 精确 QueryBuilder qb = QueryBuilders.termQuery("host",
& // 模糊 QueryBuilder qb =
QueryBuilders.wildcardQuery("host", "*local*");
&&&&&&&&&&&&&&&
&& // 全文索引需要安装分词器
QueryStringQueryBuilder queryBuilder = new
QueryStringQueryBuilder("一个");&
// queryBuilder.analyzer("ik").field("content");
&&&&&&&&&&
//& 1 最小区间&&
0最大区间& includeLower
包含最小&&&
includeUpper 包含最大
& QueryBuilder qb =
QueryBuilders.rangeQuery("timestamp").from(1).to(new
Long("0")).includeLower(true).includeUpper(true);
SearchRequestBuilder& sbuilder=
client.prepareSearch("typeName")
&&&&&&&&&&
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)&&&&
&&&&&&&&&&
.setQuery(qb)//连续setQuery相当于or
&&&&&&&&&&
.setFrom(0).setSize(5).setExplain(true);//分页前5条
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// BoolQueryBuilder
boolQueryBuilder=QueryBuilders.boolQuery();
boolQueryBuilder.must(qb);//连续must相当于and
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//.setQuery(boolQueryBuilder)
SearchResponse scrollResp = sbuilder.execute().actionGet();
for (SearchHit hit : scrollResp.getHits()) {
Iterator& rpItor = hit.getSource().entrySet().iterator();
while (rpItor.hasNext()) {
Entry rpEnt = rpItor.next();
System.out.println(rpEnt.getKey() + " : " +
rpEnt.getValue());
//不按索引查询
SearchRequestBuilder srb2 = client
&&&&&&&&&&
.prepareSearch().setQuery(QueryBuilders.matchQuery("type",
"S")).setTypes("a")
&&&&&&&&&&
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
&&&&&&&&&&&
.setFrom(0).setSize(5).setExplain(true);;
&&&&&&&&&&
MultiSearchResponse sr = client.prepareMultiSearch()
&&&&&&&&&&
.add(srb2)
&&&&&&&&&&
.execute().actionGet();
&&&&&&&&&&
item=multiSearchResponse.getResponses();
&& SearchResponse scrollResp =
item[0].getResponse();
&&&&&&&&&&
SearchResponse response = item.getResponse();
&&&&&&&&&&
(SearchHit hit : scrollResp.getHits()) {
&& Iterator& rpItor =
hit.getSource().entrySet().iterator();
while (rpItor.hasNext()) {
Entry rpEnt = rpItor.next();
System.out.println(rpEnt.getKey() + " : " +
rpEnt.getValue());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//查询所有的索引
&ClusterState clusterState =
getClient().admin().cluster().prepareState().execute().actionGet().getState();
Mapmap=clusterState.getMetaData().getAliasAndIndexLookup();
& Iterator&
iterator=map.entrySet().iterator();
& while (iterator.hasNext()) {
Entry entry = iterator.next();
&&&&&&&&&&
//按索引删除数据
DeleteIndexResponse dResponse =
client.admin().indices().prepareDelete("typeName")
&&&&&&&&&&&&&&&&&&&&&&&
.execute().actionGet();
& client.close();
class DataFactory {
&&& public
static DataFactory dataFactory = new DataFactory();
&&& private
DataFactory() {
&&& public
DataFactory getInstance() {
return dataF
&&& public
static List getInitJsonData() {
List list = new ArrayList();
Blog blog=new Blog();
blog.setId(1);
blog.setTimestamp(System.currentTimeMillis());
blog.setAppCode("a");
blog.setHost("localhost");
blog.setIp("10.0.250.226");
blog.setUid("VGYGUBGU6y8");
blog.setType("S");
blog.setCode("/abc/index.html");
blog.setContent("error_500");
String data = JsonUtil.model2Json(blog);
list.add(data);
&class JsonUtil {
Java实体对象转json对象
&&& public
static String model2Json(Blog blog) {
String jsonData =
&&&&&&&&&&&
XContentBuilder jsonBuild = XContentFactory.jsonBuilder();
&&&&&&&&&&&
jsonBuild.startObject().field("id",
blog.getId()).field("timestamp", blog.getTimestamp())
&&&&&&&&&&&&&&&&&&&
.field("appCode",
blog.getAppCode()).field("host",blog.getHost()).field("ip",blog.getIp())
&&&&&&&&&&&&&&&&&&&
.field("uid",blog.getUid()).field("type",blog.getType()).field("code",blog.getCode()).field("content",blog.getContent())
&&&&&&&&&&&&&&&&&&&
.endObject();
&&&&&&&&&&
&&&&&&&&&&&
jsonData = jsonBuild.string();
} catch (Exception e) {
&&&&&&&&&&&
e.printStackTrace();
return jsonD
class& Blog {
&& &private
&& &private Long
&&& private
String appC
&&& private
&&& private
&&& private
&&& private
&&& private
&&& private
&& &public
Integer getId() {
&& &public void
setId(Integer id) {
&this.id =
&& &public Long
getTimestamp() {
&& &public void
setTimestamp(Long timestamp) {
&this.timestamp =
&& &public
String getAppCode() {
&return appC
&& &public void
setAppCode(String appCode) {
&this.appCode = appC
&& &public
String getHost() {
&& &public void
setHost(String host) {
&this.host =
&& &public
String getIp() {
&& &public void
setIp(String ip) {
&this.ip =
&& &public
String getUid() {
&& &public void
setUid(String uid) {
&this.uid =
&& &public
String getType() {
&& &public void
setType(String type) {
&this.type =
&& &public
String getCode() {
&& &public void
setCode(String code) {
&this.code =
&& &public
String getContent() {
&& &public void
setContent(String content) {
&this.content =
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。16:36 提问
elasticsearch java 获取client速度很慢
大家好,初学elasticsearch使用版本为1.7.0,java程序每次获取client平均需要3S,这样用搜索的意义就没有了。
看了看网上的帖子说client做成单例模式,每次不关闭client,可是做成单例模式不关闭client,es的控制台会报错,但是client还可以继续使用。
请问大家有没有碰到类似的问题?
获取client代码如下:
private static final Log log = LogFactory.getLog(ElasticService.class);
private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();
private TransportClient searchClient =
public TransportClient getElasticClient() throws Exception{
* 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
* 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
* 它会自动帮你添加,并且自动发现新加入集群的机器。
Class clazz = Class.forName(TransportClient.class.getName());
Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });
constructor.setAccessible(true);
searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
return searchC
} catch (Exception e) {
log.error("elasticSearch Client init error :"+e);
throw new RuntimeException("elasticSearch Client init error", e);
请问大家是怎么做的?
就这么多分了····都贡献了。
求代码,求版本····
按赞数排序
经研究发现,每次静态代码调用都是毫秒,但是部署到服务器后发现只有第一次是这么长的时间,第二次调用后至以后都不会那么久 也不需要做成单例,每次获取,用完后关闭,不然es控制台会报错 ,报错如下:
[ 14:11:00,457][WARN ][transport.netty
] [Cerebra] exception
caught on transport layer [[id: 0x79b52975, /192.168.1.101:56796 =& /192.168.1.1
01:9300]], closing connection
获取时长如下:
获取client耗时:342
查询耗时:11
总共有数据:2
本次查询数据:2
{id=1, content=测试Content1, title=测试topicquery1, oper_time=5}
{id=2, content=测试Content2, title=测试topicquery2, oper_time=3}
获取client实例代码还是上面的代码如下:
public class ElasticService {
private static final Log log = LogFactory.getLog(ElasticService.class);
private static Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", "10s").put("client.transport.sniff", "true").build();
public static TransportClient getElasticClient() throws ElasticsearchException{
* 你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
* 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
* 它会自动帮你添加,并且自动发现新加入集群的机器。
Class clazz = Class.forName(TransportClient.class.getName());
Constructor constructor = clazz.getDeclaredConstructor(new Class[] { Settings.class });
constructor.setAccessible(true);
TransportClient searchClient = ((TransportClient) constructor.newInstance(new Object[] { settings }));
searchClient.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
return searchC
} catch (Exception e) {
log.error("elasticSearch Client init error :"+e);
throw new ElasticsearchException("elasticSearch Client init error", e);
请大神指正····
private static TransportClient searchClient =
* 获取ElaticSearchClient
* @author yanghao
* @throws Exception
public static TransportClient getElasticClient() throws Exception {
if(searchClient == null){
synchronized (lock) {//防止高并发时创建多个查询对象
if (searchClient == null) {
searchClient = new ElasticService().getElasticClient();
return searchC
这是上层获取client代码。
大家获取es client是如何做的?请多多指教,谢谢。
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
其他相关推荐53255人阅读
Elasticsearch(43)
Search(43)
多词查询(Multi-word Queries)
如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活。幸运的是,通过match查询来实现多词查询也同样简单:
GET /my_index/my_type/_search
&query&: {
&match&: {
&title&: &BROWN DOG!&
以上的查询会返回所有的四份文档:
&_source&: {
&title&: &Brown fox brown dog&
&_source&: {
&title&: &The quick brown fox jumps over the lazy dog&
&_source&: {
&title&: &The quick brown fox jumps over the quick dog&
&_source&: {
&title&: &The quick brown fox&
文档4的相关度最高因为它包含了&brown&两次和&dog&一次。
文档2和文档3都包含了&brown&和&dog&一次,同时它们的title字段拥有相同的长度,因此它们的分值相同。
文档1只包含了&brown&。
因为match查询需要查询两个词条 -&[&brown&,&dog&]&-
在内部它需要执行两个term查询,然后将它们的结果合并来得到整体的结果。因此,它会将两个term查询通过一个bool查询组织在一起,我们会在一节中详细介绍。
从上面的例子中需要吸取的经验是,文档的title字段中只需要包含至少一个指定的词条,就能够匹配该查询。如果匹配的词条越多,也就意味着该文档的相关度就越高。
提高精度(Improving
Precision)
匹配任何查询词条就算作匹配的话,会导致最终结果中有很多看似无关的匹配。它是一个霰弹枪式的策略(Shotgun Approach)。我们大概只想要显示包含了所有查询词条的文档。换言之,相比brown OR
dog,我们更想要的结果是brown AND dog。
match查询接受一个operator参数,该参数的默认值是&or&。你可以将它改变为&and&来要求所有的词条都需要被匹配:
GET /my_index/my_type/_search
&query&: {
&match&: {
&title&: {
&BROWN DOG!&,
&operator&: &and&
match查询的结构需要被稍稍改变来容纳operator参数。
这个查询的结果会将文档1排除在外,因为它只包含了一个查询词条。
控制精度(Controlling
Precision)
在all和any中选择有种非黑即白的感觉。如果用户指定了5个查询词条,而一份文档只包含了其中的4个呢?将&operator&设置成&and&会将它排除在外。
有时候这正是你想要的,但是对于大多数全文搜索的使用场景,你会希望将相关度高的文档包含在结果中,将相关度低的排除在外。换言之,我们需要一种介于两者中间的方案。
match查询支持minimum_should_match参数,它能够让你指定有多少词条必须被匹配才会让该文档被当做一个相关的文档。尽管你能够指定一个词条的绝对数量,但是通常指定一个百分比会更有意义,因为你无法控制用户会输入多少个词条:
GET /my_index/my_type/_search
&query&: {
&match&: {
&title&: {
&quick brown dog&,
&minimum_should_match&: &75%&
当以百分比的形式指定时,minimum_should_match会完成剩下的工作:在上面拥有3个词条的例子中,75%会被向下舍入到66.6%,即3个词条中的2个。无论你输入的是什么,至少有2个词条被匹配时,该文档才会被算作最终结果中的一员。
minimum_should_match参数非常灵活,根据用户输入的词条的数量,可以适用不同的规则。具体可以参考。
为了更好地了解match查询是如何处理多词查询的,我们需要看看bool查询是如何合并多个查询的。
合并查询(Combining Queries)
在中我们讨论了使用bool过滤器来合并多个过滤器以实现and,or和not逻辑。bool查询也做了类似的事,但有一个显著的不同。
过滤器做出一个二元的决定:这份文档是否应该被包含在结果列表中?而查询,则更加微妙。它们不仅要决定是否包含一份文档,还需要决定这份文档有多相关。
和过滤器类似,bool查询通过must,must_not以及should参数来接受多个查询。比如:
GET /my_index/my_type/_search
&query&: {
{ &match&: { &title&: &quick& }},
&must_not&: { &match&: { &title&: &lazy&
&should&: [
{ &match&: { &title&: &brown& }},
{ &match&: { &title&: &dog&
title字段中含有词条quick,且不含有词条lazy的任何文档都会被作为结果返回。目前为止,它的工作方式和bool过滤器十分相似。
差别来自于两个should语句,它表达了这种意思:一份文档不被要求需要含有词条brown或者dog,但是如果它含有了,那么它的相关度应该更高。
&_source&: {
&title&: &The quick brown fox jumps over the quick dog&
0.3312608,
&_source&: {
&title&: &The quick brown fox&
文档3的分值更高因为它包含了brown以及dog。
分值计算(Score
Calculation)
bool查询通过将匹配的must和should语句的_score相加,然后除以must和should语句的总数来得到相关度分值_score。
must_not语句不会影响分值;它们唯一的目的是将不需要的文档排除在外。
控制精度(Controlling
Precision)
所有的must语句都需要匹配,而所有的must_not语句都不能匹配,但是should语句需要匹配多少个呢?默认情况下,should语句一个都不要求匹配,只有一个特例:如果查询中没有must语句,那么至少要匹配一个should语句。
正如我们可以,我们也能够通过minimum_should_match参数来控制should语句需要匹配的数量,该参数可以是一个绝对数值或者一个百分比:
GET /my_index/my_type/_search
&query&: {
&should&: [
{ &match&: { &title&: &brown& }},
{ &match&: { &title&: &fox&
{ &match&: { &title&: &dog&
&minimum_should_match&: 2
以上查询的而结果仅包含以下文档:
title字段包含:&&brown&
AND &fox&&或者&&brown& AND &dog&&或者&&fox&
如果一份文档含有所有三个词条,那么它会被认为更相关。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1916920次
积分:14065
积分:14065
排名:第886名
原创:145篇
译文:44篇
评论:304条
(5)(1)(1)(1)(2)(2)(1)(2)(2)(5)(10)(8)(4)(3)(1)(2)(1)(3)(3)(1)(3)(1)(7)(25)(29)(22)(25)(4)(1)(7)(1)(2)(5)使用java访问elasticsearch创建索引 -
- ITeye博客
博客分类:
1、添加maven依赖
&dependency&
&groupId&org.elasticsearch&/groupId&
&artifactId&elasticsearch&/artifactId&
&version&0.90.0&/version&
&/dependency&
建议使用maven管理项目,因为elasticsearch还有很多依赖包,手工维护很麻烦
2、创建连接elasticsearch服务的client
Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.sniff", true).put("cluster.name", "name of node").build();
Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress("ip of server", 9300));
3、创建索引
elasticsearch的java客户端,支持多种方式构建索引数据,这里有两种方式的代码示例:使用jsonbuilder构建数据
IndexResponse response = client.prepareIndex("comment_index", "comment_ugc", "comment_123674")
.setSource( XContentFactory.jsonBuilder()
.startObject()
.field("author", "569874")
.field("author_name", "riching")
.field("mark", 232)
.field("body", "北京不错,但是人太多了")
.field("createDate", "20")
.field("valid", true)
.endObject())
.setTTL(8000)
.execute().actionGet();
System.out.println(response.getId());
另外一种,是把数据构造成json串,直接传给client
Student student = new Student(, 20, "riching", "beijing");
String jsonValue = mapper.writeValueAsString(student);
response = client.prepareIndex("student_index", "student_info", "stu_").setSource(jsonValue).execute().actionGet();
System.out.println(response.getId());
实际应用中应该是下面一种更方便,可以把需要索引的对象直接扔过去了
4、根据id获取数据
GetResponse responseGet = client.prepareGet("comment_index", "comment_ugc",
"comment_123674").execute().actionGet();
System.out.println(responseGet.getSourceAsString());
5、查询索引
SearchRequestBuilder builder = client.prepareSearch("comment_index").setTypes("comment_ugc").setSearchType(SearchType.DEFAULT).setFrom(0).setSize(100);
BoolQueryBuilder qb = QueryBuilders.boolQuery().must(new
QueryStringQueryBuilder("北京").field("body"))
.should(new QueryStringQueryBuilder("太多").field("body"));
builder.setQuery(qb);
SearchResponse response = builder.execute().actionGet();
System.out.println("
" + response);
System.out.println(response.getHits().getTotalHits());
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
"hits" : {
"total" : 1,
"max_score" : 0.,
"hits" : [ {
"_index" : "comment_index",
"_type" : "comment_ugc",
"_id" : "comment_123674",
"_score" : 0., "_source" : {"author":"569874","author_name":"riching","mark":232,"body":"北京不错,但是人太多了","createDate":"20","valid":true}
6、删除索引,可以根据索引id删除索引,也可以构造query进行删除,这跟lucene的api是类似的,只不过api不一样而已
DeleteResponse response = client.prepareDelete("comment_index", "comment_ugc", "comment_123674") .setOperationThreaded(false).execute().actionGet();
System.out.println(response.getId());
这个删除有个小问题,如果删除完立即进行查询还是可以查到
浏览 37145
浏览: 166962 次
来自: 北京
Session Option→选字体(新宋体)→再选Chara ...
org.wltea.analyzer.core.IKSegme ...
我的maven版本是3.2.3,也报这个错误
君诩逸尘 写道我想问下 我把.project文件改了以后项目里 ...
我想问下 我把.project文件改了以后项目里面都报错啊后使用快捷导航没有帐号?
查看: 1299|回复: 8
Elasticsearch基于JAVA语言进行查询API的示例讲解
中级会员, 积分 312, 距离下一级还需 188 积分
论坛徽章:5
1、TransportClient
The transport client allows to create a client that is not part of the cluster, but simply connects to one or more nodes directly by adding their respective addresses using addTransportAddress(mon.transport.TransportAddress).
addTransportAddress方法
Adds a transport address that will be used to connect to.The Node this transport address represents will be used if its possible to connect to it. If it is unavailable, it will be automatically connected to once it is up.In order to get the list of all the current connected nodes, please see connectedNodes().
从上文可知,可以为transportClient添加多个transportAddress,添加多个的目的是什么呢?
当一个es服务(对应一个transportAddress)不可用时,client会自动发现当前可用的nodes
Client client = TransportClient.builder().build()
& && && && && & .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(&192.168.9.154&), 9300));
2、例如计算AVG值
public static void avgQuery(Client client ) {
& & & & & & & & SearchResponse res =
& & & & & & & & AvgBuilder agg = AggregationBuilders
& & & & & & & & & & & & & & & & .avg(&avg_num&)
& & & & & & & & & & & & & & & & .field(&like&);////设置聚合函数条件
& & & & & & & &
& & & & & & & & res = client.prepareSearch(&search_test&) //prepareSearch 设置查询的索引
& & & & & & & & & & & & & & & & .setTypes(&article&)& && && && && && && && && && && && &//设置查询的types& &
& & & & & & & & & & & & & & & & .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) //设置查询的SearchType
& & & & & & & & & & & & & & & & .addAggregation(agg) //设置聚合函数
& & & & & & & & & & & & & & & & .setFrom(0) //设置取值开始值
& & & & & & & & & & & & & & & & .setSize(10) //设置取值结束值
& & & & & & & & & & & & & & & & .execute().actionGet(); //执行聚合函数
& & & & & & & & System.out.println(res); //输出结果
& & & & & & & &
& & & & & & & & // on shutdown
& & & & & & & & client.close();
& & & & }复制代码3、client.close(); /关闭socket客户端。
中级会员, 积分 312, 距离下一级还需 188 积分
论坛徽章:5
JAVA语言进行查询API的讲解
16:13 上传
点击文件名下载附件
JAVA语言进行查询API的讲解
中级会员, 积分 312, 距离下一级还需 188 积分
论坛徽章:5
match queries没有“query parsing”的过程,field不支持通配符,前缀等高级特性,只是参照指定的文本进行analysis,执行query,因此失败几率极小,适合search-box。
public static void matchQuery(Client client ) {
& & & & & & & & SearchResponse res =
& & & & & & & & QueryBuilder qb = QueryBuilders.matchQuery(&title&, &article&);
& & & & & & & &
& & & & & & & & res = client.prepareSearch(&search_test&)
& & & & & & & & & & & & & & & & .setTypes(&article&)
& & & & & & & & & & & & & & & & .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
& & & & & & & & & & & & & & & & .setQuery(qb)
& & & & & & & & & & & & & & & & .setFrom(0)
& & & & & & & & & & & & & & & & .setSize(10)
& & & & & & & & & & & & & & & & .execute().actionGet();
& & & & & & & & for (SearchHit hit: res.getHits().getHits()){
& & & & & & & & & & & & System.out.println(hit.getSourceAsString());
& & & & & & & & }
& & & & & & & &
& & & & & & & & // on shutdown
& & & & & & & & client.close();
中级会员, 积分 312, 距离下一级还需 188 积分
论坛徽章:5
3-3、multiMatchQuery分别执行为单个field的match的查询。因此最终_score值的计算规则各异。fields可指定执行需要查询的字段,field可以支持通配符等高级特性(matchquery是不支持的),field可支持(^)指定各个field的boost权重types可指定以下值,区分不同的查询行为:best _fields:_score决定于得分最高的match-clause。field-centricmost_fields:所有match-clause都会考虑在内。field-centriccross-fields:把fileds当做一个big-fields。term-centricphase and phase-prefix:每个field执行相应的query,combine thescore以上都有具体的应用场景和详细的计算规则public static void multiMatchQuery(Client client ) {
& && &&&SearchResponse res =
& && &&&QueryBuilder qb = QueryBuilders
& && && && && & .multiMatchQuery(&article&,&title&, &body&);
& && &&&res = client.prepareSearch(&search_test&)
& && && && && & .setTypes(&article&)
& && && && && & .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
& && && && && & .setQuery(qb)
& && && && && & .setFrom(0)
& && && && && & .setSize(10)
& && && && && & .execute().actionGet();
& && &&&for (SearchHit hit: res.getHits().getHits()) {
& && && && &System.out.println(hit.getSourceAsString());
& && &&&// on shutdown
& && &&&client.close();
中级会员, 积分 312, 距离下一级还需 188 积分
论坛徽章:5
commonTermQuery
一种略高级的查询,充分考虑了stop-word的低优先级,提高了查询精确性。
将terms分为了两种:more-importent(low-frequency) and less important(high-frequency)。less-important比如stop-words,eg:the and。
分组标准由cutoff_frequence决定。两组query构成bool query。must应用于low_frequence,should应用high_frequence。
每一组内部都可以指定operator和mini_should_match。
如果group后只有一组,则默认退化为单组的子查询。
query执行中首先match到more-import这一组的doc,然后在这个基础上去match less-import,并且计算只计算match到的score。保证了效率,也充分考虑了relevance。public static void commonTermQuery(Client client ) {
& & & & & & & & SearchResponse res =
& & & & & & & & QueryBuilder qb = QueryBuilders
& & & & & & & & & & & & & & & & .commonTermsQuery(&title&,&article&);
& & & & & & & &
& & & & & & & & res = client.prepareSearch(&search_test&)
& & & & & & & & & & & & & & & & .setTypes(&article&)
& & & & & & & & & & & & & & & & .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
& & & & & & & & & & & & & & & & .setQuery(qb)
& & & & & & & & & & & & & & & & .setFrom(0)
& & & & & & & & & & & & & & & & .setSize(10)
& & & & & & & & & & & & & & & & .execute().actionGet();
& & & & & & & & for (SearchHit hit: res.getHits().getHits()) {
& & & & & & & & & & & & System.out.println(hit.getSourceAsString());
& & & & & & & & }
& & & & & & & &
& & & & & & & & // on shutdown
& & & & & & & & client.close();
& & & & & & & &
& & & & & & & & //common terms query
& & & & }复制代码
高级会员, 积分 506, 距离下一级还需 494 积分
论坛徽章:4
楼主整理了这么多的资料,真是有心人,学习了,多谢楼主。代码格式不错。
论坛徽章:94
感谢楼主分享,这是楼主原创吗?
金牌会员, 积分 1574, 距离下一级还需 1426 积分
论坛徽章:21
Elasticsearch基于JAVA语言进行查询API的示例讲解,真心感到荣幸,不错的案例讲解。学习一下
高级会员, 积分 624, 距离下一级还需 376 积分
论坛徽章:5
例子不错,可用于参考实现的。
扫一扫加入本版微信群

我要回帖

更多关于 elasticsearch client 的文章

 

随机推荐