Elasticsearch Nested 类型动态数据的组合查询
背景
Nested 类型的数据不多说了,
先看 mapping:
1 | "metaArray": { |
再看数据:
1 | { |
目的
想查作者是 Joy 并且文件类型是 txt 的记录
方式
使用 nestedQuery + queryStringQuery
语句:
1 | { |
代码:
1 | String key = xxxx |
Nested 类型的数据不多说了,
先看 mapping:
1 | "metaArray": { |
再看数据:
1 | { |
想查作者是 Joy 并且文件类型是 txt 的记录
使用 nestedQuery + queryStringQuery
语句:
1 | { |
代码:
1 | String key = xxxx |
之前一直用我弟弟的学生证申请的 license,可惜今年毕业了,无法在续费申请了
早期已经听说 JetBrains 可以使用自己的开源项目进行申请免费的 license
正好使用我的这个博客来申请一波
Take me to my license(s)
Active subscriptions
, 激活,在点击 Assign
分配使用我这里因为之前使用 QQ 邮箱创建过 JetBrains 的账号,这次不想使用新的邮箱再次创建账号
于是在第四步点击 Take me to my license(s)
后,我选择授权其他邮箱,填写邮箱地址,之后你的邮箱会收到邮件,点击接受授权的链接
之后的操作都一致了,成功使用我原来的邮箱获取到了 license.
个人理解:${}
: 用于加载外部文件中指定key的值#{}
: 功能更强大的SpEl表达式,将内容赋值给属性#{…}
和 ${…}
可以混合使用,但是必须#{}
外面,${}在里面,#{ ‘${}’ } ,注意单引号,注意不能反过来
springboot 和 elasticsearch 的整合包里有一个注解
@Document(indexName = “”, type = “”)
indexName 和 type 都是字符串
这个注解写在实体类上,代表该实体类是一个索引
现在, indexName 和 type 不能为固定写死,需要从配置文件读取,
于是想到了 spring 的 el 表达式
使用
@Document(indexName = “${xxxx}”, type = “${xxxx}”)
启动后
无效,spring 直接将其解析成了字符串
于是,查看 @Document 这个注解实现的源码
在这个包中 org.springframework.data.elasticsearch.core.mapping 找到了实现类 SimpleElasticsearchPersistentEntity
其中
1 | public SimpleElasticsearchPersistentEntity(TypeInformation<T> typeInformation) { |
我们看到了 SpelExpressionParser
和 ParserContext.TEMPLATE_EXPRESSION
那么这里就很肯定 indexName 和 type 是支持 spel 的写法了,只是怎么写,暂时不知道
再看
ParserContext.TEMPLATE_EXPRESSION 的源码是
1 | /** |
看到上面的注释,知道是使用 #{}
接着
新建一个类,使用 @Configuration 和 @ConfigurationProperties(prefix = “xxx”) 注册一个 bean
再在实体类上加上注解 @Component 也注册一个bean
之后就可以使用 #{bean.indexName} 来读取到配置属性了
有时候我们会在注解中使用 SPEL 表达式来读取配置文件中的指定值, 一般会使用类似于 【${xxx.xxx.xxx}】这样来使用
如果在代码中手动解析该表达式的值,可以使用 Environment 的以下方法
environment.resolvePlaceholders(cidSpel)
或者 environment.resolveRequiredPlaceholders(cidSpel)
docker 容器启动, 通过 docker logs -f container 可以实时查看日志
但是控制台输出的日志太多,会怎么样,容器里控制台输出的日志在宿主机什么位置?
有时容器输出太多,运行时间长了后,会把磁盘撑满…
docker 里容器的日志都属于标准输出(stdout)
每个 container 都是一个特殊的进程,由 docker daemon 创建并启动,docker daemon 来守护和管理
docker daemon 有一个默认的日志驱动程序,默认为json-file
json-file 会把所有容器的标准输出和标准错误以json格式写入文件中,这个文件每行记录一个标准输出或标准错误并用时间戳注释
vim /etc/docker/daemon.json
增加一条:{“log-driver”: “none”} (也可以添加{“log-opts”: {“max-size”: “10m” }} 来控制log文件的大小)
重新加载配置文件并重启docker服务: systemctl daemon-reload
1 | logging: |
这样就不需要修改 daemon.json 配置文件了
pm2 start app.js --node-args="--harmony"
"node_args" : "--harmony"
require("babel-register");
1 | { |
这里需要注意:
cluster
, instances 为实例数, max 为 CPU 的核心数,1 | "babel": { |
npm install
有 2 种方法可配置
./node_modules/.bin/babel-node app.js
require("babel-register");
在gradle4.7以后对于加入依赖lombok方式发生变化,gradle4.7版本以前,可以直接如下引用:
1 | compile("org.projectlombok:lombok:1.18.2")或者compileOnly("org.projectlombok:lombok:1.18.2") |
在gradle5.0这种方式会产生警告,在gradle5.0里面会直接报编译错误
有 2 中解决方式:
开发依赖:
1 | annotationProcessor 'org.projectlombok:lombok:1.18.2' |
测试依赖:
1 | testAnnotationProcessor 'org.projectlombok:lombok:1.18.2' |
1 | repositories { |
错误信息:
1 | Errors occurred while build effective model from /Users/joylau/.gradle/caches/modules-2/files-2.1/log4j/log4j/1.2.16/88efb1b8d3d993fe339e9e2b201c75eed57d4c65/log4j-1.2.16.pom: |
这是因为 Log4J 1.2.16 的 pom 中存在一个Bug。1.2.16 已经在 2010 年停止更新了
可以通过声明对 log4j:log4j:1.2.17 的显式依赖
或通过依赖关系管理确保使用 1.2.17 来解决
1 | implementation("log4j:log4j:1.2.17") |