- Search Template实现搜索和DSL分离
- Index Alias实现零停机运维(当出现索引的改名或重建时,前端程序可以保持不间断的对数据查询)
Function Score Query
可以在查询结束后,对每一个匹配的文档进行一系列的重新算分,根据新生成的分数进行排序。
提供了几种默认的计算分值的函数
- Weight :为每一个文档设置一个简单而不被规范化的权重
- Field Value Factor:使用该数值来修改_ score, 例如将“ 热度”和“点赞数”作为算分的参考因素
- Random Score:为每一个用户使用一个不同的,随机算分结果
- 衰减函数:以某个字段的值为标准, 距离某个值越近,得分越高
- Script Score:自定义脚本完全控制所需逻辑
Suggester
1.Term Suggester
DELETE articles
POST articles/_bulk
{"index":{}}
{"body":"lucene is very cool"}
{"index":{}}
{"body":"Elasticsearch builds on top of lucene"}
{"index":{}}
{"body":"Elasticsearch rocks"}
{"index":{}}
{"body":"elastic is the company behind ELK stack"}
{"index":{}}
{"body":"Elk stack rocks"}
{"index":{}}
{"body":"elasticsearch is rock solid"}
POST /articles/_search
{
"size": 1,
"query": {
"match": {
"body": "lucen rock"
}
},
"suggest": {
"term-suggestion": {
"text": "lucen rock",
"term": {
"suggest_mode": "popular",
"field": "body"
}
}
}
}
POST /articles/_search
{
"suggest": {
"term-suggestion": {
"text": "lucen hocks",
"term": {
"suggest_mode": "always",
"field": "body",
"prefix_length":0,
"sort": "frequency"
}
}
}
}
Missing -如索引中已经存在,就不提供建议
Popular一推荐出现频率更加高的词
2.Phrase Suggester
一些参数
- Suggest Mode : missing, popular, always
- Max Errors:最多可以拼错的Terms数
- Confidence: 限制返回结果数,默认为1
POST /articles/_search
{
" suggest": {
"my-suggestion": {
"text": "lucne and elasticsear rock hello world",
"phrase": {
"field": "body",
"max_errors": 2,
"confidence": 0,
"direct_generator": [{
"field": "body",
"suggest_mode": "always"
}],
"highlight": {
"pre_tag": "<em>",
"post_tag": "</em>"
}
}
}
}
}
3.Completion Suggester
- Completion Suggester提供了①自动完成”(Auto Complete)的功能。用户每输入一个
字符,就需要即时发送一个查询请求到后段查找匹配项 - 对性能要求比较苛刻。Elasticsearch 采用了不同的数据结构,并非通过倒排索引来完成。而是将Analyze的数据编码成FST和索引一起存放。FST会被ES整个加载进内存,
速度很快 - FST只能用于前缀查找
步骤
- 定义Mapping,使用“completion”type
- 索引数据
- 运行“suggest” 查询,得到搜索建议
可以在搜索中加入更多的上下文信息
DELETE articles
PUT articles
{
"mappings": {
"properties": {
"title_completion": {
"type": "completion"
}
}
}
}
POST articles/_bulk
{"index":{}}
{"title_completion":"lucene is very cool"}
{"index":{}}
{"title_completion":"Elasticsearch builds on top of lucene"}
{"index":{}}
{"title_completion":"Elasticsearch rocks"}
{"index":{}}
{"title_completion":"elastic is the company behind ELK stack"}
{"index":{}}
{"title_completion":"Elk stack rocks"}
{"index":{}}
POST articles/_search?pretty
{
"size": 0,
"suggest": {
"article-suggester": {
"prefix": "e",
"completion": {
"field": "title_completion"
}
}
}
}
4.Context Suggester
-
可以定义两种类型的Context
- Category 一任意的字符串
- Geo一地理位置信息
-
实现Context Suggester的具体步骤
- 定制一个 Mapping
- 索引数据,并且为每个文档加入Context信息
- 结合Context进行Suggestion查询
-
精准度和召回率
- 精准度
Completion > Phrase > Term - 召回率
Term > Phrase > Completion - 性能
Completion > Phrase > Term
- 精准度
节点
- 节点是一个 Elasticsearch的实例
- 其本质上就是一个JAVA进程
- 一台机器上可以运行多个Elasticsearch 进程,但是生产环境一 般建议一台机器上就运行一个Elasticsearch实例
- 每一个节点都有名字,通过配置文件配置,或者启动时候-E node.name=geektime指定
- 每一个节点在启动之后,会分配一个UID,保存在data目录下
Coordinating Node
- 处理请求的节点,叫Coordinating Node
- 路由请求到正确的节点,例如创建索引的请求,需要路由到Master节点
- 所有节点默认都是Coordinating Node
- 通过将其他类型设置成False,使其成为Dedicated Coordinating Node