操作类 操作步骤 1.登录云搜索服务管理控制台。 2.在左侧导航栏中,选择“集群管理”,进入集群列表页面。 3.在集群列表页面中,单击集群“操作”列的“Kibana”。 4.在Kibana的左侧导航中选择“Dev Tools”,单击“Get to work”,进入Kibana的Console界面。 5. 在Kibana的Console界面中,执行命令创建索引,并指定自定义映射来定义数据类型。 例如:现在有“tv.json”数据文件,数据如下所示。 { "tv":[ { "name": "tv1", "description": "USB, DisplayPort", "vote": 0.98 } { "name": "tv2", "description": "USB, HDMI", "vote": 0.99 } { "name": "tv3", "description": "USB", "vote": 0.5 } { "name": "tv4", "description": "USB, HDMI, DisplayPort", "vote": 0.7 } ] } 可以执行如下命令,创建索引“mall”,并指定自定义映射来定义数据类型。 PUT /mall?pretty { "mappings": { "tv": { "properties": { "description": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "vote": { "type": "float" } } } } } 6.执行如下命令,将“tv.json”文件中的数据导入到“mall”索引中。 POST /mall/tv/bulk?pretty { "index": {"id": "1"}} { "name": "tv1", "description": "USB, DisplayPort", "vote": 0.98 } { "index": {"id": "2"}} { "name": "tv2", "description": "USB, HDMI", "vote": 0.99 } { "index": {"id": "3"}} { "name": "tv3", "description": "USB", "vote": 0.5 } { "index": {"id": "4"}} { "name": "tv4", "description": "USB, HDMI, DisplayPort", "vote": 0.7 } 7.自定义评分查询数据。 −用绝对好评率计算总分,按照总分由高到低的顺序排列搜索结果。 假设用户想要查询有USB接口、HDMI接口、DisplayPort接口的电视机,接口出现,则记 1 分,不出现,则记 0 分,在前面的得分上乘以绝对好评率为总分。可以执行如下命令按照总分由高到低的顺序排列搜索结果。 GET /mall/tv/search?pretty { "query":{ "functionscore":{ "query":{ "bool":{ "should":[ {"constantscore":{ "query":{"match":{"description":"USB"}} }}, {"constantscore":{ "query":{"match":{"description":"HDMI"}} }}, {"constantscore":{ "query":{"match":{"description":"DisplayPort"}} }} ] } }, "fieldvaluefactor":{ "field":"vote", "factor":1 }, "boostmode":"multiply", "maxboost":10 } } } 上面示例中总分计算公式:newscore queryscore (factor vote) 返回结果如下所示。 { "took": 13, "timedout": false, "shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 4, "maxscore": 2.1, "hits": [ { "index": "mall", "type": "tv", "id": "4", "score": 2.1, "source": { "name": "tv4", "description": "USB, HDMI, DisplayPort", "vote": 0.7 } }, { "index": "mall", "type": "tv", "id": "2", "score": 1.98, "source": { "name": "tv2", "description": "USB, HDMI", "vote": 0.99 } }, { "index": "mall", "type": "tv", "id": "1", "score": 1.96, "source": { "name": "tv1", "description": "USB, DisplayPort", "vote": 0.98 } }, { "index": "mall", "type": "tv", "id": "3", "score": 0.5, "source": { "name": "tv3", "description": "USB", "vote": 0.5 } } ] } } 从上面返回结果可以看出Elasticsearch搜索引擎使用绝对好评率计算电视机的总分,并将电视机按照总分由高到低的顺序排列显示。 −用相对好评率计算总分,按照总分由高到低的顺序排列搜索结果。 假设用户想要查询有USB接口、HDMI接口、DisplayPort接口的电视机,接口出现,则记 1 分,不出现,则记 0 分,在前面的得分上乘以相对好评率为总分。为了避免不正常的好评率对查询结果的影响,不用绝对好评率作为评分因素,设定好评率的门限值为0.8,高于门限值时,好评率按1计算,低于或等于门限值时,好评率按0.5计算。可以执行如下命令按照总分由高到低的顺序排列搜索结果。 GET /mall/tv/search?pretty { "query":{ "functionscore":{ "query":{ "bool":{ "should":[ {"constantscore":{ "query":{"match":{"description":"USB"}} }}, {"constantscore":{ "query":{"match":{"description":"HDMI"}} }}, {"constantscore":{ "query":{"match":{"description":"DisplayPort"}} }} ] } }, "scriptscore":{ "script":{ "params":{"threshold":0.8}, "inline":"if (doc["vote"].value > params.threshold) {return 1;} return 0.5;" } }, "boostmode":"multiply", "maxboost":10 } } } 上面示例中总分计算公式:newscore queryscore vote(当vote > 0.8时,取值为1;当vote ≤ 0.8时,取值为0.5。) 返回结果如下所示。 { "took": 634, "timedout": false, "shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 4, "maxscore": 2, "hits": [ { "index": "mall", "type": "tv", "id": "2", "score": 2, "source": { "name": "tv2", "description": "USB, HDMI", "vote": 0.99 } }, { "index": "mall", "type": "tv", "id": "1", "score": 2, "source": { "name": "tv1", "description": "USB, DisplayPort", "vote": 0.98 } }, { "index": "mall", "type": "tv", "id": "4", "score": 1.5, "source": { "name": "tv4", "description": "USB, HDMI, DisplayPort", "vote": 0.7 } }, { "index": "mall", "type": "tv", "id": "3", "score": 0.5, "source": { "name": "tv3", "description": "USB", "vote": 0.5 } } ] } } 从上面返回结果可以看出Elasticsearch搜索引擎使用相对好评率计算电视机的总分,并将电视机按照总分由高到低的顺序排列显示。