主要知识点:

  1. 在index的mapping中加copy_to字段的方法
  2. copy_to搜索方法

 
 

用most_fields策略,去实现cross-fields搜索,有3大弊端,为了解决这三个弊端,es的第一个办法就是用copy_to将多个field组合成一个field。

most_fields策略问题就出在有多个field,es只要将一个标识跨在多个field的情况,合并成一个field即可。比如说,一个人名,本来是first_name,last_name,现在合并成一个full_name,这样就能有效的解决问题。

 
 

一、在index的mapping中加copy_to字段的方法

 
 

PUT /forum/_mapping/article

{

"properties": {

"new_author_first_name": {

"type": "string",

"copy_to": "new_author_full_name"

},

"new_author_last_name": {

"type": "string",

"copy_to": "new_author_full_name"

},

"new_author_full_name": {

"type": "string"

}

}

}

 
 

二、插入数据

用了这个copy_to语法之后,就可以将多个字段的值拷贝到一个字段中,并建立倒排索引

 
 

POST /forum/article/_bulk

{ "update": { "_id": "1"} }

{ "doc" : {"new_author_first_name" : "Peter", "new_author_last_name" : "Smith"} }                

{ "update": { "_id": "2"} }        

{ "doc" : {"new_author_first_name" : "Smith", "new_author_last_name" : "Williams"} }                

{ "update": { "_id": "3"} }

{ "doc" : {"new_author_first_name" : "Jack", "new_author_last_name" : "Ma"} }                        

{ "update": { "_id": "4"} }

{ "doc" : {"new_author_first_name" : "Robbin", "new_author_last_name" : "Li"} }                        

{ "update": { "_id": "5"} }

{ "doc" : {"new_author_first_name" : "Tonny", "new_author_last_name" : "Peter Smith"} }                

 
 

注意:用 get /forum/article/_serarch 这种方法是不能查出new_author_full_name这个字段的,因为copy_to的字段类型于_all的字段。

 
 

三、进行搜索

GET /forum/article/_search

{

"query": {

"match": {

"new_author_full_name": "Peter Smith"

}

}

}

 
 

这样,我们搜索时就搜索的是new_author_full_name这一个字段,所以就不会出现那三个弊端。

  弊端1:只是找到尽可能多的field匹配的doc,而不是某个field完全匹配的doc --> 解决,最匹配的document被最先返回

  弊端2:most_fields,没办法用minimum_should_match去掉长尾数据,就是匹配的特别少的结果 --> 解决,可以使用minimum_should_match去掉长尾数据

  弊端3:TF/IDF算法,比如Peter Smith和Smith Williams,搜索Peter Smith的时候,由于first_name中很少有Smith的,所以query在所有document中的频率很低,得到的分数很高,可能Smith Williams反而会排在Peter Smith前面 --> 解决,Smith和Peter在一个field了,所以在所有document中出现的次数是均匀的,不会有极端的偏差

 
 

四、其他说明:

  这几节课学的知识,在很多时候很难复现。比如官网也会给一些例子,说用什么什么文本,怎么怎么搜索,是怎么怎么样的效果,但上实际情况去es中执行的时候并没有复现。这是因为es版本在不断迭代,打分算法也在不断的迭代。所以对类似这几讲讲解的best_fields,most_fields,cross_fields,完全复现出来应有的场景和效果是很难的。更多是掌握有原理和知识点,以及做法,

