进阶-第16__深度探秘搜索技术_使用原生cross-fiels技术解决搜索弊端

本文探讨了在Elasticsearch中使用cross_fields和most_fields进行精确搜索的方法,解决了多字段匹配、长尾数据过滤及TF/IDF算法优化等问题。

使用cross-fiels进行搜索

GET /forum/article/_search

{

  "query": {

    "multi_match": {

      "query": "Peter Smith",

      "type": "cross_fields",

      "operator": "and",

      "fields": ["author_first_name", "author_last_name"]

    }

  }

}

 

搜索结果

{

  "took": 5,

  "timed_out": false,

  "_shards": {

    "total": 5,

    "successful": 5,

    "failed": 0

  },

  "hits": {

    "total": 2,

    "max_score": 0.5753642,

    "hits": [

      {

        "_index": "forum",

        "_type": "article",

        "_id": "1",

        "_score": 0.5753642,

        "_source": {

          "articleID": "XHDK-A-1293-#fJ3",

          "userID": 1,

          "hidden": false,

          "postDate": "2017-01-01",

          "tag": [

            "java",

            "hadoop"

          ],

          "tag_cnt": 2,

          "view_cnt": 30,

          "title": "this is java and elasticsearch blog",

          "content": "i like to write best elasticsearch article",

          "sub_title": "learning more courses",

          "author_first_name": "Peter",

          "author_last_name": "Smith"

        }

      },

      {

        "_index": "forum",

        "_type": "article",

        "_id": "5",

        "_score": 0.51623213,

        "_source": {

          "articleID": "DHJK-B-1395-#Ky5",

          "userID": 3,

          "hidden": false,

          "postDate": "2017-03-01",

          "tag": [

            "elasticsearch"

          ],

          "tag_cnt": 1,

          "view_cnt": 10,

          "title": "this is spark blog",

          "content": "spark is best big data solution based on scala ,an programming language similar to java",

          "sub_title": "haha, hello world",

          "author_first_name": "Tonny",

          "author_last_name": "Peter Smith"

        }

      }

    ]

  }

}

 

使用most_fields 的解决

问题1:只是找到尽可能多的field匹配的doc,而不是某个field完全匹配的doc --> 解决,要求每个term都必须在任何一个field中出现

 

Peter,Smith

 

要求Peter必须在author_first_name或author_last_name中出现

要求Smith必须在author_first_name或author_last_name中出现

 

Peter Smith可能是横跨在多个field中的,所以必须要求每个term都在某个field中出现,组合起来才能组成我们想要的标识,完整的人名

 

原来most_fiels,可能像Smith Williams也可能会出现,因为most_fields要求只是任何一个field匹配了就可以,匹配的field越多,分数越高

 

问题2:most_fields,没办法用minimum_should_match去掉长尾数据,就是匹配的特别少的结果 --> 解决,既然每个term都要求出现,长尾肯定被去除掉了

 

java hadoop spark --> 这3个term都必须在任何一个field出现了

 

比如有的document,只有一个field中包含一个java,那就被干掉了,作为长尾就没了

 

问题3:TF/IDF算法,比如Peter Smith和Smith Williams,搜索Peter Smith的时候,由于first_name中很少有Smith的,所以query在所有document中的频率很低,得到的分数很高,可能Smith Williams反而会排在Peter Smith前面 --> 计算IDF的时候,将每个query在每个field中的IDF都取出来,取最小值,就不会出现极端情况下的极大值了

 

Peter Smith

 

Peter

Smith

 

Smith,在author_first_name这个field中,在所有doc的这个Field中,出现的频率很低,导致IDF分数很高;Smith在所有doc的author_last_name field中的频率算出一个IDF分数,因为一般来说last_name中的Smith频率都较高,所以IDF分数是正常的,不会太高;然后对于Smith来说,会取两个IDF分数中,较小的那个分数。就不会出现IDF分过高的情况。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值