不要急,总有办法的

有关es forceMerge问题

weizijun 回复了问题 • 6 人关注 • 4 个回复 • 6901 次浏览 • 2018-12-19 09:44 • 来自相关话题

Day 15 - 基于海量公司分词ES中文分词插件

novia 发表了文章 • 0 个评论 • 8452 次浏览 • 2018-12-15 10:35 • 来自相关话题

介绍


本次想和大家分享一款Elasticsearch分词插件,该插件是基于天津海量信息股份有限公司的中文分词核心开发的。海量分词针对大数据检索场景专门做了定制和优化,更贴近搜索需求,整体分词的性能也是非常高效。

本文章有广告成分。但希望将公司研究成果分享出来,给大家实际工作中多一种选择...

海量分词检索优化点


  • 地名方面海量分词5.0可以识别并检索出关于地名后缀的结果

    可以通过搜索“河南”得到“河南省”的结果,搜索“天津”得到“天津市”的搜索结果,而不是简单河南、天津的识别。

  • 著名人物的人名识别更精准,如刘翔、傅莹等

    部分分词器处理中文分词只有两种方式:一种是单字(unigrams)形式,即简单粗暴的将中文的每一个汉字作为一个词(token)分开;另一种是两字(bigrams)的,也就是任意相邻的两个汉字作为一个词分开。这种简单粗暴的切分方式无法实现时效性较新的人名识别,如刘翔、傅莹等会被识别为单字切开。

  • 外国人名识别方面海量可以将人名识别智能识别

    “玛利亚 凯利”、“乔治·史密斯”、“玛丽·戴维斯”将完整的外国人名识别出姓氏和名,如“乔治·史密斯”可以被识别为“乔治”和 “史密斯”。

  • 常见词的品牌名称识别方面,海量分词5.0识别的结果中包含实际意义的品牌名称

    如“乐高”,“吉米作为简单的词,可以被识别,但是词放在文档语境中有其品牌的属性,海量分词识别的结果中可以准确搜索出品牌的结果。

  • 机构名识别方面

    海量分词5.0可以识别完整的机构名称,如“天津海量信息技术股份有限公司”,可以完整的识别出全称。

    海量分词性能评测


    评测用例


    本次评测选取的语料一共三个。一个是2MB的海量测试语料,一个是4MB的北大语料(新版旧版各2MB),一个是9.4GB海量的线上实际数据

    评测指标


    本次评测是在开源评测程序上修改而来,评测指标有分词速度、行数完美率、字数完美率(该指标仅供参考)、内存消耗

    评测结果


    2MB海量测试语料


    | 分词器 | 分词模式 | 分词速度(字符/毫秒) | 行数完美率 | 字数完美率 | 占用内存(MB) |
    | -------- | -------- | ----------- | ------ | ------ | -------- |
    | 海量 | / | 1049.0212 | 74.11% | 65.97% | 85 |
    | ltp | / | 33.748833 | 55.68% | 45.23% | 201 |
    | IctClass | 普通分词 | 208.69612 | 48.77% | 37.10% | 51 |
    | IctClass | 细粒度分词 | 691.5951 | 38.33% | 27.95% | 51 |
    | Jieba | SEARCH分词 | 592.697 | 47.64% | 36.25% | 236 |
    | FudanNLP | / | 121.7537 | 42.99% | 31.59% | 99 |
    | HanLP | 标准分词 | 212.74121 | 45.30% | 34.00% | 63 |
    | HanLP | NLP分词 | 378.23676 | 44.09% | 32.55% | 71 |
    | HanLP | N-最短路径分词 | 189.29959 | 44.19% | 32.22% | 60 |
    | HanLP | 最短路径分词 | 415.63605 | 43.19% | 31.28% | 59 |
    | HanLP | 极速词典分词 | 6735.1934 | 36.78% | 25.10% | 18 |
    | THULAC | / | 0.20857348 | 54.49% | 43.79% | 110 |
    | Stanford | CTB | 0.13520464 | 44.43% | 33.25% | 1101 |
    | Stanford | PKU | 0.12508623 | 45.15% | 34.01% | 1065 |

    可以看到海量分词的行数完美率是最高的,而且速度十分优异;仅有的一个比海量分词速度快的算法是一个追求极限性能舍弃准确率的算法

    4MB北大语料


    | 词器 | 分词模式 | 分词速度(字符/毫秒) | 行数完美率 | 字数完美率 | 占用内存(MB) |
    | -------- | -------- | ----------- | ------ | ------ | -------- |
    | 海量 | / | 1121.7269 | 85.94% | 48.28% | 85 |
    | ltp | / | 35.81329 | 87.37% | 49.37% | 201 |
    | IctClass | 普通分词 | 226.11554 | 78.55% | 42.04% | 51 |
    | IctClass | 细粒度分词 | 756.5135 | 59.06% | 30.61% | 51 |
    | Jieba | SEARCH分词 | 957.52826 | 47.07% | 20.01% | 236 |
    | FudanNLP | / | 126.09879 | 58.54% | 27.78% | 99 |
    | HanLP | 标准分词 | 369.66 | 65.46% | 35.04% | 63 |
    | HanLP | NLP分词 | 439.75632 | 61.93% | 31.37% | 71 |
    | HanLP | N-最短路径分词 | 223.30482 | 69.20% | 35.07% | 60 |
    | HanLP | 最短路径分词 | 440.72244 | 67.74% | 33.83% | 59 |
    | HanLP | 极速词典分词 | 7522.581 | 58.09% | 27.82% | 18 |

    (注:THULAC和stanford由于速度问题,不纳入评测)

    可以看到海量的速度和行数完美率都很优异而且达到了兼顾,行数完美率只落后更高的ltp算法1.4个百分点,速度却是它的三十多倍

    9.4GB线上数据


    | 分词器 | 分词模式 | 分词速度(字符/毫秒) |
    | -------- | -------- | ----------- |
    | ltp | / | 33.592 |
    | 海量 | / | 960.611 |
    | IctClass | 普通分词 | 198.094 |
    | HanLP | N-最短路径分词 | 201.735 |
    | HanLP | 最短路径分词 | 425.482 |
    | HanLP | 标准分词 | 473.400 |
    | HanLP | NLP分词 | 361.842 |
    | IctClass | 细粒度分词 | 689.183 |
    | FudanNLP | / | 120.860 |
    | HanLP | 极速词典分词 | 6238.916 |
    | Jieba | SEARCH分词 | 568.262 |

    (注:THULAC和stanford由于速度问题,不纳入评测)

    本表格中分词顺序按(4MB北大语料的)行数完美率进行排序,越靠前的(4MB北大语料的)行数完美率越高

    可以看出海量的分词速度十分优秀,分词速度拉开了大多数分词数倍,相比于行数完美率小幅领先的ltp要快几十倍

    海量分词插件使用方法


    安装使用


  • 下载安装 - 地址: https://github.com/HylandaOpen ... eases

    <br /> unzip plugin to folder `your-es-root/plugins/`<br />

  • 使用 elasticsearch-plugin 安装

    <br /> ./bin/elasticsearch-plugin install <a href="https://github.com/HylandaOpen/elasticsearch-analysis-hlseg/releases/download/v6.4.2/elasticsearch-analysis-hlseg-6.4.2.zip" rel="nofollow" target="_blank">https://github.com/HylandaOpen ... 2.zip</a><br />

  • 重启es集群

    实例(借用github-ik分词插件的实例)


    1.创建index

    bash<br /> curl -XPUT <a href="http://localhost:9200/hylanda_seg" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg</a><br />

    2.配置mapping

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/_mapping" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/_mapping</a> -H 'Content-Type:application/json' -d'<br /> {<br /> "properties": {<br /> "msg": {<br /> "type": "text",<br /> "analyzer": "hlseg_search"<br /> }<br /> }<br /> }'<br />

    3.插入测试数据

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/1" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/1</a> -H 'Content-Type:application/json' -d'<br /> {"content":"美国留给伊拉克的是个烂摊子吗"}<br /> '<br />

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/2" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/2</a> -H 'Content-Type:application/json' -d'<br /> {"content":"公安部:各地校车将享最高路权"}<br /> '<br />

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/3" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/3</a> -H 'Content-Type:application/json' -d'<br /> {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}<br /> '<br />

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/4" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/4</a> -H 'Content-Type:application/json' -d'<br /> {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}<br /> '<br />

    4.查询

    bash<br /> curl -XPOST <a href="http://localhost:9200/hylanda_seg/data/_search" rel="nofollow" target="_blank">http://localhost:9200/hylanda_seg/data/_search</a> -H 'Content-Type:application/json' -d'<br /> {<br /> "query": {<br /> "match": {<br /> "content": "中国"<br /> }<br /> },<br /> "highlight": {<br /> "fields": {<br /> "content": {}<br /> }<br /> }<br /> }<br /> '<br />

    返回结果

    json<br /> {<br /> "took" : 11,<br /> "timed_out" : false,<br /> "_shards" : {<br /> "total" : 5,<br /> "successful" : 5,<br /> "skipped" : 0,<br /> "failed" : 0<br /> },<br /> "hits" : {<br /> "total" : 2,<br /> "max_score" : 0.5754429,<br /> "hits" : [<br /> {<br /> "_index" : "hylanda_seg",<br /> "_type" : "data",<br /> "_id" : "4",<br /> "_score" : 0.5754429,<br /> "_source" : {<br /> "content" : "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"<br /> },<br /> "highlight" : {<br /> "content" : [<br /> "中韩渔警冲突调查:韩警平均每天扣1艘<em>中国</em>渔船"<br /> ]<br /> }<br /> },<br /> {<br /> "_index" : "hylanda_seg",<br /> "_type" : "data",<br /> "_id" : "5",<br /> "_score" : 0.2876821,<br /> "_source" : {<br /> "content" : "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"<br /> },<br /> "highlight" : {<br /> "content" : [<br /> "<em>中国</em>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"<br /> ]<br /> }<br /> }<br /> ]<br /> }<br /> }<br />

    字典配置


    <br /> 海量分词分为基础词词典CoreDict.dat和自定义词典userDict_utf8.txt。基础词词典在dictionary目录下,需要将CoreDict.zip解压后放在config目录下,可以通过修改config下的userDict_utf8.txt来更新自定义词典<br />

    自定义词典格式如下

    ---

    <br /> 1.用户自定义词典采用文本格式,utf-8编码,每行一个词<br /> <br /> 2.每个词包含三列属性,分别是词串、词的属性以及idf值的加权等级,并以Tab作为分隔,其中除了词串必填外,其他列可以不填,不填写则系统采用默认值<br /> <br /> 3.“#”表示注释,会在加载时被忽略<br /> <br /> 4.词的属性以西文逗号分隔,可以是词性、停止词标志或者自定义属性<br /> <br /> 5.词性标记参考北大标准,用于词性标注时参考,该项不填则默认为名词<br /> <br /> 6.停止词标志为:stopword,由SegOption.outputStopWord来控制是否输出停止词<br /> <br /> 7.自定义属性不参与分词过程,分词结果中若Token.userTag不为空,则可以获取到该词的自定义属性。<br /> <br /> 8.idf值的加权分5级,从低到高的定义是idf-lv1 — idf-lv5,等级越高则该词在关键词计算时的权重会越大,若不填写该值则系统默认是idf-lv3(中等权重)<br />

