关于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 之间的折中选择, 它的评分方式是:

  1. 获得最佳匹配语句的评分 _score 。
  2. 将其他匹配语句的评分结果与 tie_breaker 相乘。
  3. 对以上评分求和并规范化。

参数在 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