ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据
检索出的数据列表按字段匹配的优先顺序
一、举例
比如,发布一篇文章,文章包括基本的字段包括标题、发布时间、点击率、关键字、内容。当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据,举例:
id title keyword content
纳税 继续教育,赡养父母,房屋贷款 教育,子女
上学 义务教育 好好学习天天向上
毕业 好好工作好好学习 结束教育教育
有以上三条数据,如果按照默认的ES检索机制,会按照最多匹配的优先级,比如,id为1的keyword和content字段都包括教育关键字,id为1的会排在最前面,同时id为2和3的,id3更有匹配度,包括两个教育关键字,可能ES给检出的数据排序为1、3、2(这里只是猜测,懒得动手了)
二、需求
在公司需求中有这么一个要求,首先,检索数据会先检索出关键字(keyword)的数据,点击加载更多按钮,再检索关键字(keyword)和内容(content)同时包括的数据,并且匹配关键字的优先展示在前面。
如果不了解ES强大的童鞋可能会在检索出所有数据的时候然后再把数据处理一遍。BUT,ES的排序机制是很强大的,我在根据公司产品需求搜了各种相关的帖子,一边了解一边实践,最终走通了产品需求想要的效果。
三、代码
$query = new \Elastica\Query();
$MultiMatch_obj = new \Elastica\Query\MultiMatch();
$MultiMatch_obj->setQuery($keyword);
if ($search_type == 'default') {
//这里是首先默认加载匹配关键字的列表
$MultiMatch_obj->setFields(array('keywords'));
} else {
//点击加载更多匹配出包括关键字和内容的列表
$MultiMatch_obj->setTieBreaker(0.3);
//设定Breaker
$MultiMatch_obj->setType('best_fields');
//开启best_fields
$MultiMatch_obj->setFields(array('keywords^901209','content'));
//要优先的keywords 加一个^,后面还跟一个数字(数字随便写的,我觉得比content大就可以了,content应该也是可以跟^数字的 $MultiMatch_obj->setOperator('or');
$MultiMatch_obj->setMinimumShouldMatch('30%'); //这里还需要设定
}
$query->setQuery($MultiMatch_obj); //命中全部纪录
四、参考
https://www.cnblogs.com/bonelee/p/6827068.html
https://www.cnblogs.com/clonen/p/6674922.html
https://www.cnblogs.com/yjf512/p/4897294.html
五、手册
解决ES搜索拼音字母的一部分搜不到数据
问题通:https://elasticsearch.cn/question/5418
$Wildcard_query1 = new \Elastica\Query\Wildcard('keywords',"*". $keyword."*");
$Wildcard_query2 = new \Elastica\Query\Wildcard('title',"*". $keyword."*");
$Wildcard_query3 = new \Elastica\Query\Wildcard('content',"*". $keyword."*");
$query->addShould($Wildcard_query1)->addShould($Wildcard_query2)->addShould($Wildcard_query3);

ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据的更多相关文章
- 用Elasticsearch做大规模数据的多字段、多类型索引检索
本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...
- ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)
目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...
- 用 mongodb + elasticsearch 实现中文检索
而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库. 当然,可以在 web 应用中存储数据的时候,再主动写一份到 ...
- SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)
1.插入检索出的数据 select * from dbo.Customers_1
- python 使用 elasticsearch 常用方法(检索)
#记录es查询等方法 #清楚数据 curl -XDELETE http://xx.xx.xx.xx:9200/test6 #初始化数据 curl -H "Content-Type: appl ...
- 基于Elasticsearch进行地理检索,计算距离值
实现步骤: 1.定义属性 [Serializable] public class Coordinate { public double Lat { get; ...
- pb中sql语句用to_char查询出来数据,居然无法检索出数据,oracle数据库,这是什么原因?
/*这样dw_modified总是无法检索出正确的结果*/ ') into :is_recoder_old_sn from emra03 where szybh01 = :as_pat_id and ...
- 解决Javascript大数据列表引起的网页加载慢/卡死问题。
在一些网页应用中,有时会碰到一个超级巨大的列表,成千上万行,这时大部份浏览器解析起来就非常痛苦了(有可能直接卡死). 也许你们会说可以分页或动态加载啊?但是有可能需求不允许分页,动态加载?网络的延迟也 ...
- ElasticSearch(一)ElasticSearch的应用场景及为什么要选择ElasticSearch?
先了解一下数据的分类 结构化数据又可以称之为行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据.其实就是可以能够用数据或者统一的结构加以表示的数据.比如在数据表存储商品的库存,可以用整型表示 ...
随机推荐
- scheduling while atomic和bad: scheduling from the idle thread(转)
https://blog.csdn.net/shanzhizi/article/details/22949121 https://blog.csdn.net/wwwtovvv/article/deta ...
- java.util中,util是什么意思
Util是utiliy的缩写,是一个多功能.基于工具的包. java.util是包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机 ...
- python基础3 条件判断 if嵌套
if单向判断: stonenumber=6#为宝石数量赋值 if stonenumber>=6: #条件:如果你拥有的宝石数量大于等于6个 print('你拥有了毁灭宇宙的力量') #结果:显示 ...
- 循环结构 : while .. for
# ###循环结构 : while .. for ''' while 循环 可以提高代码的效率,减少代码的冗余 while 条件表达式: code1 code2 如果条件表达式成立,返回True , ...
- btcpool之GbtMaker
一.简介 GbtMaker全称getblocktemplate maker,它通过getblocktemplate rpc接口从bitcoind获得挖矿所需数据,然后把该数据发送到kafka消息队列. ...
- Linux系统常用升级的基础包
Linux系统常用升级的基础包 yum -y install lrzsz gcc gcc-c++ make flex autoconf automake vixie-cron libjpeg libj ...
- 使用jEnv在Mac/Linux环境配置多版本Java
jEnv 是什么? 先来看一下官方介绍 jEnv is a command line tool to help you forget how to set the JAVA_HOME environm ...
- 2018-2019-2 网络对抗技术 20165321 Exp4 恶意代码分析
1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...
- des加密算法java&c#
项目中用到的数据加密方式是ECB模式的DES加密得到的十六进制字符串.技术支持让写一个.net版的加密算法.这里做一下记录. java版: 16进制使用的是bouncycastle. import c ...
- 测试客户端连接12c ASM实例
环境:Oracle 12.2.0.1 RAC 背景:用户反映12c ASM创建的用户具备sysasm权限,但无法在客户端连接到ASM实例,且没有报错. 1.ASM实例创建用户赋予sysasm权限 2. ...