elasticsearch从入门到入门系列(四)---搜索高级使用

1.es索引的别名使用

  • 在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索 引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此,es提供了索引 别名来解决这些问题。 索引别名就像⼀个快捷⽅式或是软连接,可以指向⼀个或多个索引,也可 以给任意⼀个需要索引名的API来使⽤。别名的应⽤为程序提供了极⼤地灵活性
  • 别名查询
GET /nba/_alias

GET /_alias
  • 新增别名
POST /_aliases

{
    "actions": [
        {
            "add": {
                "index": "nba", 
                "alias": "nba_v1.0"
            }
        }
    ]
}
  • 删除别名
POST /_aliases

{
    "actions": [
        {
            "remove": {
                "index": "nba", 
                "alias": "nba_v1.0"
            }
        }
    ]
}
DELETE /nba/_alias/nba_v1.1
  • 重命名
POST /_aliases

{
    "actions": [
        {
            "remove": {
                "index": "nba", 
                "alias": "nba_v1.0"
            }
        }, 
        {
            "add": {
                "index": "nba", 
                "alias": "nba_v2.0"
            }
        }
    ]
}
  • 为多个索引指定⼀个别名
POST /_aliases

{
    "actions": [
        {
            "add": {
                "index": "nba", 
                "alias": "national_player"
            }
        }, 
        {
            "add": {
                "index": "wnba", 
                "alias": "national_player"
            }
        }
    ]
}
  • 为同个索引指定多个别名
POST /_aliases

{
    "actions": [
        {
            "add": {
                "index": "nba", 
                "alias": "nba_v2.1"
            }
        }, 
        {
            "add": {
                "index": "nba", 
                "alias": "nba_v2.2"
            }
        }
    ]
}
  • 通过别名读索引
当别名指定了⼀个索引,则查出⼀个索引

GET /nba_v2.1


当别名指定了多个索引,则查出多个索引


GET /national_player
  • 通过别名写索引
当别名指定了⼀个索引,则可以做写的操作

POST /nba_v2.1/_doc/566

{
    "countryEn": "Croatia", 
    "teamName": "快船", 
    "birthDay": 858661200000, 
    "country": "克罗地亚", 
    "teamCityEn": "LA", 
    "code": "ivica_zubac", 
    "displayAffiliation": "Croatia", 
    "displayName": "伊维察 祖巴茨哥哥", 
    "schoolType": "", 
    "teamConference": "⻄部", 
    "teamConferenceEn": "Western", 
    "weight": "108.9 公⽄", 
    "teamCity": "洛杉矶", 
    "playYear": 3, 
    "jerseyNo": "40", 
    "teamNameEn": "Clippers", 
    "draft": 2016, 
    "displayNameEn": "Ivica Zubac", 
    "heightValue": 2.16, 
    "birthDayStr": "1997-03-18", 
    "position": "中锋", 
    "age": 22, 
    "playerId": "1627826"
}
  • 当别名指定了多个索引,可以指定写某个索引
POST /_aliases

{
    "actions": [
        {
            "add": {
                "index": "nba", 
                "alias": "national_player", 
                "is_write_index": true
            }
        }, 
        {
            "add": {
                "index": "wnba", 
                "alias": "national_player"
            }
        }
    ]
}
POST /national_player/_doc/566
{
 "countryEn": "Croatia",
 "teamName": "快船",
 "birthDay": 858661200000,
 "country": "克罗地亚",
 "teamCityEn": "LA",
 "code": "ivica_zubac",
 "displayAffiliation": "Croatia",
 "displayName": "伊维察 祖巴茨妹妹",
 "schoolType": "",
 "teamConference": "⻄部",
 "teamConferenceEn": "Western",
 "weight": "108.9 公⽄",
 "teamCity": "洛杉矶",
 "playYear": 3,
 "jerseyNo": "40",
 "teamNameEn": "Clippers",
 "draft": 2016,
 "displayNameEn": "Ivica Zubac",
 "heightValue": 2.16,
 "birthDayStr": "1997-03-18",
 "position": "中锋",
 "age": 22,
 "playerId": "1627826"
}

2.es之如何重建索引

  • 步骤
  1. nba取⼀个别名nba_latest, nba_latest作为对外使⽤
  2. 新增⼀个索引nba_20220101,结构复制于nba索引,根据业务要求修改字段
  3. 将nba数据同步到nba_20220101
  4. 给nba_20220101添加别名nba_latest,删除nba别名nba_latest
  5. 删除nba索引
  • 案例
1.我们对外提供访问nba索引时使⽤的是nba_latest别名

2.新增⼀个索引(⽐如修改字段类型,jerseyNo改成keyword类型)

PUT /nba_20220101

