ES标签搜索并解决评分排序问题
一、概述
需求:
最近在做一个新闻项目,有这样一个需求,如下:
- 用户根据视频内容手动创建标签,标签个数不限
- 在视频详情页提供根据标签推荐视频功能,即按本视频的标签进行搜索,标签匹配多的排在前面,匹配少的排在后面
- 字段为keyword类型,数据以数组存储,未找到可实现此功能的检索方式
- 字段为text类型,多个标签以空格隔开或者数组存储,使用match搜索,数据评分不准确
- 字段为text类型,多个标签以空格隔开或者数组存储,使用match结合match_phrase搜索,数据评分扔不准确
1. 字段为text类型,指定分词器为whitespace,以空格分隔标签
"mediaTag" : {
"type" : "text",
"analyzer": "whitespace"
}
2. 字段为text类型,指定分词器为pattern,指定标签分隔字符,以逗号分隔
PUT /es_medias_test2
{
"settings": {
"analysis": {
"analyzer": {
"comma": { //自定义分词器名称
"type": "pattern",
"pattern": ","
}
}
}
},
"mappings": {
"esmedias": {
"properties": {
"mediaTag": {
"type": "text",
"analyzer": "comma"
}
}
}
}
}
二、可行方案测试(以可行方案一为例)
PUT /es_medias_test2
{
"settings": {
"index": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
},
"mappings": {
"esmedias": {
"properties": {
"mediaTag" : {
"type" : "text",
"analyzer": "whitespace"
}
}
}
}
}
POST /es_medias_test2/_bulk
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"o3kyp3YB_f4AQBwwbA7Q"}}
{"mediaTag":"美国 英国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"lHk0p3YB_f4AQBwwvxBz"}}
{"mediaTag":"英国 美国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"-Xk1p3YB_f4AQBwwNRBt"}}
{"mediaTag":"美国 法国 英国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"AXlYp3YB_f4AQBww9zDT"}}
{"mediaTag":"china 美国 英国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"13k1p3YB_f4AQBwwBxDw"}}
{"mediaTag":"美国 英国 士大夫"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"PXk1p3YB_f4AQBwwfxGI"}}
{"mediaTag":"美国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"G3k1p3YB_f4AQBwwahEM"}}
{"mediaTag":"英国 船"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"G3lap3YB_f4AQBwwNTEX"}}
{"mediaTag":"china 美国"}
{"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"FXlLp3YB_f4AQBwwUCRf"}}
{"mediaTag":"china 美国 法国"}
GET /es_medias_test2/_search
{
"query": {
"match": {
"mediaTag": "美国 英国"
}
}
}
返回结果符合预期
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 10,
"max_score" : 1.8475795,
"hits" : [
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "-Xk1p3YB_f4AQBwwNRBt",
"_score" : 1.8475795,
"_source" : {
"mediaTag" : "美国 法国 英国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "FXlLp3YB_f4AQBwwUCRf",
"_score" : 1.5141833,
"_source" : {
"mediaTag" : "china 美国 法国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "o3kyp3YB_f4AQBwwbA7Q",
"_score" : 0.66557413,
"_source" : {
"mediaTag" : "美国 英国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "xXkyp3YB_f4AQBwwpw6Y",
"_score" : 0.66557413,
"_source" : {
"mediaTag" : "美国 英国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "lHk0p3YB_f4AQBwwvxBz",
"_score" : 0.66557413,
"_source" : {
"mediaTag" : "英国 美国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "13k1p3YB_f4AQBwwBxDw",
"_score" : 0.5578373,
"_source" : {
"mediaTag" : "美国 英国 士大夫"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "AXlYp3YB_f4AQBww9zDT",
"_score" : 0.39778596,
"_source" : {
"mediaTag" : "china,美国 英国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "G3k1p3YB_f4AQBwwahEM",
"_score" : 0.39778596,
"_source" : {
"mediaTag" : "英国 船"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "PXk1p3YB_f4AQBwwfxGI",
"_score" : 0.33188638,
"_source" : {
"mediaTag" : "美国"
}
},
{
"_index" : "es_medias_test2",
"_type" : "esmedias",
"_id" : "G3lap3YB_f4AQBwwNTEX",
"_score" : 0.26778817,
"_source" : {
"mediaTag" : "china 美国"
}
}
]
}
}
ES标签搜索并解决评分排序问题的更多相关文章
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- ElasticSearch 学习记录之ES高亮搜索
高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...
- wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用
之前的文章分析过,接受索引请求处理的代码在segmenter_worker.go里: func (engine *Engine) segmenterWorker() { for { request : ...
- atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接
atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接 #---现象 pc机无线网卡无法搜索到无线路由器的信号.. 但是,笔记本电脑和手机能够... 只要pc机无线网卡可以搜索信号, ...
- C++ sqlite3解决中文排序问题
导言:sqlite3默认的编码方式为UTF8编码,而在UTF8编码下,中文不是按照拼音顺序编码的,所以想解决中文排序问题,必须自定义排序规则,将UTF8编码转换成GB2312编码(GB2312编码中文 ...
- xpath教程一---简单的标签搜索
工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests[推荐安装,从网页上获取网页代码练手,再好不过了] 讲解 网页代码都是成对的标签, ...
- selenium 获取不了标签文本的解决方法
selenium 获取不了标签文本的解决方法 ------ 即driver.find_element_by_xxx().text() 为空的解决办法 如果得到的文本只为空,而非我们期望的baidu,那 ...
- python用户评论标签匹配的解决方法
python用户评论标签匹配的解决方法 这篇文章主要为大家详细介绍了python用户评论标签匹配的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 我们观察用户评论发现:属性词往往和情感词伴 ...
- es lucene搜索及聚合流程源码分析
本文以TermQuery,GlobalOrdinalsStringTermsAggregator为例,通过代码,分析es,lucene搜索及聚合流程.1:协调节点收到请求后,将search任务发到相关 ...
随机推荐
- SQL,T-SQL简介
SQL: 结构化查询语言(Structured Query Language), 简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系型数据库系 ...
- [题解] [USACO05JAN]Muddy Fields G
题目TP门 题目大意 在一个 \(R×C\) 的矩阵中,每个点有两个状态:草地和泥地.你需要在泥地里铺 \(1×k\) 木块, \(k\) 为任意整数,求最少要多少木块. 思路 两个横向木块不会互相干 ...
- 从docker介绍及其简介
一.引言 1.我本地代码运行没问题啊,但是别人机器运行不了,从而导致环境不一致的问题 2.那个兄弟又写死循环了,怎么这么卡,在多用户的操作系统下,会相互影响. 天猫双十一的情况下,用户量暴涨,从而导致 ...
- javascript开发后端程序的神器nodejs
目录 简介 nodejs的历史 nodejs简介 nodejs的运行环境 process 终止进程 env argv CLI交互 exports模块 nodejs API nodejs的框架 简介 j ...
- 20200116_centos7.2 下 mysql_5.7修改root密码
1. 需改my.cnf文件 [root@rakinda-iot-platform ~]# vim /etc/my.cnf 2. 新增一行, 登录时跳过密码, 保存后退出, 重启mysql system ...
- PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概念 关于逻辑行logicalRow.列logicalColumn和可见行visualRow.列 ...
- 第11.12节 Python元字符“|”支持的正则表达式多选一匹配模式
re模块支持多个正则表达式使用"|"(逻辑或)模式来组合,扫描目标字符串时, '|' 分隔开的正则表达式组合从左到右进行匹配,只要其中一个匹配成功就认为该组合匹配成功,不再进行组合 ...
- matplotlib 绘制多个图——两种方法
import numpy as np import matplotlib.pyplot as plt #创建自变量数bai组du x= np.linspace(0,2*np.pi,500) #创建函数 ...
- 数据结构——创建链表或树节点的小trick(哑结点)
一般创建链表时,我们可以创建一个哑结点,来保存头部 * struct ListNode { * int val; * ListNode *next; * ListNod ...
- EF优缺点解析
原先用的是三层架构中ADO.NET做底层开发,纯手工sql语句拼装.后来遇到一个MVC+EF项目,体会到了EF的强大性. 它是微软封装好一种ADO.NET数据实体模型,将数据库结构以ORM模式映射到应 ...