zoukankan      html  css  js  c++  java
  • 16.copy_to定制组合field解决cross-fields搜索弊端

    主要知识点:

    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_namelast_name,现在合并成一个full_name,这样就能有效的解决问题。

       

    一、在indexmapping中加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被最先返回

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

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

       

    四、其他说明:

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

  • 相关阅读:
    【转】Android listview与adapter用法
    【转】 Android Fragment 真正的完全解析(下)
    Jupyter Notebook 基本使用
    斯坦福CS231n学习--初识
    MatConvNet 练习使用CNN
    数据库系统学习(四)- 关系模型之关系代数
    操作系统学习(一)--概述启动过程
    数据库系统学习(三)- 关系模型之基本概念
    数据库系统学习(二)- 基础模型
    数据库系统学习(一)-入门篇
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8526390.html
Copyright © 2011-2022 走看看