search(5)- elastic4s-构建索引
按照计划,这篇开始尝试用elastic4s来做一系列索引管理和搜索操作示范。前面提过,elastic4s的主要功能之一是通过组合Dsl语句形成json请求。那么我们先试试组合一些Dsl语句,再想办法产生出json请求文本,然后在kibana控制台中验证它的正确性。
首先看看elastic4s提供的一个show函数:
def show(implicit handler: Handler[T, _]): String = Show[ElasticRequest].show(handler.build(t))
又见到了这个Handler[T, _],作为show的一个隐式参数。前面说过这个Handler[T, _]是个代表构建T类型json请求的typeclass。具体构建函数就是上面的这个build(t)函数。我们先看看CreateIndexRequest类型的show函数示范:
val jsCreate = createIndex("company")
.shards().replicas().show
println(jsCreate)
产生了json如下:
PUT:/company?
StringEntity({"settings":{"index":{"number_of_shards":,"number_of_replicas":}}},Some(application/json))
在kibana里是如下表达的:
PUT /company
{
"settings":{
"index":{
"number_of_shards":,
"number_of_replicas":
}
}
}
可能是历史原因吧,elastic4s与ES7.6还有很多不兼容的地方,或者说是elastic4s还有许多没来得及更新的地方。具体有问题的语句或参数都可以通过把json body放在kibana里进行验证,如果elastic4s还有地方没有完成覆盖ES7.6功能的话,我们可以把一个正确的ES7.6 json脚本直接通过source传人到操作类型中去:
val js =
"""
|{
| "settings":{
| "index":{
| "number_of_shards":,
| "number_of_replicas":
| }
| }
|}
|""".stripMargin
val createFromJs = (createIndex("company").source(js)).show
println(createFromJs)
下面的例子是一套完整的索引创建过程:先删除同名称索引、创建索引、构建mapping:
import com.sksamuel.elastic4s.ElasticClient
import com.sksamuel.elastic4s.akka._
import akka.actor._
import com.sksamuel.elastic4s.requests.mappings.{KeywordField, MappingDefinition, NestedField, SearchAsYouTypeField}
import scala.concurrent.ExecutionContext.Implicits.global object Lesson03 extends App { import com.sksamuel.elastic4s.ElasticDsl._
//akka客户端
private implicit lazy val system: ActorSystem = ActorSystem()
val akkaClient = AkkaHttpClient(AkkaHttpClientSettings(List("localhost:9200")))
val client = ElasticClient(akkaClient)
//删除索引
val idxDelete = client.execute(deleteIndex("company")).await
//构建索引
val idxCreate = client.execute(createIndex("company")
.shards().replicas()).await
//创建表结构
if(idxCreate.isSuccess) {
val compMapping = client.execute(
putMapping("company").fields(
KeywordField("code"),
SearchAsYouTypeField("name")
.fielddata(true)
.fields(KeywordField("keyword")),
textField("biztype"),
NestedField("addr").fields(
textField("district"),
textField("address"),
KeywordField("zipcode")
),
dateField("regdate")
.ignoreMalformed(true)
.format("strict_date_optional_time||epoch_millis"),
textField("contact")
)).await
if(compMapping.isSuccess)
println(s"mapping successfully created.")
else
println(s"mapping creation error: ${compMapping.error.reason}")
} else {
println(s"index creation error: ${idxCreate.error.reason}")
} system.terminate()
client.close()
}
以上代码有几个地方值得提一下:
1、这上面使用了一个基于akka-stream的客户端。优点是响应式标准兼容,用队列queue来缓冲密集请求
2、在删除索引前为甚么不先检查一下同名索引是否存在?elastic4s ExistApi还是ES7以前版本,不能用
3、client.execute(...)返回Future, 为什么不用for-yield?试过了,一是deleteIndex,createIndex返回结果与实际删除、构建操作可能有些延迟,createIndex会返回索引已经存在错误, mapping会出现索引不存在错误。
search(5)- elastic4s-构建索引的更多相关文章
- 构建NCBI本地BLAST数据库 (NR NT等) | blastx/diamond使用方法 | blast构建索引 | makeblastdb
参考链接: FTP README 如何下载 NCBI NR NT数据库? 下载blast:ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+ 先了解 ...
- 【Lucene】Apache Lucene全文检索引擎架构之构建索引2
上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...
- 如何使用Spark大规模并行构建索引
使用Spark构建索引非常简单,因为spark提供了更高级的抽象rdd分布式弹性数据集,相比以前的使用Hadoop的MapReduce来构建大规模索引,Spark具有更灵活的api操作,性能更高,语法 ...
- 【Lucene实验1】构建索引
一.实验名称:构建索引 二.实验日期:2013/9/21 三.实验目的: 1) 能理解Lucene中的Document-Field结构的数据建模过程: 2) 能编针对特定数 ...
- 如何提高Lucene构建索引的速度
如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...
- Xapian构建索引说明
Reference: http://www.totogoo.com/article/115/xapian-desc.html Xapian与开源 Xapian的官方网站是http://www.xapi ...
- Lucene实战构建索引
搭建lucene的步骤这里就不详细介绍了,无外乎就是下载相关jar包,在eclipse中新建java工程,引入相关的jar包即可 本文主要在没有剖析lucene的源码之前实战一下,通过实战来促进研究 ...
- Lucene构建索引时的一些概念和索引构建的过程
在搜索文档内容之前要做的事情就是对从各种不同来源(网页,数据库,电子邮件等)的文档进行索引,索引的过程就是对内容进行提取,规范化(通过对内容进行建模来实现),然后存储. 在索引的过程中有几个基本的概念 ...
- Elastic Search Java Api 创建索引结构,添加索引
创建TCP客户端 Client client = new TransportClient() .addTransportAddress(new InetSocketTransportAddress( ...
- [leetcode]109. Convert Sorted List to Binary Search Tree链表构建二叉搜索树
二叉树的各种遍历方式都是可以建立二叉树的,例如中序遍历,就是在第一步建立左子树,中间第二步建立新的节点,第三步构建右子树 此题利用二叉搜索树的中序遍历是递增序列的特点,而链表正好就是递增序列,从左子树 ...
随机推荐
- Spring框架——AOP
Spring AOP 面向切面编程,OOP面向对象编程,将程序中所有参与模块都抽象成对象,然后通过对象之间的相互调用完成需求. AOP是OOP的一种补充,是在另外一个维度上抽象出对象,具体是指程序运行 ...
- 阿里云服务器安装Docker
在阿里云服务器上安装Docker,服务器的系统是CentOS 7.6, 所以可以看官方Docker安装文档:https://docs.docker.com/install/linux/docker-c ...
- angualrjs 总结 随记(一)
$apply方法的作用 $apply方法是用来触发脏检查,它在控制器里监听一个变量,每当这个变量的值改变的时候,它会去与最初的值做一次比较,然后HTML页面就会及时更新该变量的值(将最新的值赋值到ht ...
- Python-函数练习题1
# coding=utf-8 '''定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错, 并且返回一个偶数列表:(注:列表里面的元素为偶数).'' ...
- C语言结构体实现类似C++的构造函数
其主要依靠函数指针来实现,具体看代码吧~ #include <stdio.h> #include <stdlib.h> #include <string.h> ty ...
- Spring04——Spring MVC 全解析
前文分别介绍了 Spring IOC 与 Spring AOP 的相关知识,本文将为各位大概带来 Spring MVC 的知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 J ...
- POJ 1062 昂贵的聘礼 最短路+超级源点
Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...
- SQL Server中创建sde数据库
在ArcCatalog或者ArcMap中打开ArcToolBox工具箱. 在工具箱中,找到创建企业级地理数据库工具,依次为数据管理工具→地理数据库管理→创建企业级地理数据库,如图所示. 双击打开创建企 ...
- spring-cloud-gateway动态路由
概述 线上项目发布一般有以下几种方案: 停机发布 蓝绿部署 滚动部署 灰度发布 停机发布 这种发布一般在夜里或者进行大版本升级的时候发布,因为需要停机,所以现在大家都在研究 Devops 方案. 蓝绿 ...
- Codeforces 1322C - Instant Noodles(数学)
题目链接 题意 给出一个二分图, 两边各 n 个点, 共 m 条边, n, m ≤ 5e5. 右边的点具有权值 \(c_i\), 对于一个只包含左边的点的点集 S, 定义 N(S) 为所有与这个点集相 ...