现在要根据关键字去检索数据,我们主要是根据name和address去检索数据,给name和address分配配置上相应的score,然后根据评分排序
另外也会传一个城市名称,需要对上面检索出的数据,再加上城市名称的评分,最后再排序
比如说有3条数据如下
|
|
name
|
address
|
cityName
|
|
1
|
环球港酒店
|
上海环球港
|
上海
|
|
2
|
陆家嘴酒店
|
陆家嘴酒店
|
天津
|
|
3
|
环球港酒店
|
天津环球港
|
天津
|
我想用关键词 环球港 去检索,另外带上城市名 天津,
首先会根据关键词搜索,忽略分词什么的,搜索出来的会是1和3,然后又有天津的城市名,所以3要排在1前面,数据一即使城市名完全不匹配也无妨,因为name和address是must必须要的,而城市名只是影响评分排序,并不会影响数据初步检索出来,所以1也是会查出的。
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(request.getKeyword(), "name", "name.pinyin").boost(nameScore));
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(request.getKeyword(), "address", "address.pinyin").boost(addressScore));
boolQueryBuilder.should(QueryBuilders.matchQuery("cityName", request.getCityName()).boost(cityScore));
全部用should,结果估计会是即使name和address完全不含关键词,也会因为城市名称匹配而检索出一些不想要的数据。
BoolQueryBuilder queryBuilderAll = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(request.getKeyword(), "name", "name.pinyin").boost(nameScore));
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(request.getKeyword(), "address", "address.pinyin").boost(addressScore));
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("cityName", request.getCityName()).boost(cityScore);
queryBuilderAll.must(boolQueryBuilder).should(matchQueryBuilder);
想达到关键词为must,而cityName只是可有可无的should类似的效果,上面写法也是不对。
初步接触es,试了许多种还是不太行,请教下应该如何下手
目前有个需求,是对品牌信息进行检索。数据结构大致如下:现在要根据关键字去检索数据,我们主要是根据name和address去检索数据,给name和address分配配置上相应的score,然后根据评分排序另外也会传一个城市名称,需要对上面检索出的数据,再加上城市名称的评分,最后再排序比如说有3条数据如下 name address cityName 1 环球港酒店 上海环球港 上海 2 陆家嘴酒店 陆家嘴酒店 天津 ..
转载并且补充:https://mp.weixin.qq.com/s/0g86s-o7kgn8ZUxA3UBc0w 请看原文
读者提问:ES 的
权重
排序
有没有示列,参考参考?
刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下。
在很多复杂的业务场景下,
排序
的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加
权重
的方式来
排序
,还是挺好用的。
首先初始化三条测试
数据
,方便查看效果:
POST score-test/_doc
"id": 1,
"title":
Elasticsearch
搜索
引擎Suggest查询建议-
权重
重要:在加载
数据
库
数据
到es时,对索引字段“suggest_name”设置的
值
进行
修改
原:对索引字段直接
进行
设
值
,如:"suggest_name": "空调"
改:对索引字段
进行
编制,加入es的提供的
权重
判断,改为设
值
为:
"suggest_name": {
"input": "空调",
"weight": 50
备注: 50 为 ,1个字在整个字符串中的占比,比如“空”就占 50%,“调”字类
当我们遇到这样的场景时:
搜索
标题中包含
java
的帖子,同时呢,如果标题中包含hadoop或
elasticsearch
就优先
搜索
出
来,同时呢,如果一个帖子包含
java
hadoop,一个帖子包含
java
elasticsearch
,包含hadoop的帖子要比
elasticsearch
优先
搜索
出
来。
解决这个需求可以使用boost
权重
来控制。
搜索
条件的
权重
,boost,可以将某个
搜索
条件的
权重
加大,此时当匹配这个
搜索
条件和匹配另一个
搜索
条件的document,计算relevance score时,匹配
权重
更大
在
Elasticsearch
中,可以使用 "function_score" 查询来实现多字段的
权重
排序
。 "function_score" 查询允许您为每个文档计算一个分数,并在查询结果中按该分数
排序
。可以使用 "boost_mode" 参数来指定怎样组合每个字段的分数。例如,可以使用 "sum" 模式将所有字段的分数相加,或使用 "avg" 模式计算所有字段的平均分数。
具体查询示例:
文章目录1. maven配置2. 等
值
查询3. 范围查询4. 模糊查询5. 多条件查询6. 集合查询7. 使用should查询8. should和must配合查询9. 有
值
查询10. 分页查询
开发过程中多使用ES的
java
API,通过
java
API来对ES的索引
进行
操作,对ES的操作一般都是通过构建QueryBuilder对象来
进行
操作。下面介绍几种QueryBuilder的构建。
1. maven配置
maven依赖
<dependency>
<groupId>org.
public void testAddScore() {
* 希望那条记录排名靠前,需要将记录中包含的字段
值
设置其加权
值
,调高加权
值
,可以使得排名越靠前。反之,靠后。
SearchResponse response = client.prepareSearch("myblog")
.setTypes("article")
//只要t.
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
Deep Learning小舟:
elasticsearch如何对搜索出的数据进行主次权重值的搜索排序
wonde2018:
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
Jashley zxx
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
啊 大禹:
求解关于下载后,文件名应是中文的为下划线,按照网上方法改成new String(fileName.getBytes("UTF-8"), "ISO8859-1")后下划线变成了乱码
关于从数据库中获得json格式数据,其中中文到前端时变成???