使用search-guard 后java代码连接不上

ly898197688 回复了问题 • 2 人关注 • 2 个回复 • 2704 次浏览 • 2018-12-17 16:09 • 来自相关话题

ES5.6.4中数值类型的term查询类型应该是TermQuery还是PointRangeQuery

回复

zhangg7723 发起了问题 • 3 人关注 • 0 个回复 • 4403 次浏览 • 2018-12-14 17:43 • 来自相关话题

Day 14 - 订单中心基于elasticsearch 的解决方案

blogsit 发表了文章 • 3 个评论 • 16235 次浏览 • 2018-12-14 15:24 • 来自相关话题

       ElasticSearch分布式搜索储存集群的引入,主要是为了解决订单数据的存储与搜索的问题。

项目背景:
      15年去哪儿网酒店日均订单量达到30w+,随着多平台订单的聚合日均订单能达到100w左右。原来采用的热表分库方式,即将最近6个月的订单的放置在一张表中,将历史订单放在在history表中。history表存储全量的数据,当用户查询的下单时间跨度超过6个月即查询历史订单表,此分表方式热表的数据量为4000w左右,当时能解决的问题。但是显然不能满足携程艺龙订单接入的需求。如果继续按照热表方式,数据量将超过1亿条。全量数据表保存2年的可能就超过4亿的数据量。所以寻找有效途径解决此问题迫在眉睫。由于对这预计4亿的数据量还需按照预定日期、入住日期、离店日期、订单号、联系人姓名、电话、酒店名称、订单状态……等多个条件查询。所以简单按照某一个维度进行分表操作没有意义。ElasticSearch分布式搜索储存集群的引入,就是为了解决订单数据的存储与搜索的问题。

