栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用java操作ElasticSearch

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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字符串插入单条数据

  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
        
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361577.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号