【注意】最后更新于 December 10, 2019,文中内容可能已过时,请谨慎使用。
关于es的一些笔记
安装
1
2
3
|
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
docker-compose up
|
遇到过的问题
unable to authenticate user
终端访问:
1
|
curl -XGET 'localhost:9200/_cat/health?v&pretty'
|
如果出现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"error": {
"root_cause": [
{
"type": "security_exception",
"reason": "unable to authenticate user [elasticd] for REST request [/_cat/health]",
"header": {
"WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
}
}
],
"type": "security_exception",
"reason": "unable to authenticate user [elasticd] for REST request [/_cat/health]",
"header": {
"WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
}
},
"status": 401
}
|
则需要带上 authenticate
信息
1
|
curl --user elastic:changeme -XGET 'localhost:9200/_cat/health?v&pretty'
|
docker安装 IK 中文分词器
如果在 dockerfile
中直接写
1
|
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${ES_VERSION}/elasticsearch-analysis-ik-${ES_VERSION}.zip
|
因为安装的时候需要交互, 在 docker build
的时候会出现unable to read from standard input; is standard input open and a tty attached?
以下是dockerfile成功安装示例:
1
2
3
4
5
6
7
8
9
10
11
|
ARG ELK_VERSION
# https://github.com/elastic/elasticsearch-docker
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu
ENV ES_VERSION 7.4.1
RUN sh -c '/bin/echo -e "y" | elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${ES_VERSION}/elasticsearch-analysis-ik-${ES_VERSION}.zip'
|
查询语句
should和bool的区别
官方示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "War and Peace" }},
{ "match": { "author": "Leo Tolstoy" }},
{ "bool": {
"should": [
{ "match": { "translator": "Constance Garnett" }},
{ "match": { "translator": "Louise Maude" }}
]
}}
]
}
}
}
|
should
把所有match到的score相加, 最终得到一个综合评分, hits 就按这个评分从高到低排列
bool
的运行逻辑是:
- 执行 should 语句中的两个查询。
- 加和两个查询的评分。
- 乘以匹配语句的总数。
- 除以所有语句总数。
dis_max
用法类似 OR
, 将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回
这两条match中,只要有一条符合就会返回结果
1
2
3
4
5
6
7
8
9
10
|
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
|
tie_breaker 参数
dis_max 的特性是符合一条 就会返回结果, 会对结果产生偏差
tie_breaker 参数提供了一种 dis_max 和 bool 之间的折中选择, 它的评分方式是:
- 获得最佳匹配语句的评分 _score 。
- 将其他匹配语句的评分结果与 tie_breaker 相乘。
- 对以上评分求和并规范化。
参数在 0~1之间波动
1
2
3
4
5
6
7
8
9
10
11
|
{
"query": {
"dis_max": {
"queries": [
{ "match": { "intro": "鼻部" }},
{ "match": { "intro": "外科硕士" }}
],
"tie_breaker": 0.3
}
}
}
|
multi_match 查询
dis_match
的另一种简化写法就是 multi_match
了
示例:
1
2
3
4
5
6
7
8
9
10
11
|
{
"query": {
"multi_match": {
"query": "北京",
"type": "best_fields",
"fields": [ "hospital_name", "intro","city" ],
"tie_breaker": 0.3,
"minimum_should_match": "30%"
}
}
}
|
可以使用模糊字段查找
示例:
1
2
3
4
5
6
7
8
|
{
"query": {
"multi_match": {
"query": "北京",
"fields": [ "hospital_*"],
}
}
}
|
可以使用 ^ 字符语法为单个字段提升权重,在字段名称的末尾添加 ^boost ,其中 boost 是一个浮点数:
示例:
1
2
3
4
5
6
7
8
|
{
"query": {
"multi_match": {
"query": "北京",
"fields": [ "*_title", "chapter_title^2" ]
}
}
}
|
默认是 ^1
文章作者
GPF
上次更新
2019-12-10
(77997d9)