Elasticsearch实战(八)--- 词条为中心的 CrossFields 多字段搜索策略
Elasticsearch实战- 词条为中心的Cross Fields 搜索策略
文章目录
- Elasticsearch实战- 词条为中心的Cross Fields 搜索策略
- 1.字段中心实现方式及问题
- 1.1 准备数据
- 1.2 字段中心的MostFields 策略问题
- 1.3 三个And操作 A&&B&&C 不满足
- 2.CrossFields 词条中心搜索方式
- 2.1 CrossFields 合并多字段变大字段查询处理
- 2.2 CrossFields 提高权重控制排名
1.字段中心实现方式及问题
1.1 准备数据
empId:员工id, salary 表示薪资, deptName:部门, address:地址, provice:省份, city:市,area:区域
这里面有个数据是 专门构造的数据 “provice” : “湖北省”,“city”:“高新开发区”,“area”:“武汉” 为了演示 And 和 CrossFields区别用的
POST /testcross/_bulk
{"index":{"_id": 1}}
{"empId" : "111","name" : "员工1","age" : 20,"sex" : "男","mobile" : "19000001111","salary":1333,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"光谷大道","address":"湖北省武汉市洪山区光谷大厦","content" : "i like to write best elasticsearch article"}
{"index":{"_id": 2}}
{"empId" : "222","name" : "员工2","age" : 25,"sex" : "男","mobile" : "19000002222","salary":15963,"deptName" : "销售部","provice" : "湖北省","city":"武汉","area":"江汉区","address" : "湖北省武汉市江汉路","content" : "i think java is the best programming language"}
{"index":{"_id": 3}}
{ "empId" : "333","name" : "员工3","age" : 30,"sex" : "男","mobile" : "19000003333","salary":20000,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"经济技术开发区","address" : "湖北省武汉市经济开发区","content" : "i am only an elasticsearch beginner"}
{"index":{"_id": 4}}
{"empId" : "444","name" : "员工4","age" : 20,"sex" : "女","mobile" : "19000004444","salary":5600,"deptName" : "销售部","provice" : "湖北省","city":"武汉","area":"沌口开发区","address" : "湖北省武汉市沌口开发区","content" : "elasticsearch and hadoop are all very good solution, i am a beginner"}
{"index":{"_id": 5}}
{ "empId" : "555","name" : "员工5","age" : 20,"sex" : "男","mobile" : "19000005555","salary":9665,"deptName" : "测试部","provice" : "湖北省","city":"高新开发区","area":"武汉","address" : "湖北省武汉市东湖隧道","content" : "spark is best big data solution based on scala ,an programming language similar to java"}
{"index":{"_id": 6}}
{"empId" : "666","name" : "员工6","age" : 30,"sex" : "女","mobile" : "19000006666","salary":30000,"deptName" : "技术部","provice" : "武汉市","city":"湖北省","area":"江汉区","address" : "湖北省武汉市江汉路","content" : "i like java developer"}
{"index":{"_id": 7}}
{"empId" : "777","name" : "员工7","age" : 60,"sex" : "女","mobile" : "19000007777","salary":52130,"deptName" : "测试部","provice" : "湖北省","city":"黄冈市","area":"边城区","address" : "湖北省黄冈市边城区","content" : "i like elasticsearch developer"}
{"index":{"_id": 8}}
{"empId" : "888","name" : "员工8","age" : 19,"sex" : "女","mobile" : "19000008888","salary":60000,"deptName" : "技术部","provice" : "湖北省","city":"武汉","area":"汉阳区","address" : "湖北省武汉市江汉大学","content" : "i like spark language"}
{"index":{"_id": 9}}
{"empId" : "999","name" : "员工9","age" : 40,"sex" : "男","mobile" : "19000009999","salary":23000,"deptName" : "销售部","provice" : "河南省","city":"郑州市","area":"二七区","address" : "河南省郑州市郑州大学","content" : "i like java developer"}
{"index":{"_id": 10}}
{"empId" : "101010","name" : "张湖北","age" : 35,"sex" : "男","mobile" : "19000001010","salary":18000,"deptName" : "测试部","provice" : "湖北省","city":"武汉","area":"高新开发区","address" : "湖北省武汉市东湖高新","content" : "i like java developer i also like elasticsearch"}
{"index":{"_id": 11}}
{"empId" : "111111","name" : "王河南","age" : 61,"sex" : "男","mobile" : "19000001011","salary":10000,"deptName" : "销售部",,"provice" : "河南省","city":"开封市","area":"金明区","address" : "河南省开封市河南大学","content" : "i am not like java "}
{"index":{"_id": 12}}
{"empId" : "121212","name" : "张大学","age" : 26,"sex" : "女","mobile" : "19000001012","salary":1321,"deptName" : "测试部",,"provice" : "河南省","city":"开封市","area":"金明区","address" : "河南省开封市河南大学","content" : "i am java developer thing java is good"}
{"index":{"_id": 13}}
{"empId" : "131313","name" : "李江汉","age" : 36,"sex" : "男","mobile" : "19000001013","salary":1125,"deptName" : "销售部","provice" : "河南省","city":"郑州市","area":"二七区","address" : "河南省郑州市二七区","content" : "i like java and java is very best i like it do you like java "}
{"index":{"_id": 14}}
{"empId" : "141414","name" : "王技术","age" : 45,"sex" : "女","mobile" : "19000001014","salary":6222,"deptName" : "测试部",,"provice" : "河南省","city":"郑州市","area":"金水区","address" : "河南省郑州市金水区","content" : "i like c++"}
{"index":{"_id": 15}}
{"empId" : "151515","name" : "张测试","age" : 18,"sex" : "男","mobile" : "19000001015","salary":20000,"deptName" : "技术部",,"provice" : "河南省","city":"郑州市","area":"高新开发区","address" : "河南省郑州高新开发区","content" : "i think spark is good"}
1.2 字段中心的MostFields 策略问题
词条为中西的搜索方式, 它将所有字段当成一个大字段,并在 每个字段 中查找 每个词
字段中心查询式,就是以字段为中心,代表就是 BestFields和MostFields把所有的字段全都散列,然后从中去查询
具体的查询方式我们已经在 上一篇文章 Elasticsearch实战(七)—BestFields MostFields CrossFields 多字段搜索策略中介绍过了,但是这种方式存在一些问题,场景如下:、
举个简单的例子,地址存储的时候 你不能直接存储 ”湖北省武汉市东湖高新区“ 这样的字符串,一个完整的地址需要用多个字段来唯一标识
一般存储的时候 省/市/区 分别是"provice", “city”, "area"三个字段,那我搜寻 湖北省 武汉市 江汉区 这个完整地址 的时候,会如何查询 provice=”湖北省“ , city=“武汉市” , area=“东湖高新” ?
如果用MostFields 是什么效果?
get /testcross/_search
{"query":{"multi_match": {"query": "湖北省 武汉市 江汉区","fields": ["provice","city","area"],"type": "most_fields","operator": "and" // 或者用 or 都是不行的}}
}
- 不支持 operator=AND,没有一个doc可以match到,因为你的关键字是分布在多个字段中的 用了 and 就是 provice包含 湖北省武汉市江汉区 或者 city包含 这三个词,后者 area包含这三个词, 没有一个doc能匹配,因为字段是打散的
- 如果用 operator = OR 出来几十条, 从语义上也是错误的, 会把所有 包含湖北省,武汉市 都搜出来,因为OR操作就是任一字段匹配,就会大量重复无用数据 比如出现 湖北省 XX市 XX区 的数据,甚至是 河南省 郑州市 江汉区的类似数据,
- 搜索不准确,因为MostFields 会把多个词 计算权重后参与最终分计算,累加求和,这就导致如果 有个 郑州市的江汉区,他的权重较高,然后会影响到 湖北省武汉市东湖高新 的排序,比他会优先排序
查询结果And和Or都不行
1.3 三个And操作 A&&B&&C 不满足
有人说 简单, 这不就是 三个And操作么?直接 bool must A && B && C
get /testcross/_search
{"query":{"bool": {"must": [{"match_phrase": {"provice": "湖北省"}},{"match_phrase": {"city": "武汉"}},{"match_phrase": {"area": "高新开发区"}}]}}
}
看看结果 1条数据
似乎没什么问题, 但是 正常我们的搜索,很多时候我是不知道 他是具体什么字段的,比如我只知道 省/市/区 这三个ABC字段中包含了 湖北省,武汉,高新开发区的 查询字段, 就给我命中 返回,我不关心 哪个字段匹配上,只要三个字段都存在就行
到底是 A:湖北省 B:武汉 C:高新开发区
还是 A:武汉 B:湖北省,C:高新开发区
还是 A:湖北省, B:高新开发区,C:武汉
所以And也是不满足的
解决方案:
以上原因在于我们是在多个field中处理。我们也不关系具体哪些字段,我们只需要将多个field的信息整合成一个即可。就是本文讲的词条为中心的CrossFields 搜索
2.CrossFields 词条中心搜索方式
2.1 CrossFields 合并多字段变大字段查询处理
针对上面的查询 如果要用MostFields 查询的话,Operate And操作,解析完后
provice 包含 湖北省 且 武汉市 且江汉区的 doc
city 包含 湖北省 且 武汉市 且江汉区的 doc
area 包含 湖北省 且 武汉市 且江汉区的 doc
一定是搜不出来结果的
如果是词条搜索的话,解析完后就是 ,词 湖北省 和 武汉市 和 江汉区 都必须出现,但是可以出现在任意字段中。provice 包含 湖北省 或者 武汉市 或者 江汉区
且 city 包含 湖北省 或者 武汉市 或者 江汉区
且 area 包含 湖北省 或者 武汉市 或者 江汉区
get /testcross/_search
{"query":{"multi_match": {"query": "湖北省 武汉 高新开发区","fields": ["provice","city","area"],"type": "cross_fields","operator": "and"}}
}
查询结果 :2条数据, 和三个And 操作查询结果不一致, 这才是我们想要的结果
我不关系具体哪个字段匹配上了, 我之关系, 只要这三个字段都能找到 就认为是命中结果,把三个字段当成大字段处理,只要三个搜索田间在大字段中全都存在 ,就认为满足
2.2 CrossFields 提高权重控制排名
可以查看刚才CrossFields的查询结果
员工 | 分数 |
---|---|
员工10 | 8.52814 |
员工5 | 7.311427 |
如果 provice, city 及area 每个词的权重不同, 比如 想要把city权重放的更高点,让权重优先的更考前的返回,我们可以直接在fields中计入 权重计算, 可以看到 city 被我改成了 city ^ 2 就是权重扩大 2倍,默认都是1倍
get /testcross/_search
{"query":{"multi_match": {"query": "湖北省 武汉 高新开发区","fields": ["provice","city^2","area"],"type": "cross_fields","operator": "and"}}
}
看下结果:
city:高新开发区的被提前了 ,因为 city:武汉 有很多个文档,但是city:高新开发区的就只有几个,所以 TFIDF模型认为 高新开发区 的权重在city字段上更有代表性,所以权重更大,这就影响了结果的排序
至此 我们已经能够 讲解了CrossFields 的用法及与BestFields和MostFields的区别 下一篇,我们讲一下 BestFields/MostFields/CrossFields 哪些参数可以影响他们的结果,参数到底有什么用
Elasticsearch实战(八)--- 词条为中心的 CrossFields 多字段搜索策略相关推荐
- elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心...
1.最佳字段(Best fields):: 假设我们有一个让用户搜索博客文章的网站(允许多字段搜索,最佳字段查询),就像这两份文档一样: PUT /my_index/my_type/1 {" ...
- ElasticSearch实战-入门
1.概述 今天接着<ElasticSearch实战-日志监控平台>一文来给大家分享后续的学习,在<ElasticSearch实战-日志监控平台>中给大家介绍一个日志监控平台的架 ...
- ElasticSearch实战系列十一: ElasticSearch错误问题解决方案
前言 本文主要介绍ElasticSearch在使用过程中出现的各种问题解决思路和办法. ElasticSearch环境安装问题 1,max virtual memory areas vm.max_ma ...
- Elasticsearch实战——function_score 查询详解
Elasticsearch实战--function_score 查询详解 文章目录 Elasticsearch实战--function_score 查询详解 1. function_score简介 2 ...
- ElasticSearch实战-日志监控平台
1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件--ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...
- Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)
Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录
- python将pandas dataframe内容写入ElasticSearch实战
python将pandas dataframe内容写入ElasticSearch实战 目录 python将pandas dataframe内容写入ElasticSearch实战 索引设置 数据写入 数 ...
- elasticsearch实战三部曲之三:搜索操作
elasticsearch实战三部曲之三:搜索操作 2019年01月13日 21:35:18 博陵精骑 阅读数:1367 标签: elasticsearch 更多 个人分类: elasticsearc ...
- 深入理解ElasticSearch(八):索引管理
索引管理 1.创建一个索引 到目前为止, 我们已经通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射.现在我们需要对这个建立索引的过程做更多的 ...
最新文章
- 集成 Kendo UI for Angular 2 控件
- CentOS 7.3 安装配置RabbitMQ
- Cannot find module with tag 'cpufeatures' in import path
- 项目开发中的注意事项
- hdu 1576 A/B
- 聊聊.net 程序设计——命名规范(上)
- 《设计模式详解》结构型模式 - 代理模式
- LeetCode 410. Split Array Largest Sum
- Nginx 实现封杀恶意访问
- 哪些情况需用到数据分析工具
- springboot 指定 logback_spring boot与日志
- java.lang.ArrayStoreException 已解决 byte[]数组拷贝问题
- Nginx 自定义404 页面
- WAMP5配置本地服务器(超级详细教程)
- python 中文转换 url 编码
- 哪种程序员最挣钱?平均月薪30.8K,网友说这是掌握世界的技术!
- matlab 扫雷,matlab 扫雷
- java打印字符串显示_JAVA调用系统打印机打印字符串
- 复数的辐角的主值的计算公式
- CodeSmith Professional v5.1.3.8510 破解(2009.7.1)
热门文章
- 755. 平方矩阵 III
- 华控清交徐葳——参与新型数据交易所构建,实现规模化数据交易的可控可计量
- Python多进程之刷小网站浏览量。
- NIPS搜领域自适应
- 英特尔530和535哪个好_2020联想小新Air 14英特尔版和锐龙版怎么选,有什么区别...
- 什么是oracle的直方图
- 子曰:“不在其位,不谋其政。”----《论语·泰伯》
- windows/mac在本地电脑上搭建AI人工智能绘画工具Stable Diffusion
- 训练营感想_为什么训练营很有价值
- 百度与hao123 网址之家的故事,写在好123荣登百度首页之时