cross_fields类型采用了一种以词条为中心(Term-centric)的方法,这种方法和best_fields及most_fields采用的以字段为中心(Field-centric)的方法有很大的区别。

它将所有的字段视为一个大的字段,然后在任一字段中搜索每个词条。

operator:operator设为了and,表示所有的词条都需要出现;

minimum_should_match:表示文本匹配度,控制搜索精度,向下取整。

相比most_fields与best_fields,解释起来可能费力一些,我们不妨根据问题来引导说明。

  一、cross_fields能解决什么问题?

有一类实体存储,比如人名,地址等,不是存储在单一的field里边,人名可以分为first_name,last_name。

地址有street, country, city等字段组成。这类实体查询的特殊性在于,每一个single query string都是跨越了多个字段(请仔细理解这句话)。

前边用的most_field的方法并不能满足我们的要求,会带来错误的结果。原因有几个:

1)  most_field是用来找出最佳的field,这个field能满足最多的word的匹配,而不是跨越多个field去寻找最佳满足words的匹配。
   2) 不能使用operator和minimum_should_match来减少相关性低的doc的长尾问题
   3) 每一个field的tf是不一样的,相互之间交错会产生不好的排序结果。

   most_field问题的根本原因就在于:most_field是field centric的,目的就是寻找最佳匹配的field,而我们想要的是最佳匹配的term。
   best_field也存在同样问题,他们都是field centric。我们来看看问题是如何产生的,如何解决之。

  (1)在多个field中匹配到同样的word

    most_field实质是生成了多个match子查询,每个子查询针对一个field,然后包装成一个bool查询。
    因此,如果同一个word在多个field中都出现,相比,两个word同时在一个field中出现,谁得分更高?显然是第一个,但不是我们想要的结果。

演示过程在most_field章节有具体的说明。

(2)运用operator/minimun_should_match来解决长尾

    显而易见,如果指定了operator=AND,没有一个doc可以match到,从语义上也是错误的。

   (3)  现在我们查询Peter Smith,在first_name和last_name中。Peter是一个很普遍的first_name,smith是一个很普遍的last_name。因此两者都具有较低的idf。

但是,如果我们有一个doc是Smith Williams?smith可是一个不常见的first_name。但        是返回结果呢?Smith Williams得分更高,但是我们要查询的是Peter Smith啊???原因就在于Smith在first_name中的高idf已经压过了peter作为一个低      idf出现在的first_name中和smith作为一个低idf出现在last_name中。

  解决方案:

  以上原因在于我们是在多个field中处理。因此我们只需要将多个field的信息整合成一个即可。

  比如:生成一个full_name字段(可以用custom _all field的方法,mapping中设置copyto参数),包括first_name和last_name。

我们针对full_name做查询,以上三个问题就不会出现。

  但是,我们存储了冗余的信息。elasticsearch考虑到这一点,提出了另外一个解决方案,就是cross fields query。

二、cross fields query

对于上述问题,custom all是一种不过的解决方案,除了冗余信息以外,这种方案是在index过程中就要指定的,有没有在查询时的解决方法呢?es提供了cross field query的解决方案。

best field 和 most field是field centric的,而cross field是term centric的。这是最大的不同。cross field把multi field 看做一整个field,在这一个field里边去match 每一个term,相当于在多个field中match。

field centric的逻辑是这样的(operator=AND):

(+first_name Peter +first_name Smith)

(+last_name Peter +last_name Smith)

term centric的逻辑是这样的(operator=AND):

+(first_name Peter last_name Peter)

+(last_name Smith last_name Smith)

也就是说peter必须出现在其中一个字段中,同时smith也必须出现在其中一个字段中。

所以cross field其实是首先分析query string 产生一个 term list,针对每一个term在任何一个field中match。

因为6中问题1 问题2就解决了,问题3呢?

cross field 在field之间把inf混合起来,作为一个整体。

+blended(“peter” fields:[ "first_name", "last_name"])

+blended(“smith” fields:[ "first_name", "last_name"])

也就是说同时在first_name和last_name中查询smith的idf,取最小值。这样smith作为一个普通的last_name,也作为一个普通的first_name。

问题3解决。

注意一点:cross fields search中的field要使用同样的analyzer。如果使用不同的analyzed,则会按照analyzer对fields进行分组blended,工作模式类似于best field。