{
    "mappings": {
        "properties": {
            "age": {
                "type": "integer"
            }, 
            "birthDay": {
                "type": "date"
            }, 
            "birthDayStr": {
                "type": "keyword"
            }, 
            "code": {
                "type": "text"
            }, 
            "country": {
                "type": "keyword"
            }, 
            "countryEn": {
                "type": "keyword"
            }, 
            "displayAffiliation": {
                "type": "text"
            }, 
            "displayName": {
                "type": "text"
            }, 
            "displayNameEn": {
                "type": "text"
            }, 
            "draft": {
                "type": "long"
            }, 
            "heightValue": {
                "type": "float"
            }, 
            "jerseyNo": {
                "type": "keyword"
            }, 
            "playYear": {
                "type": "long"
            }, 
            "playerId": {
                "type": "keyword"
            }, 
            "position": {
                "type": "text"
            }, 
            "schoolType": {
                "type": "text"
            }, 
            "teamCity": {
                "type": "text"
            }, 
            "teamCityEn": {
                "type": "text"
            }, 
            "teamConference": {
                "type": "keyword"
            }, 
            "teamConferenceEn": {
                "type": "keyword"
            }, 
            "teamName": {
                "type": "keyword"
            }, 
            "teamNameEn": {
                "type": "keyword"
            }, 
            "weight": {
                "type": "text"
            }
        }
    }
}

3.将旧索引数据copy到新索引
    3.1 同步等待,接⼝将会在 reindex 结束后返回
    
    POST /_reindex
    {
         "source": {
             "index": "nba"
         },
         "dest": {
             "index": "nba_20220101"
         }
    }

    3.2异步执⾏,如果 reindex 时间过⻓,建议加上 wait_for_completion=false 的参数条件,
这样 reindex 将直接返回 taskId

    POST /_reindex?wait_for_completion=false

    {
         "source": {
             "index": "nba"
         },
         "dest": {
             "index": "nba_20220101"
         }
    }

4.替换别名

POST /_aliases

{
    "actions": [
        {
            "add": {
                "index": "nba_20220101", 
                "alias": "nba_latest"
            }
        }, 
        {
            "remove": {
                "index": "nba", 
                "alias": "nba_latest"
            }
        }
    ]
}

5.删除旧索引

DELETE /nba

6.通过别名访问新索引

POST /nba_latest/_search

{
    "query": {
        "match": {
            "displayNameEn": "james"
        }
    }
}

3.es之refresh操作

  • 理想的搜索
    • 新的数据⼀添加到索引中⽴⻢就能搜索到,但是真实情况不是这样的。
  • 我们使⽤链式命令请求,先添加⼀个⽂档,再⽴刻搜索
curl -X PUT localhost:9200/star/_doc/888 -H 'Content-Type:
application/json' -d '{ "displayName": "蔡徐坤" }'
curl -X GET localhost:9200/star/_doc/_search?pretty
  • 强制刷新
curl -X PUT localhost:9200/star/_doc/666?refresh -H 'Content-Type:
application/json' -d '{ "displayName": "杨超越" }'
curl -X GET localhost:9200/star/_doc/_search?pretty
  • 修改默认更新时间(默认时间是1s)
PUT /star/_settings
{
 "index": {
 "refresh_interval": "5s"
 }
}
  • 将refresh关闭
PUT /star/_settings
{
 "index": {
 "refresh_interval": "-1"
 }
}

4.es之⾼亮查询

  • ⾼亮查询
POST /nba_latest/_search

{
    "query": {
        "match": {
            "displayNameEn": "james"
        }
    }, 
    "highlight": {
        "fields": {
            "displayNameEn": { }
        }
    }
}
  • ⾃定义⾼亮查询
POST /nba_latest/_search

{
    "query": {
        "match": {
            "displayNameEn": "james"
        }
    }, 
    "highlight": {
        "fields": {
            "displayNameEn": {
                "pre_tags": [
                    "

" ], "post_tags": [ "

" ] } } } }

5.es查询建议

  • 查询建议,是为了给⽤户提供更好的搜索体验。包括:词条检查,⾃动补全。
  • Term suggester
    • term 词条建议器,对给输⼊的⽂本进⾏分词,为每个分词提供词项建议
POST /nba_latest/_search

{
    "suggest": {
        "my-suggestion": {
            "text": "jamse hardne", 
            "term": {
                "suggest_mode": "missing", 
                "field": "displayNameEn"
            }
        }
    }
}
  • Phrase suggester
    • phrase 短语建议,在term的基础上,会考量多个term之间的关系,⽐如是否同时出现在索 引的原⽂⾥,相邻程度,以及词频等
POST /nba_latest/_search

{
    "suggest": {
        "my-suggestion": {
            "text": "jamse harden", 
            "phrase": {
                "field": "displayNameEn"
            }
        }
    }
}
  • Completion suggester
    • Completion 完成建议
POST /nba_latest/_search

{
    "suggest": {
        "my-suggestion": {
            "text": "Miam", 
            "completion": {
                "field": "teamCityEn"
            }
        }
    }
}

 

你可能感兴趣的:(elasticsearch,搜索引擎)