ElasticSerach(四)
今天主要介绍ES API
1、准备工作
1.1、创建 maven 工程引入依赖
<!--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> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.11.0</version> </dependency>
1.2、编写方法获取 jest 连接
//声明 jest 客户端工厂 private var jestFactory: JestClientFactory = null; def build() = { jestFactory = new JestClientFactory jestFactory.setHttpClientConfig(new HttpClientConfig .Builder("http://hadoop201:9200") //ES 连接地址 .multiThreaded(true) //开启多线程处理 .maxTotalConnection(200) //对大连接数 .connTimeout(10000) //链接等待时间 .readTimeout(10000) //操作等待时间 .build() ) } //获取客户端 def getJestClient(): JestClient = { //如果连接工厂为空,调用 build() 创建工厂,否则直接返回对象 if (jestFactory == null) { //创建客户端工厂对象 build(); } jestFactory.getObject }
2、ES 插入数据
2.1、方式1 直接使用插入语句进行插入
// ES 插入数据 方式一 def putIndex() = { //获取客户端链接 val client: JestClient = getJestClient() //定义执行的 source val source: String = """{ | "id":101, | "name":"peration meigong river", | "doubanScore": 8.1, | "actorList": | [ | {"id":1, | "name":"liu yi fei" | }] |}""".stripMargin //创建插入的index,Bulider 的参数表示要插入的文档对象,底层会转换为 JSON 对象,也可以传入封装后的眼里类对象 val index: Index = new Index.Builder(source) .index("movie_index") .`type`("movie") .id("4") .build() //使用客户端对象操作ES,execute 的参数是 Action 类型,Index 是 Action 的实现类 client.execute(index) //关闭链接 client.close() }
2.2、方式2 封装眼里类对象进行插入
定义样例类
//定义样例类 case class Movie(id: Long, name: String, doubanScore: Float, actorList: util.List[util.Map[String, Object]]) {
实现插入
// ES 插入数据 方式二,封装眼里类对象 插入文档 def putIndex1() = { //获取客户端链接 val client: JestClient = getJestClient() val actorList = new util.ArrayList[util.Map[String, Object]]() val actorMap = new util.HashMap[String, Object]() actorMap.put("id", "01") actorMap.put("name", "殷桃") actorList.add(actorMap) //封装成样例类对象 val movie: Movie = Movie(102, "人世间", 9.5f, actorList) //创建Action 实现类 Index val index: Index = new Index.Builder(movie) //放入样例类对象 .index("movie_index") .`type`("movie") .id("5") .build() client.execute(index) //关闭链接 client.close() }
3、查询文档
3.1、根据ID查询
// 根据ID 查询数据 def queryById() = { //获取客户端链接 val client: JestClient = getJestClient() //设置需要查询的 index & id val get: Get = new Get.Builder("movie_index", "5").build() //获取返回值对象 val result: DocumentResult = client.execute(get) //此处直接通过返回值对象的 getJsonString 方法进行输出 println(result.getJsonString) //关闭连接 client.close() }
3.2、查询多个文档 方式1
// 查询多个文档数据 方式1 def queryDos() = { //获取客户端链接 val client: JestClient = getJestClient() val query: String = """ |{ | "query": { | "match": { | "name": "人" | } | }, | "sort": [ | { | "doubanScore": { | "order": "desc" | } | } | ] |} |""".stripMargin //封装 search 对象 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 集合 import scala.collection.JavaConverters._ val list1: List[util.Map[String, Any]] = list.asScala.map(_.source).toList println(list1.mkString("\n")) //关闭连接 client.close() }
3.3、查询多个文档 方式2
// 查询多个文档数据 方式2 def queryDos1() = { //获取客户端链接 val client: JestClient = getJestClient() //用于构建查询JSONM格式字符串 val searchSourceBuilder: SearchSourceBuilder = new SearchSourceBuilder val boolQueryBuilder: BoolQueryBuilder = new BoolQueryBuilder() boolQueryBuilder.must(new MatchQueryBuilder("name", "人")) boolQueryBuilder.filter(new TermQueryBuilder("actorList.name", "殷桃")) searchSourceBuilder.query(boolQueryBuilder) searchSourceBuilder.from(0) searchSourceBuilder.size(1) searchSourceBuilder.sort("doubanScore", SortOrder.DESC) searchSourceBuilder.highlighter(new HighlightBuilder().field("name")) val query: String = searchSourceBuilder.toString() // println(query) //封装 search 对象 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 集合 import scala.collection.JavaConverters._ val list1: List[util.Map[String, Any]] = list.asScala.map(_.source).toList println(list1.mkString("\n")) //关闭连接 client.close() }