本章主要讲解一种添加和三种查找功能,我们分别以代码形式进行讲解,欢迎各位积极讨论。
首先,应用java导包是必须的,我们创建maven项目后,在pom.xml文件中,进行导包。所需要包可在maven elasticsearch官网查询。
<dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.3.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> </dependencies>
导包完成后,即可进行下面的步骤。
1.ES文本内容的添加jsonBuilder()
2.ES文本内容查找:
(1)全文查询:SearchResponse-preparesearch
(2)模糊查询:QueryBuilders()
(3)聚合查询:AggregationBuilders()
下面开始代码讲解:
1.文本添加
import... import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; public class Demol4 { public static void main(String[] args) throws Exception { TransportClient client=new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) ; XContentBuilder builder = jsonBuilder() .startObject() .field("first_name", "gou gou") .field("last_name","smith") .field("about", "trying out Elasticsearch") .field("interests","music,act") .endObject(); IndexResponse response=client.prepareIndex("megacorp","employee").setSource(builder).get(); System.out.println(response); client.close(); } }
在一个main方法中,我们首先需要用TransportClient的子类PreBuiltTransportClient去连接我们的elasticsearch,注意java连接es的端口号是9300。治理这里是以new对象的形式进行使用,并设置为空,通过IP地址添加新的连接。
文本添加的jsonBuilder是以对象的开始(startObject)和结束(endObject)为标志,在其中以属性field的方式添加。其中添加的需要有name和value。内容填写完毕后,需要增加到elasticsearch中,使用索引IndexResponse类型的prepareIndex方法,参数为地址索引和类型索引,将文件添加是setSource(对象).get()。
这样就将文件添加到了elasticsearch中,并可以查询了。
2.全文查询
public class Demol1 { public static void main(String[]args)throws Exception{ TransportClient client=new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) ; SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").get(); System.out.print(response); SearchHit[] hits=response.getHits().getHits(); for(SearchHit sh:hits){ System.out.println(); Map<String,Object> data=sh.getSourceAsMap(); String full_name=data.get("first_name")+"."+data.get("last_name"); String age=data.get("age").toString(); String about=data.get("about").toString(); List<String> interests= (List<String>) data.get("interests"); System.out.println(full_name+" "+age+" "+about); for(String like:interests){ System.out.println(like); } System.out.println("---------------"); } client.close(); } }
l连接部分不再赘述,查找内容,首先需要用SearchResponse类型的prepareSearch()方法找到相应的类型文档,以get()方法获取。获取的内容以数组形式SearchHit【】存储在hits中。通过getHist方法的重复使用,直接得到属性处的文本内容。
对文本内容进行迭代输出,并以Map的形式接收,应用getSourceAsMap()方法。声明变量为得到的属性对应值,数组形式的变量以List<>数组形式接收并迭代输出。最终得到所有文本中,关于定义变量的属性对应的内容。
3.模糊查询
public class Demol3 { public static void main(String[] args) throws Exception { TransportClient client=new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) ; SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").setQuery( QueryBuilders.termsQuery("last_name","smith") //单条信息的查询,不适合在聚合情况下的查询,需要知道vlaue包含的值 ).get(); System.out.println(response); client.close(); } }
模糊查询的应用一样也是get()方法获取,不同的是,需要中间加入setQuery方法,并应用QueryBuilders.termsQuery()方法获取模糊查询的内容。其中需要知道属性以及属性内包含的值。然后可以直接输出。
4.聚合查询
public class Demol2 { public static void main(String[] args) throws Exception { TransportClient client=new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300)) ; SearchResponse response=client.prepareSearch("megacorp").setTypes("employee").addAggregation( AggregationBuilders.terms("all_interests").field("interests").subAggregation( AggregationBuilders.avg("avg_age").field("age") ) ).execute().actionGet(); System.out.println(response); client.close(); } }
与模糊查询类似,只是方法需要改变,聚合查询的方法是通过添加聚合addAggregation()方法,并用AggregationBuilders方法,对聚合内部的属性进行查找,聚合属性可能是terms,也可能是avg,这要根据文档查询内容进行匹配。不同的是,聚合查找的属性值通过terms或avg确定后,属性值需要通过field方法进行跟进。
对于嵌套式的聚合内容,执行在后面继续增加subAggregation方法,内部写法均类似。大多数聚合一般为两层最深,如果遇到更深层次的聚合,套用即可。
说一下,这里的execute().actionnGet()=get(),内部可以做参数的配置,包括等待时间time等。最后记得关闭连接的client。