一、概述

需求:

  最近在做一个新闻项目,有这样一个需求,如下:

  1. 用户根据视频内容手动创建标签,标签个数不限
  2. 在视频详情页提供根据标签推荐视频功能,即按本视频的标签进行搜索,标签匹配多的排在前面,匹配少的排在后面
 
经过分析、调研,以单字段存储标签,尝试了下面的几种方案,这里一并写出
不可行方案:
  1. 字段为keyword类型,数据以数组存储,未找到可实现此功能的检索方式
  2. 字段为text类型,多个标签以空格隔开或者数组存储,使用match搜索,数据评分不准确
  3. 字段为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"
}
}
}
}
}

二、可行方案测试(以可行方案一为例)

2. 创建索引
PUT /es_medias_test2
{
"settings": {
"index": {
"number_of_shards": "1",
"number_of_replicas": "0"
}
},
"mappings": {
"esmedias": {
"properties": {
"mediaTag" : {
"type" : "text",
"analyzer": "whitespace"
}
}
}
}
}
2. 添加数据
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 美国 法国"}
 
4. 测试
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标签搜索并解决评分排序问题的更多相关文章

  1. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  2. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  3. wukong引擎源码分析之索引——part 3 文档评分 无非就是将docid对应的fields信息存储起来,为搜索结果rank评分用

    之前的文章分析过,接受索引请求处理的代码在segmenter_worker.go里: func (engine *Engine) segmenterWorker() { for { request : ...

  4. atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接

    atitit.无线上网卡 无法搜索WiFi 解决无线路由器信号不能被连接 #---现象 pc机无线网卡无法搜索到无线路由器的信号.. 但是,笔记本电脑和手机能够... 只要pc机无线网卡可以搜索信号, ...

  5. C++ sqlite3解决中文排序问题

    导言:sqlite3默认的编码方式为UTF8编码,而在UTF8编码下,中文不是按照拼音顺序编码的,所以想解决中文排序问题,必须自定义排序规则,将UTF8编码转换成GB2312编码(GB2312编码中文 ...

  6. xpath教程一---简单的标签搜索

    工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests[推荐安装,从网页上获取网页代码练手,再好不过了] 讲解 网页代码都是成对的标签, ...

  7. selenium 获取不了标签文本的解决方法

    selenium 获取不了标签文本的解决方法 ------ 即driver.find_element_by_xxx().text() 为空的解决办法 如果得到的文本只为空,而非我们期望的baidu,那 ...

  8. python用户评论标签匹配的解决方法

    python用户评论标签匹配的解决方法 这篇文章主要为大家详细介绍了python用户评论标签匹配的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 我们观察用户评论发现:属性词往往和情感词伴 ...

  9. es lucene搜索及聚合流程源码分析

    本文以TermQuery,GlobalOrdinalsStringTermsAggregator为例,通过代码,分析es,lucene搜索及聚合流程.1:协调节点收到请求后,将search任务发到相关 ...

随机推荐

  1. BootstrapBlazor 组件库介绍

    项目介绍 演示系统地址:https://www.blazor.zone Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富 ...

  2. Alpha冲刺-第三次冲刺笔记

    Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...

  3. 部署完的Django项目升级为HTTPS

    1.阿里云上申请免费ssl证书--->提交各种资料--->等待审核--->下载证书. 2.远程连接阿里云服务器,将下载下来的证书内容复制到Nginx安装目录下的cert目录(需要新建 ...

  4. PyQt(Python+Qt)学习随笔:QDial刻度盘部件功能简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Dial刻度盘输入部 ...

  5. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项标记flags相关方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidgetItem项可以通过flags()返回项的标记,返回值类型为类型Qt.ItemF ...

  6. Jmeter(三十二) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy5(详解教程)

    1.简介 这一篇文章,宏哥主要想讲解一下,录制完脚本不是就完事了,我们有时候还需要断言,看结果是否和我们预期的结果一致.这在测试中都是很重要的.用句老话说:只看结果不看过程. 2.录制脚本 想要断言, ...

  7. Win10新增API

    Win10新增API为以下一些方面: Windows.AI Windows.ApplicationModel Windows.Devices Windows.Globalization Windows ...

  8. Panda交易所视点观察:政府连发区块链建设文件,相关概念股受追捧

    日前,Panda交易所从北京市地方金融监督管理局获悉,证监会已同意在北京.苏州.上海.浙江.深圳等地区的区域性股权市场参与区块链建设工作.以上5市金融监管局将按照中国证监会的统一部署要求推进建设工作. ...

  9. Java安全之原生readObject方法解读

    Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...

  10. 高速缓冲存储器Cache

    目录 概述 问题的提出 局部性原理 命中与未命中 Cache的命中率 Cache-主存系统的效率 例题 工作原理 地址映射方式(本节最重要) 直接映射 全相联映射 组相联映射 例子 替换策略 例题 写 ...