18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 电子商务 > Elasticsearch构建垂直搜索引擎实例

Elasticsearch构建垂直搜索引擎实例

时间:2023-03-20 06:18:01 | 来源:电子商务

时间:2023-03-20 06:18:01 来源:电子商务

1 项目背景

最近了解了下Elasticsearch(简称Es),之前也了解过Es还通过构建了日志分析系统,在日志分析系统中基本没有用到Es和搜索的基本知识点。在日志分析系统中直接通过应用中构建日志通过beats+logstash将日志导入到ES中,通过kibana工具对日志从各维度查询和分析。ES在日志查询分析方面有非常强悍的功能(以后在分析),在搜索引擎构建上也有很突出的表现。

原来搜索方案该项目是自行用lunce封装的一个类似于solr的搜索服务,基本实现搜索空间配置化和索引建立和切换的方案,并没有实现实现搜索语句自定义和配置。稍微复杂的搜索还需要定制特定的搜索类插件实现。

通过Elasticsearch来实现现有的搜索药考虑的问题无非是业务上的可行性:

该项目是一个类似B2B的电商网站,但是本网站是一个会员制网站。说白了,付费用户的商品广告全部要排到前面,免费商户的广告排到后面。同时要求每个商户在每次搜索召回的时候只出现一次召回。

之前自建的老的搜索服务是通过每天建立全量索引,建完全量索引的时候再做增量索来更新搜索数据。增量索引不存在什么问题,缺点就是建一次全量索引需要的时间太长,所需要的物理资源多。

2 ES实战方案

在简单了解了ES之后,感觉实现项目中的大部分搜索需求都是小菜一碟。唯一担心会有问题的就是在搜索召回的时候对每个广告商家的所有的广告物料分组拿出一个相关度最高的进行分组排序。之前旧的解决方案是搜索的时候拉出几千个搜索结果,自行在内存分组排序分页。旧的自建搜索服务是自行手工设计的分布式系统,一次行拉去也是并行同时在多个机器拉取在性能上还勉强过关。但是ES肯定不能用这样的笨办法处理分组排序的问题,还是试试通过ES聚合分组的方式来完成这样的需求。具体过程代码如下:

建立索引mappingPUT _index_template/index_search_product_template{ "version": 3, "priority": 200, "template": { "settings": { "index": { "number_of_shards": "5", "refresh_interval": "300s" } }, "mappings": { "properties": { "imgs": { "type": "keyword" }, "majorProdProp": { "type": "keyword" }, "keywords": { "analyzer": "whitespace", "type": "text" }, "productAttrValue": { "analyzer": "ik_smart", "type": "text" }, "productId": { "type": "long" }, "userSource": { "type": "keyword" }, "companyAddr": { "analyzer": "ik_smart", "type": "text" }, "source": { "type": "keyword" }, "categoryName": { "type": "keyword" }, "productName": { "analyzer": "ik_smart", "type": "text" }, "productAttr": { "analyzer": "ik_smart", "type": "text" }, "productZoneId": { "type": "long" }, "calCeil": { "type": "keyword" }, "minordernum": { "type": "integer" }, "compId": { "type": "long" }, "isPromote": { "type": "integer" }, "price": { "type": "long" }, "productStar": { "type": "integer" }, "shopId": { "type": "long" }, "categoryId": { "type": "keyword" }, "deliveryProvinceId": { "type": "integer" } } } }, "index_patterns": [ "index_product_*" ], "composed_of": [ "common_integer_id_template", "common_long_id_template" ]}构造查询DSL

GET index_product_payed/_search/{ "query": { "function_score": { "query": { "bool": { "should": [ { "term": { "productName": { "value": "灯泡", "boost": 300 } } } ] } }, "functions": [ { "field_value_factor": { "field": "productScore", "factor": 1, "modifier": "sqrt", "missing": 1 }} ], "boost_mode": "multiply" } }, "from": 0, "size": 0, "explain" : false, "profile": false, "aggs": { "group_by_userId": { "terms": { "field": "userId", "size": 400, "order": { "maxPrice": "desc" } } ,"aggregations": { "onlyOne": { "top_hits": { "size": 1, "sort": [ { "_score":{ "order": "desc" } } ], "explain" : false, "_source": { "includes": ["_id"","companyName","_score","price","isPromote","productScore"] } } }, "maxPrice":{ "max": { "script": { "source": "_score" } } } } } }}在这个DSL 中用到了聚合分组排序,用到了functions,field_value_factor中的排序影响的方式,但是这个只是一个简化版,实际查询比以上DSL稍微复杂一些。

时间衰减方面在另外一个搜索功能中运营,直接上代码:

GET /index_wantbuy/_search{ "from":0, "size":100, "query":{ "script_score":{ "query":{ "bool":{ "should":[ { "multi_match":{ "query":"高价回收整厂设备 高价回收食品设备 高价回收面制品设备 高价回收肉制品设备", "fields":[ "productName^1.0", "remark^1.0", "tittle^1.0" ], "type":"best_fields", "operator":"OR", "slop":0, "prefix_length":0, "max_expansions":50, "zero_terms_query":"NONE", "auto_generate_synonyms_phrase_query":true, "fuzzy_transpositions":true, "boost":1 } } ], "adjust_pure_negative":true, "boost":1 } }, "script":{ "source":"if(doc['offerDeadline'].size()==0){ return 0; } return decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['offerDeadline'].value ) * _score ;", "lang":"painless", "params":{ "offset":"3d", "origin":"2022-01-12T15:14:35.525+0800", "scale":"30d", "decay":0.5 } }, "boost":1 } }, "_source":{ "includes":[ "tittle", "companyName", "buytype", "wantBuyId", "totalProd", "offerDeadline", "publicTime", "cityid", "userId", "provinceid", "areaid", "auditStatus", "unit" ], "excludes":[ ] }}这个查询中没有用上已经被下个版本过期的function,而是直接使用script

GET /index_wantbuy/_search{ "from":0, "size":100, "query":{ "script_score":{ "query":{ "bool":{ "should":[ { "multi_match":{ "query":"高价回收整厂设备 高价回收食品设备 高价回收面制品设备 高价回收肉制品设备", "fields":[ "productName^1.0", "remark^1.0", "tittle^1.0" ], "type":"best_fields", "operator":"OR", "slop":0, "prefix_length":0, "max_expansions":50, "zero_terms_query":"NONE", "auto_generate_synonyms_phrase_query":true, "fuzzy_transpositions":true, "boost":1 } } ], "adjust_pure_negative":true, "boost":1 } }, "script":{ "source":"if(doc['offerDeadline'].size()==0){ return 0; } return decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['offerDeadline'].value ) * _score ;", "lang":"painless", "params":{ "offset":"3d", "origin":"2022-01-12T15:14:35.525+0800", "scale":"30d", "decay":0.5 } }, "boost":1 } }, "_source":{ "includes":[ "tittle", "companyName", "buytype", "wantBuyId", "totalProd", "offerDeadline", "publicTime", "cityid", "userId", "provinceid", "areaid", "auditStatus", "unit" ], "excludes":[ ] }}

关键词:索引,实例,垂直

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