一、概述

需求:

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

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

1. 字段为text类型,指定分词器为whitespace,以空格分隔标签

  1. "mediaTag" : {
  2. "type" : "text",
  3. "analyzer": "whitespace"
  4. }

2. 字段为text类型,指定分词器为pattern,指定标签分隔字符,以逗号分隔

  1. PUT /es_medias_test2
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "comma": {  //自定义分词器名称
  7. "type": "pattern",
  8. "pattern": ","
  9. }
  10. }
  11. }
  12. },
  13. "mappings": {
  14. "esmedias": {
  15. "properties": {
  16. "mediaTag": {
  17. "type": "text",
  18. "analyzer": "comma"
  19. }
  20. }
  21. }
  22. }
  23. }

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

2. 创建索引
  1. PUT /es_medias_test2
  2. {
  3. "settings": {
  4. "index": {
  5. "number_of_shards": "1",
  6. "number_of_replicas": "0"
  7. }
  8. },
  9. "mappings": {
  10. "esmedias": {
  11. "properties": {
  12. "mediaTag" : {
  13. "type" : "text",
  14. "analyzer": "whitespace"
  15. }
  16. }
  17. }
  18. }
  19. }
2. 添加数据
  1. POST /es_medias_test2/_bulk
  2. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"o3kyp3YB_f4AQBwwbA7Q"}}
  3. {"mediaTag":"美国 英国"}
  4. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"lHk0p3YB_f4AQBwwvxBz"}}
  5. {"mediaTag":"英国 美国"}
  6. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"-Xk1p3YB_f4AQBwwNRBt"}}
  7. {"mediaTag":"美国 法国 英国"}
  8. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"AXlYp3YB_f4AQBww9zDT"}}
  9. {"mediaTag":"china 美国 英国"}
  10. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"13k1p3YB_f4AQBwwBxDw"}}
  11. {"mediaTag":"美国 英国 士大夫"}
  12. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"PXk1p3YB_f4AQBwwfxGI"}}
  13. {"mediaTag":"美国"}
  14. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"G3k1p3YB_f4AQBwwahEM"}}
  15. {"mediaTag":"英国 船"}
  16. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"G3lap3YB_f4AQBwwNTEX"}}
  17. {"mediaTag":"china 美国"}
  18. {"create":{"_index":"es_medias_test2","_type":"esmedias","_id":"FXlLp3YB_f4AQBwwUCRf"}}
  19. {"mediaTag":"china 美国 法国"}
 
4. 测试
  1. GET /es_medias_test2/_search
  2. {
  3. "query": {
  4. "match": {
  5. "mediaTag": "美国 英国"
  6. }
  7. }
  8. }

返回结果符合预期

  1. {
      "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. 虚拟机下Ubuntu共享文件夹不能显示的一种解决方法

    原文链接:https://blog.csdn.net/huyangzhilin/article/details/70666937

  2. Vmware无法生成本地连接

    打开Vmware使用乌班图 结果发现没有办法连接本地连接,那就是注册表出现了问题 今天推荐一个好软件 然后使用进行清理缓存,重新注册表 然后直接点击虚拟机里面的编辑->虚拟网络编辑器->把 ...

  3. JZOJ2020年8月14日提高组反思

    JZOJ2020年8月14日提高组反思 T1 看到题 一脸:我是谁,我在哪,我要干啥 看到字符串凉一半 还有查询修改 想到线段树但不会建模 暴力安排 T2 一开始觉得:水题 然后啪啪打脸 空间小,数据 ...

  4. 20190627_解决ADB的device offline问题的两种方法

    故障现象: error: device offline 故障解决: 第一种方法: C:\Users\WXY\Desktop\XY\adb>adb nodaemon server cannot b ...

  5. 解决:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...

  6. Mysql-索引分析查询性能

    explain 全文只有一个关键点,那就是explain,explain 显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.简单讲,它的作用就 ...

  7. 嘶吼CTF easy calc

    进入之后可以看到我们需要输入一个计算式来得到答案,burpsuite进行抓包之后发现页面来自于calc.php 我们直接访问calc.php页面 发现源代码泄露 可以看到当我们没有输入num值的时候就 ...

  8. 百度网盘下载器:SpeedPan2.3.8

    SpeedPan是款百度网盘资源下载工具,下载速度还行(至少比百度网盘快太多了),支持登录百度账号,也支持免登录下载.官网免费版的取消分享了,我从油管上看到了这个软件,分享给大家. 天翼云:https ...

  9. Java集合源码分析(七)——TreeMap

    简介 TreeMap 是一个有序的key-value集合,它的内部是通过红黑树实现的. TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap ...

  10. 移动端H5开发中的常见问题处理

    1.问题之合成海报: 功能技术:http://html2canvas.hertzen.com 问题描述:合成模糊.合成区域内容错位,合成不完整,合成边缘白条等. 解决方案:如有页面布局正常合成错位的, ...