elasticsearch minhash 测试应用
上一章看了代码实现,算是搞明白了各参数的意义,现在开始测试,为方便以ik分词示例(对elasticsearch支持较好,测试操作简单)
首先建index,自定义 analysis
ik分词用 ik_smart 添加length filter(分词后,只要词长度3个以上的词,这个后面会说明),添加min_hash(采用默认配置),注意filter顺序.
PUT http://localhost:9200/mytest
{
"settings": {
"analysis": {
"filter": {
"mymin": {
"type":"min_hash",
"bucket_count": 512
},
"mylength":{
"type":"length",
"min":3
}
},
"analyzer": {
"minhashtest": {
"tokenizer": "ik_smart",
"filter": [
"mylength","mymin"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"desc": {
"type": "text",
"analyzer": "minhashtest"
}
}
}
}
}
分析测试 512个"乱码"
其实看到这里就明白为什么先择持minhash,尚不支持simhash了.minhash原文本索引内容,查询内容,都被构造成minhash值,minhashes的打分匹配,与其他方式完全兼容.但若要支持simhash,simhash计算相对很简单,filter转成一个二进制数据即可,但是查询时,距离,便宜数,打分,这要实现另一套逻辑,工作量相对大很多,若minhash满足需要,并没有支持simhash的紧迫性.
查看匹配详情
POST http://localhost:9200/mytest/test/_search?explain
{
"query": {
"match":{
"desc":"腾讯财经 作者 李伟8月25日,海里捞被媒体卧底后厨曝出卫生状况堪忧,当天下午海底捞针此事作出反应,称问题属实、十分愧疚,已经部署全部门店的整改计划。法制晚报卧底两家北京海底捞后厨近4个月,公布了部分图片,称老鼠在后厨地上乱窜、打扫卫生的簸箕和餐具同池混洗、用顾客使用的火锅漏勺掏下水道。涉事的是海底捞劲松店和太阳宫店。下午,海底捞方面表示,卫生问题是他们最关注的,每个月也会处理类似卫生安全事件。本次事件反应了公司管理存在问题,愿意承担经济及法律责任。1994年,创始人张勇的第一家店面开张,店内只能容纳四张餐桌。而如今,海底捞已经成为最具影响力的火锅店、最大亮点是贴心服务,包括为食客免费美甲、不限量水果等,也曾被美国哈佛商学院作为个案研究。在中国60个城市以及海外多个城市共开设了196间分店。公开资料显示,张勇拥有68%四川海底捞餐饮有限公司的股份,63%海底捞控股的股份,以及36%颐海国际控股有限公司的股份。颐海控股是海底捞火锅底料供应商,去年在香港上市。今年4月26日,张勇接受彭博访问时称,今年将可能再开新店80间,预计今年营收可达100亿元人民币,暂无意上巿;颐海国际预计今年会有20%增长。"
}
}
}
结果(实际desc:这样的块,有512条,和bucket_count数量一致,我都删掉了没贴出来)
{
"_shard": "[cdp_test][4]",
"_node": "71S4CkW-Qxy_8ftGX5Xc7g",
"_index": "cdp_test",
"_type": "test",
"_id": "AV4Y-Ws2YLxRSBHq7xfS",
"_score": 0.6328895,
"_source": {
"desc": "腾讯财经 作者 李伟8月25日,海里捞被媒体卧底后厨曝出卫生状况堪忧,当天下午海底捞针此事作出反应,称问题属实、十分愧疚,已经部署全部门店的整改计划。法制晚报卧底两家北京海底捞后厨近4个月,公布了部分图片,称老鼠在后厨地上乱窜、打扫卫生的簸箕和餐具同池混洗、用顾客使用的火锅漏勺掏下水道。涉事的是海底捞劲松店和太阳宫店。下午,海底捞方面表示,卫生问题是他们最关注的,每个月也会处理类似卫生安全事件。本次事件反应了公司管理存在问题,愿意承担经济及法律责任。1994年,创始人张勇的第一家店面开张,店内只能容纳四张餐桌。而如今,海底捞已经成为最具影响力的火锅店、最大亮点是贴心服务,包括为食客免费美甲、不限量水果等,也曾被美国哈佛商学院作为个案研究。在中国60个城市以及海外多个城市共开设了196间分店。公开资料显示,张勇拥有68%四川海底捞餐饮有限公司的股份,63%海底捞控股的股份,以及36%颐海国际控股有限公司的股份。颐海控股是海底捞火锅底料供应商,去年在香港上市。今年4月26日,张勇接受彭博访问时称,今年将可能再开新店80间,预计今年营收可达100亿元人民币,暂无意上巿;颐海国际预计今年会有20%增长。"
},
"_explanation": {
"value": 0.63288957,
"description": "weight(Synonym(desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:翗뒭朅䓰㧾筳熆 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇 desc:䢵㴿ﴃ羆膀䱇) in 0) [PerFieldSimilarity], result of:",
"details": [
{
"value": 0.63288957,
"description": "score(doc=0,freq=17192.0 = termFreq=17192.0\n), product of:",
"details": [
{
"value": 0.2876821,
"description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
"details": [
{
"value": 1,
"description": "docFreq",
"details": []
},
{
"value": 1,
"description": "docCount",
"details": []
}
]
},
{
"value": 2.1999617,
"description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:",
"details": [
{
"value": 17192,
"description": "termFreq=17192.0",
"details": []
},
{
"value": 1.2,
"description": "parameter k1",
"details": []
},
{
"value": 0.75,
"description": "parameter b",
"details": []
},
{
"value": 512,
"description": "avgFieldLength",
"details": []
},
{
"value": 1,
"description": "fieldLength",
"details": []
}
]
}
]
}
]
}
}
几种优化策略
minhash需要大量的运算
计算次数=词的个数*hash_count
内存占用=bucket_count
1 适当设置bucket_count,hash_count,bucket_count越大越准确,但这需要根据场景测试调整,如果都是短句,像微博内容 bucket_count过大也无意义,一条语句平均10个词(minhash,simhash都对短文本匹配不友好),hash_count过大,提升的效果有限,既浪费内存又浪费cpu.
2 词的个数也可以调整若是对长文本算模糊匹配,单个字完全可以忽略,之上示例加了length filter 便是为此,只保留length>3的词作minhash,无意义的词最好也都过滤掉
3 短词合并,保证单词顺序的前提下,几个短的词,合并成一个长的词,也减少了词的数量,英文推荐 shingle-tokenfilter 中文还未测试https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-shingle-tokenfilter.html
4另外 像 keyword tokenfilter ,unique tokenfilter会丢掉部分信息,可以根据情景是否采用.
5最后minhash相比simhash缺少了权重的信息,但我们可以从另一个角度来添加权重,例,对所有词统计次数,按次数排序,只对前几条作minhash.
以上部分只是思路,对不同的场景适用性不同,具体的情况还需进一步测试验证
部分功能官方filter即支持,这样最好,若官方不支持,则要自已写filter插件了
elasticsearch minhash 测试应用的更多相关文章
- 安装elasticsearch及中文IK和近义词配置
安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...
- ElasticSearch实战-日志监控平台
1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件——ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...
- ElasticSearch中文分词(IK)
ElasticSearch常用的很受欢迎的是IK,这里稍微介绍下安装过程及测试过程. 1.ElasticSearch官方分词 自带的中文分词器很弱,可以体检下: [zsz@VS-zsz ~]$ c ...
- ElasticSearch+Springboot实际应用:索引同步建设,搜索过程
1.介绍 springboot框架,众多自动化的部署和约定配置,造成了springboot的着手麻烦,熟练后可以快速快捷进行开发,常用作快捷开发的java底层框架.各位看官都是大神,自行体会. ...
- CentOS6.5安装elasticsearch+logstash+kibana
首先卸载低版本的java环境,然后安装 java环境和Apache服务 yum install -y java--openjdk httpd 安装ES环境 elasticsearch wget htt ...
- 新版elasticsearch的插件安装
安装 yum localinstall elasticsearch-6.1.1.rpm -y mkdir -p /elk/{data,logs} && chown -R elastic ...
- Elasticsearch基础知识分享
1. Elasticsearch背景介绍 Elasticsearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elast ...
- elasticsearch之分词插件使用
elasticsearch对英文会拆成单个单词,对中文会拆分成单个字.下面来看看是不是这样. 首先测试一下英文: GET /blog/_analyze { "text": &quo ...
- 学习用Node.js和Elasticsearch构建搜索引擎(2):一些检索命令
1.Elasticsearch搜索数据有两种方式. 一种方式是通过REST请求URI,发送搜索参数: 另一种是通过REST请求体,发送搜索参数.而请求体允许你包含更容易表达和可阅读的JSON格式.这个 ...
随机推荐
- [题解] LuoguP4389 付公主的背包
这个题太神辣- 暴力背包就能获得\(30\)分的好成绩...... \(60\)分不知道咋搞..... 所以直接看\(100\)分吧\(QwQ\) 用一点生成函数的套路,对于一个体积为\(v\)的物品 ...
- quartz详解1:初步了解quartz
http://blog.itpub.NET/11627468/viewspace-1763389/ 一.引入 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后 ...
- C++ 模板练习1
//特定的模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...
- 编写检测深度模型测试程序python
参考:https://blog.csdn.net/haoji007/article/details/81035565?utm_source=blogxgwz9 首先从网上下载imagenet训练好的模 ...
- C++基础--重载、重写、隐藏
1.重载(overload) 重载的概念是在同一作用域内,函数名相同,函数输入参数个数.数据类型不同,但是不能是函数名.参数个数.数据类型完全相同但返回值不同的情况.最直接的例子是常见的构造函数重载, ...
- [C/C++]'fopen': This function or variable may be unsafe
这个错误也算比较常见吧,当然这个与代码无关,是编译器的问题,主要是VS中出现的,因为微软方面认为fopen函数是不安全的,于是自己搞了一套fopen_s的函数来代替,用前面一个的话编译器是会出错的,所 ...
- Redis主从复制以及主从复制原理
Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API.从 2010年 3 月 15 日起,Redis 的开 ...
- mybatis中foreach collection的三种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- .NET技术-4.0. NETCORE跨域
.NET技术-4.0. NETCORE跨域 1.安装程序CORS程序包,一般默认都带了此程序包的 Install-Package Microsoft.AspNetCore.Mvc.Cors 2.配置C ...
- IP欺骗(XFF头等)
很多时候需要伪造一些http头来绕过WAF 1.X-Forwarded-For: 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该 ...