使用java操作ElasticSearch

目前市面上有两类客户端
◼ 一类是 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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值