具体解决方案:

1、系统性能
        对订单模型进行抽象和分类,将常用搜索字段和基础属性字段剥离DB做分库分表。存储订单详情,ElasticSearch存储搜素字段。订单复杂查询直接走ElasticSearch。如下图:

elasticsearch1.png

       通用数据存储模型

elasticsearch2.png


关键字段
    ■ 业务核心字段,用于查询过滤
系统字段
    ■ version 避免高并发操作导致数据覆盖
大字段
    ■ order_data订单详情数据(JSON)
    ■ 可灵活需要索引的字段返回的字段

 
 
2、系统可用性
     系统可用性保障:双机房高可用如下图。

       
elasticsearch3.png

     数据可用性保障:
            一、异步多写保证数据一致性。

                
二、数据补充机制:
  1、每天凌晨task扫描数据库热表数据与es数据版本进行比较。
  2、将第三方推送过来数据中的,订单号即时插入订单同步队列表中。如果数据模型解析转换、持久化成功。删除队列中订单号。同时设置1分钟一次的task 扫描队列表。
  3、推送第三方的数据也采用同样的方式。保证给第三方数据的准确性。


elasticsearch4.png


3、系统伸缩性
      elasticSearch中索引设置了8个分片,目前Es单个索引的文档达到到1.4亿,合计达到2亿条数据占磁盘大小64G,集群机器磁盘容量240G。

 
 
 

