目前市面上有两类客户端
◼ 一类是 TransportClient 为代表的 ES 原生客户端,不能执行原生 DSL 语句必须使
用它的 Java api 方法。
◼ 一类是以 Rest ApI 为主的 client,最典型的就是 jest。 这种客户端可以直接使用
DSL 语句拼成的字符串,直接传给服务端,然后返回 json 字符串再解析。
两种方式各有优劣,但是最近 ElasticSearch 官网,宣布计划在 7.0 以后的版本中废除 TransportClient, 以 RestClient 为主。
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字符串插入单条数据
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、查询单条数据
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()
}
依赖
io.searchbox jest 5.3.3 net.java.dev.jna jna 4.5.2 org.codehaus.janino commons-compiler 3.0.16 org.elasticsearch elasticsearch 6.6.0



