主要知识点:

  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. java-javabean Introspector的应用

    Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性.事件和方法的知识提供了一个标准方法. 对于这三种信息,Introspector 将分别分析 bean 的类和超类, ...

  2. JDBC高级特性(一)结果集,批量更新

    一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...

  3. 大神是如何装逼的 之 vim插件使用taglist和nerdtree

    本文转载自:http://blog.csdn.net/yaoxingshuai/article/details/51385332 本文主要讲述如何在vim下配置taglist,nerdtree(看代码 ...

  4. 2018.2.24Test总结

    T1(luogu3434) comment:水题,考试时我想的是开一个数组在读入时预处理出该长度什么时候会被拦住,但这样数组开不下,剩下只能模拟. 实际上应该把圆筒变成递减序列,再二分该长度即可. T ...

  5. 能够完成qq信息提醒的代码

    下面这个网址就帮咱们实现了QQ提醒的功能,别被它的外面吓坏,虽然是长的有点恶心,但是它可是一段“神奇代码”. http://qzs.qq.com/snsapp/app/bee/widget/open. ...

  6. 湖南集训day5

    难度:☆☆☆☆☆☆☆ /* 二分答案 算斜率算截距巴拉巴拉很好推的公式 貌似没这么麻烦我太弱了...... 唉不重要... */ #include<iostream> #include&l ...

  7. km算法(二分图最大权匹配)学习

    啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...

  8. P3194 [HNOI2008]水平可见直线

    传送门 我们把所有的直线按斜率从小到大排序,然后用单调栈维护 发现,如果当前直线与\(st[top-1]\)直线的交点的横坐标大于等于与\(st[top]\)的交点的横坐标,当前直线可以覆盖掉\(st ...

  9. Appium + python - TouchAction操作

    from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionfrom appium. ...

  10. mahjong

    题目描述 “为什么, 你们的力量在哪里得到如此地......”“我们比 1 分钟前的我们还要进步, 虽然很微小, 但每转一圈就会前进一寸.这就是钻头啊!”“那才是通向毁灭的道路.为什么就没有意识到螺旋 ...