16.copy_to定制组合field解决cross-fields搜索弊端的更多相关文章

  1. 具有相同名称 的类/接口已在使用。请使用类定制设置来解决此冲突。java调用第三方的webservice应用实例

    WSDLToJava Error: http://10.96.84.124:81/BTRPWebServiceForSMB/OnSMBOrderService.svc?xsd=xsd0 [0,0]: ...

  2. Hibernate:组合模式解决树的映射

    树经常用来展示目录结构,那么在Hibernate中怎样解决树的映射问题呢? 先来看一个分销商的树形结构的例子 所有分销商 东北区 辽宁省 沈阳医药 吉林省 华北区 北京市 北京医药 河北省 华南区 那 ...

  3. ASP.NETMVC4 分页组合查询解决方法

    本人新手刚在webform转到mvc   像linq  ef啥的,都是不会的不行不行的,不会就问群友,找资料 今天本屌遇到了一个分页组合查询的问题,解决了2个小时,把代码共享给大家 话不多话,直接上代 ...

  4. [转载]robo3t在Ubuntu 16.04中报错的解决方法

    [问题] MongoDB的客户端robo3t在,Ubuntu 16.04中启动时报一个QT的错误: This application failed to start because it could ...

  5. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)

    php正则匹配6到16位的字符串. 只允许包含数字.字母.下划线组成的6到16位字符,符合返回ture,否则返回false. 解答: 6到16位,正则可以这样写:{6,16}. 任意的字符6到16位的 ...

  6. STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法

    问题 上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题: 我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输 ...

  7. 利用 pyhon 解决 Cross Origin Requests

    在学习 ajax 时遇到了一个问题 XMLHttpRequest cannot load file:xxxxxxxx . Cross origin requests are only supporte ...

  8. 【Ubuntu 16】 wifi连接 并解决无桌面图标问题

    笔记本上装了win10和ubuntu16双系统,ubuntu16有半年多没使用了,今天一登录成功后,没有桌面啦,一个干净的壁纸映入眼帘,真操蛋. 上网搜索后总结:应该是应用软件中心出了问题,可是,没法 ...

  9. Makefile:160: recipe for target 'all' failed (Ubuntu 16.06 + Opencv3.2)解决办法

    前言 之前一直用的opencv 好好的,今天安装了anaconda之后,python中的opencv不能用了,即便是拷贝cv2.so之后也是不能用,问题如下: 根本原因 安装anaconda之后,很多 ...

随机推荐

  1. oc69--NSMutableString

    // main.m // NSMutableString基本概念,NSString是不可变字符串,NSMutableString是可变字符串.NSMutableString继承NSString,所以N ...

  2. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

  3. 【洛谷4770/UOJ395】[NOI2018]你的名字(后缀数组_线段树合并)

    题目: 洛谷4770 UOJ395 分析: 一个很好的SAM应用题-- 一句话题意:给定一个字符串\(S\).每次询问给定字符串\(T\)和两个整数\(l\).\(r\),求\(T\)有多少个本质不同 ...

  4. 如何查看jdk的版本

    (1)WINDOWS环境下 实验环境:WIN7 64bit 操作指令:cmd命令下输入“java -version” 参考如下:JDK1.7 (2).LINUX环境下 实验环境:CentOS 5.6 ...

  5. session一致性架构设计实践.

    一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...

  6. js加减乘除在线计算器代码

    js加减乘除在线计算器代码 在线演示本地下载

  7. nginx下如何配置 ssl证书?腾讯云ssl证书为例!

    nginx下如何配置 ssl证书?腾讯云ssl证书为例! 目前为止,https已经成为一种趋势,想要开启https就需要ssl证书. 首先,为域名注册ssl证书. 腾讯云注册地址:https://cl ...

  8. 巧用Eclipse Java编辑器调试

    在使用Eclipse开发Java Web应用时,使用的编辑器不但能够为开发者提供代码编写.辅助提示和实时编译等常用功能,而且还能够对Java源代码进行快捷修改.重构和语法纠错等高级操作.通过Eclip ...

  9. 删除过期备份报错RMAN-06207 RMAN-06208解决方案

    RMAN备份日志中出现了警告 日志文件目录如下: [root@erpdbs rmanback]# ll total 88 -rw-r--r-- 1 oraprod dba 81011 Sep 7 22 ...

  10. XML——读与写

    XML写入 private static void writeXml() { using (XmlTextWriter xml = new XmlTextWriter(@"C:\Users\ ...