目前市面上有两类客户端
◼ 一类是 TransportClient 为代表的 ES 原生客户端,不能执行原生 DSL 语句必须使
用它的 Java api 方法。
◼ 一类是以 Rest ApI 为主的 client,最典型的就是 jest。 这种客户端可以直接使用
DSL 语句拼成的字符串,直接传给服务端,然后返回 json 字符串再解析。
两种方式各有优劣,但是最近 ElasticSearch 官网,宣布计划在 7.0 以后的版本中废除 TransportClient, 以 RestClient 为主。
1、向编写建立程序到 ES 的连接的代码
object MyESUtil {
private var jestFactory : JestClientFactory = null
def build() = {
jestFactory = new JestClientFactory
jestFactory.setHttpClientConfig(
new HttpClientConfig.Builder("http://centos01:9200")
.multiThreaded(true)
.maxTotalConnection(20)
.connTimeout(10000)
.readTimeout(1000)
.build() )
}
def getClient:JestClient = {
if(jestFactory == null){
build()
}
jestFactory.getObject
}
}
2、插入单条数据
(1)直接传入json字符串插入单条数据
/**
* 直接传入json字符串
*/
def putIndex() = {
// 建立连接
val client: JestClient = getClient
//
val source =
"""
|{
| "id":400,
| "name":"operation meigong river 2",
| "doubanScore":8.8,
| "actorList":[
| {
| "id":4,
| "name":"zhang han yu"
| }
| ]
|}
|""".stripMargin //可以封装为样例类
val index: Index = new Index.Builder(source)
.index("movie_index")
.`type`("movie")
.id("4")
.build()
client.execute(index)
//关闭连接
client.close()
}
(2)封装为样例类插入单条数据
case class Movie(id:String ,
movie_name:String,
actorNameList: java.util.List[String]
){}
//向 ES 中插入数据
def putIndex(): Unit ={
//建立连接
val jest: JestClient = getClient
//Builder 中的参数,底层会转换为 Json 格式字符串,所以我们这里封装 Document 为样例类
val actorNameList = new util.ArrayList[String]()
actorNameList.add("zhangsan")
val index: Index = new Index.Builder(Movie("100","天龙八部",actorNameList))
.index("movie_index_5")
.`type`("movie")
.id("1")
.build()
//execute 的参数类型为 Action, Action 是接口类型,不同的操作有不同的实现类,添加的实现类为 Index
jest.execute(index)
//关闭连接
jest.close()
}
3、查询单条数据
/**
* 通过id进行单条查询
*/
def getIndexById() = {
val client: JestClient = getClient
val get: Get = new Get.Builder("movie_index", "3").build()
val result: DocumentResult = client.execute(get)
print(result.getJsonString)
client.close()
}
4、查询多条文档内容
(1)直接传入json字符串
/**
* 根据多个条件查询多条文档内容
*/
def getIndex() ={
val client: JestClient = getClient
val query:String =
"""
|{
| "query":{
| "bool":{
| "must":[ // 必须包含
| {
| "match":{
| "name":"operation"
| }
| }
| ],
| "filter":[
| {
| "term":{
| "actorList.name.keyword":"zhang han yu" // 精准匹配
| }
| }
| ]
| }
| },
| "from":0,
| "size":20, // 分页查询
| "sort":[
| {
| "doubanScore":{
| "order":"desc" // 排序
| }
| }
| ]
| }
""".stripMargin
val search: Search = new Search.Builder(query)
.addIndex("movie_index")
.build()
val result: SearchResult = client.execute(search)
val list: util.List[SearchResult#Hit[util.Map[String, Any], Void]] = result.getHits(classOf[util.Map[String, Any]])
// 将Java的list转换为scala的list
import scala.collection.JavaConverters._
val list1: List[util.Map[String, Any]] = list.asScala.map(_.source).toList
for (elem <- list1) {
println(elem)
}
client.close()
}
(2)使用方法进行查询
/**
* 根据多个条件查询多条文档内容
*/
def getIndex() ={
val client: JestClient = getClient
/**
* 使用方法进行查询
*/
val builder: SearchSourceBuilder = new SearchSourceBuilder()
// 布尔匹配
val boolQueryBuilder: BoolQueryBuilder = new BoolQueryBuilder()
boolQueryBuilder.must(new MatchQueryBuilder("name","operation"))
boolQueryBuilder.filter(new TermQueryBuilder("actorList.name.keyword","zhang han yu"))
builder.query(boolQueryBuilder)
// 分页查询
builder.from(0)
builder.size(20)
// 排序
builder.sort("doubanScore",SortOrder.DESC)
val query2 = builder.toString()
println("query2 : " + query2)
val search: Search = new Search.Builder(query2)
.addIndex("movie_index")
.build()
val result: SearchResult = client.execute(search)
val list: util.List[SearchResult#Hit[util.Map[String, Any], Void]] = result.getHits(classOf[util.Map[String, Any]])
// 将Java的list转换为scala的list
import scala.collection.JavaConverters._
val list1: List[util.Map[String, Any]] = list.asScala.map(_.source).toList
for (elem <- list1) {
println(elem)
}
client.close()
}
依赖
<dependencies>
<!--Java 操作 ES 的客户端工具 Jest-->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>5.3.3</version>
</dependency>
<!--Jest 需要的依赖-->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.2</version>
</dependency>
<!--Jest 需要的依赖-->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
<version>3.0.16</version>
</dependency>
<!-- ElasticSearch 依赖 -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.6.0</version>
</dependency>
</dependencies>