项目集·Java-ElasticSearch大众点评
一、ElasticSearch大众点评
0、ElasticSearch核心概念
字段 | 类比 |
---|
Index | 数据库 |
Type | 数据库表 |
Document | 表数据 |
Mapping | 索引映射 |
Shard | 横向扩容、分库分表 |
0.1 相关性
- TF/IDF(词频-逆文档频率):TF * IDF。主要思想是:如果某个词或短语在一篇文章中出现的频率高(即TF高),并且在其他文章中很少出现(即IDF高),则认为此词或者短语具有很好的类别区分能力,适合用来分类。
1、建模
1.1 索引结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210310175935115.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA4MjM2MjU=,size_16,color_FFFFFF,t_70)
1.2 数据类型
一级分类 | 二级分类 | 具体类型 |
---|
核心类型 | 字符串类型 | string,text,keyword |
整数类型 | integer,long,short,byte |
浮点类型 | double,float,half_float,scaled_float |
逻辑、日期、范围、二进制类型 | boolean,date,range,binary |
复合类型 | 数组类型 | array |
对象类型 | object |
嵌套类型 | nested |
地理类型 | 地理坐标类型 | geo_point |
地理地图 | geo_shape |
特殊类型 | IP、范围、令牌计数、附件、抽取类型 | ip、completion、token_count、attachment、percolator |
2、结构化搜索
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210306202553932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA4MjM2MjU=,size_16,color_FFFFFF,t_70)
2.1 全文检索(Query)& 精确匹配(Filter)
- Query会计算文档之间的相关度,并按照相关度进行排序,没有缓存
- Filter的话,不计算相关度、有cashing bitset的机制,如果以后有相同过滤条件的Filter时,会直接使用cashed bitset
- bitset:就是二进制set,会记录filter的word在哪些文档中存在的集合,有的标1,没有的标0
- 全文检索(Query)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021030621043479.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA4MjM2MjU=,size_16,color_FFFFFF,t_70)
- 精确匹配(Filter)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210308131154926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA4MjM2MjU=,size_16,color_FFFFFF,t_70)
2.2 Filter(精确匹配)
方法 | 类比 |
---|
term filter | SQL中的单个where |
bool(多条件组合查询) | SQL中的where and |
must | 必须匹配 |
should | 匹配任意一个 SQL中的or |
must_not | 必须不匹配 SQL中的不等于 |
boost | 权重 |
best fields(dis_max) | 一个field匹配到尽可能多的关键词,某一query的最大值 |
tie_breaker | 优化dis_max,考虑其他query |
terms filter(多值查询) | SQL中的 in |
range filter(范围查询) | gt(大于)、lt(小于) SQL中的between |
prefix filter(前缀查询) | 性能开销很大,一般不单独使用 |
https://blog.csdn.net/weixin_40341116/article/details/81842989(n-gram:高效match_phrase_prefix query)
2.3 Query(相关性分析)
方法 | 描述 |
---|
match query | 看检索的字段分不分词:不分词 = term filter,分词就是文档里有就按相关度排名返回文档,分词 = bool |
match query + operator | and 两个词都有才返回 = term + should |
match query + minmax_should_match(调精确度,去长尾) | minmax_should_match 按命中百分比返回,75%,就是检索四个词,返回包含三个词以上的文档;50%就是返回包含两个词以上的 |
multi_match query + most fields | 等于best fields + tie_breaker |
match_phrase(短语查询) | 紧挨着 |
slop(近似查询) | 两个词之间隔slop个距离 |
wildcard(通配符匹配) | ?代表任意字符; *代表0或多个字符 |
match_phrase_prefix query(类似短语查询,但最后一个词是前缀查询) | max_expansions最多匹配多少个term,限制性能 |
fuzzy query(模糊查询) | fuzziness 最多可以纠正几个字母 |
https://blog.csdn.net/weixin_40341116/article/details/80913045(自定义评分函数)
3、聚合分析
3.1 案例1 家电卖场销量统计
字段 | 类型 |
---|
售价 | long |
颜色 | keyword |
品牌 | keyword |
售出日期 | date |
3.1.1 度量聚合
方法 | 描述 |
---|
aggs | 分组聚合 = group by |
aggs | 多层下钻 = group by a,b |
hitogram | interval 数值型 |
date hitogram | interval “month” |
https://blog.csdn.net/qq_27384769/article/details/79736632(41_ElasticSearch global bucket:单个品牌与所有品牌销量对比)
3.1.2 近似聚合
- 使用场景:count(distinct) -> 不易并行 -> 不要求特别精准、近似聚合
方法 | 描述 |
---|
cardinality | count(distinct) |
percentiles(百分比算法) | 访问请求时长 |
4、 案例1 大众点评
4.1 建模
字段 | 类型 |
---|
shop_id | integer |
shop_name | text |
shop_tags | text |
shop_location | geo_point |
remark_score | double |
price_per_man | integer |
category_id | integer |
category_name | keyword |
4.2 插入
4.3 搜索