Elasticsearch
第⼆部分 总结与测验
回顾总结:搜索与算分
-
结构化搜索与⾮结构化搜索
- Term 查询和基于全⽂本 Match 搜索的区别
- 对于需要做精确匹配的字段,需要做聚合分析的字段,字段类型设置为 Keyword
-
Query Context v.s Filter Context
- Filter Context 可以避免算分,并且利⽤缓存
- Bool 查询中 Filter 和 Must Not 都属于 Filter Context
-
搜索的算分
- TF-IDF / 字段 Boosting
-
单字符串多字段查询:multi-match
- Best_Field / Most_Fields / Cross_Field
-
提⾼搜索的相关性
- 多语⾔:设置⼦字段和不同的分词器提升搜索的效果
- Search Template 分离代码逻辑和搜索 DSL
- 多测试,监控及分析⽤户的搜索语句和搜索效果
回顾总结:聚合 / 分⻚
- 聚合
- Bucket / Metric / Pipeline
- 分⻚
- From & Size / Search After / Scroll API
- 要避免深度分⻚,对于数据导出等操作,可以使⽤ Scroll API
回顾总结:Elasticsearch 的分布式模型
- ⽂档的分布式存储
- ⽂档通过 hash 算法, route 并存储到相应的分⽚ - 分⽚及其内部的⼯作机制
- Segment / Transaction Log / Refresh / Merge
- 分布式查询和聚合分析的内部机制
- Query Then Fetch;IDF 不是基于全局,⽽是基于分⽚计算,,因此,数据量少的时候,算分不准
- 增加 “shard_size” 可以提⾼ Terms 聚合的精准度
回顾总结:数据建模及重要性
- 数据建模
- ES 如何处理管理关系 / 数据建模的常⻅步骤 / 建模的最佳实践
- 建模相关的⼯具
- Index Template / Dynamic Template / Ingest Node / Update By Query / Reindex / Index Alias
- 最佳实践
- 避免过多的字段 / 避免 wildcard 查询 / 在 Mapping 中设置合适的字段
测试
DELETE test
PUT test/_doc/1
{
"content":"Hello World"
}
POST test/_search
{
"profile": "true",
"query": {
"match": {
"content": "Hello World"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"match": {
"content": "hello world"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"match": {
"content.keyword": "Hello World"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"match": {
"content.keyword": "hello world"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"term": {
"content": "Hello World"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"term": {
"content": "hello world"
}
}
}
POST test/_search
{
"profile": "true",
"query": {
"term": {
"content.keyword": "Hello World"
}
}
}
测试
- 判断题:⽣产环境中,对索引使⽤ Index Alias 是⼀个好的实践
- 在 Terms 聚合分析中,有哪些⽅法可以提⾼查询的精准度
- 如何通过聚合分析知道,每天⽹站中的访客来⾃多少不同的 IP
- 请描述 “multi_match” 查询中 “best_field”的⾏为
- 对搜索结果分⻚时,所采⽤的两个参数
- 判断题:使⽤ Scroll API 导出数据时,即使中途有新的数据写⼊,这些数据也能被导出