比如title使用了一个analyzer,first_name 和last_name 使用了另外一个analyzer,则

(+title peter +title smitch)



+blended(“peter” fields:[ "first_name", "last_name"])

+blended(“smith” fields:[ "first_name", "last_name"])



cross field相对于custom all的优势在于:可以在查询时指定每一个field的boost值。

Elasticsearch搜索之cross_fields分析的更多相关文章

  1. Elasticsearch搜索之most_fields分析

    顾名思义,most_field就是匹配词干的字段数越多,分数越高,也可设置权重boost. 下面是简易公式(详细评分算法请参考:http://m.blog.csdn.net/article/detai ...

  2. Elasticsearch搜索之best_fields分析

    顾名思义,best_field就是获取最佳匹配的field,另个可以通过tie_breaker来控制其他field的得分,boost可以设置权重(默认都为1). 下面从宏观上来讲的简单公式: scor ...

  3. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

  4. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  5. elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复

    摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...

  6. ElasticSearch 线程池类型分析之 ExecutorScalingQueue

    ElasticSearch 线程池类型分析之 ExecutorScalingQueue 在ElasticSearch 线程池类型分析之SizeBlockingQueue这篇文章中分析了ES的fixed ...

  7. ElasticSearch 线程池类型分析之 ResizableBlockingQueue

    ElasticSearch 线程池类型分析之 ResizableBlockingQueue 在上一篇文章 ElasticSearch 线程池类型分析之 ExecutorScalingQueue的末尾, ...

  8. Elasticsearch搜索资料汇总

    Elasticsearch 简介 Elasticsearch(ES)是一个基于Lucene 构建的开源分布式搜索分析引擎,可以近实时的索引.检索数据.具备高可靠.易使用.社区活跃等特点,在全文检索.日 ...

  9. 看完这篇还不会 Elasticsearch 搜索,那我就哭了!

    本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性. Search ...

随机推荐

  1. maven 项目发布时,无法引用 修改的domain 问题

    其实是在bo 的smart-score 里面引用了这个interface    所以还要把 smart -Score 重新发布一下.让这个smart 引用 新的 Player-service  中的i ...

  2. 版本管理工具 —— SVN

    想想我们在开发过程中是不是会遇到这样的情况: 今天写了很长的一段代码,觉得不合理,然后删了,第二天突然发现昨天的那段代码才是正确的,那怎么办,也无法撤销删除的代码? 还有团队中多人共同开发一个项目,如 ...

  3. Sort List leetcode

    这个题一开始本想用快速排序的,但是想了20分钟都没有头绪,难点在于快速排序的随机访问无法用链表实现,不过如果可以实现快速排序partition函数就可以了,但是这可能比较复杂,于是改用其他排序方法,上 ...

  4. Node.js web快速入门 -- KoaHub.js组件koa-static-server

    koa-static-server Static file serving middleware for koa with directory, rewrite and index support k ...

  5. 在node中使用 ES6

    ES6+ 太棒了,但是很多高级功能node是不支持的,就需要使用babel转换成ES5, 1.安装babel依赖 npm install babel-core --save-dev 2.安装babel ...

  6. 求助,如何干掉这个不要脸的“流氓”

      问题 chrome 第一次打开时,被一个加"7654 导航"的网站捆绑. 查看设置中启动页中,被设置如下:   解决   域名查看,阿里竟然为这样的网站搞隐私保护   尝试 安 ...

  7. python 语法笔记(一)

    #python3里面input默认接收到的事str类型,而python2里面却认为是int类型n=int(input('请输入想要第几个数')) #如果将int省去,python3中该程序将会报错a, ...

  8. 【转】请求处理机制其一:进入Django前的准备

    一个 Request 到达了! 首先发生的是一些和 Django 有关(前期准备)的其他事情,分别是: 如果是 Apache/mod_python 提供服务,request 由 mod_python ...

  9. Mybatis的@Options注解

    mybatis的@Options注解能够设置缓存时间,能够为对象生成自增的key 第一个使用场景: 有一个表 CREATE TABLE instance ( instance_id BIGINT UN ...

  10. python服务器环境搭建(2)——安装相关软件

    在上一篇我们在本地的虚拟服务器上安装好CentOS7后,我们的python web服务.自定义的python service或python脚本需要在服务器上运行,还需要在服务器安装各种相关的软件才行, ...