es查询性能问题

rochy 回复了问题 • 3 人关注 • 1 个回复 • 2897 次浏览 • 2018-12-14 13:07 • 来自相关话题

elasticsearch id

rochy 回复了问题 • 2 人关注 • 1 个回复 • 4663 次浏览 • 2018-12-14 13:02 • 来自相关话题

elasticsearch单值桶

回复

hnj1575565068 发起了问题 • 1 人关注 • 0 个回复 • 1552 次浏览 • 2018-12-14 09:46 • 来自相关话题

写入压测导致cpu context switch 过高,cpu sys 过高,系统卡住

zqc0512 回复了问题 • 5 人关注 • 3 个回复 • 3765 次浏览 • 2019-01-07 10:58 • 来自相关话题

spring boot 2.0可以整合elasticsearch 5.4.0吗

qqq1234567 回复了问题 • 2 人关注 • 2 个回复 • 1534 次浏览 • 2018-12-13 18:20 • 来自相关话题

query cache和filter cache的区别和联系?

rochy 回复了问题 • 3 人关注 • 1 个回复 • 2839 次浏览 • 2018-12-13 17:13 • 来自相关话题

es没有写入,监控发现有bulk的任务?

fanmo3yuan 回复了问题 • 3 人关注 • 2 个回复 • 2182 次浏览 • 2018-12-17 11:03 • 来自相关话题

ES中如何实现以下等价的solr搜索意图?

Memento 回复了问题 • 2 人关注 • 1 个回复 • 1753 次浏览 • 2019-11-07 14:53 • 来自相关话题

请教:日志已导入es,但因为一个空格没匹配到,导至无法分词,那么我能在es中修改该条日志,重新匹配吗?

rochy 回复了问题 • 2 人关注 • 1 个回复 • 2275 次浏览 • 2018-12-13 11:18 • 来自相关话题

status 503

bellengao 回复了问题 • 2 人关注 • 1 个回复 • 2823 次浏览 • 2018-12-15 10:43 • 来自相关话题