美文网首页
es多字段查询Multi_Field_Search----最佳字

es多字段查询Multi_Field_Search----最佳字

作者: 领带衬有黄金 | 来源:发表于2019-11-27 14:39 被阅读0次

最佳字段

假设有个网站允许用户搜索博客的内容,以下面两篇博客内容文档为例:

PUT /my_index/my_type/1
{
    "title": "Quick brown rabbits",
    "body":  "Brown rabbits are commonly seen."
}

PUT /my_index/my_type/2
{
    "title": "Keeping pets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}

用户输入词组 “Brown fox” 然后点击搜索按钮。事先,我们并不知道用户的搜索项是会在 title 还是在 body 字段中被找到,但是,用户很有可能是想搜索相关的词组。用肉眼判断,文档 2 的匹配度更高,因为它同时包括要查找的两个词:

现在运行以下 bool 查询:

{
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

但是我们发现查询的结果是文档 1 的评分更高:

{
  "hits": [
     {
        "_id":      "1",
        "_score":   0.14809652,
        "_source": {
           "title": "Quick brown rabbits",
           "body":  "Brown rabbits are commonly seen."
        }
     },
     {
        "_id":      "2",
        "_score":   0.09256032,
        "_source": {
           "title": "Keeping pets healthy",
           "body":  "My quick brown fox eats rabbits on a regular basis."
        }
     }
  ]
}

为了理解导致这样的原因,需要回想一下 bool 是如何计算评分的:

  1. 它会执行 should 语句中的两个查询。

  2. 加和两个查询的评分。

  3. 乘以匹配语句的总数。

  4. 除以所有语句总数(这里为:2)。

文档 1 的两个字段都包含 brown 这个词,所以两个 match 语句都能成功匹配并且有一个评分。文档 2 的 body 字段同时包含 brownfox 这两个词,但 title 字段没有包含任何词。这样, body 查询结果中的高分,加上 title 查询中的 0 分,然后乘以二分之一,就得到比文档 1 更低的整体评分。

在本例中, titlebody 字段是相互竞争的关系,所以就需要找到单个 最佳匹配 的字段。

如果不是简单将每个字段的评分结果加在一起,而是将 最佳匹配 字段的评分作为查询的整体评分,结果会怎样?这样返回的结果可能是: 同时 包含 brownfox 的单个字段比反复出现相同词语的多个不同字段有更高的相关度。

dis_max 查询

不使用 bool 查询,可以使用 dis_max 即分离 最大化查询(Disjunction Max Query) 。分离(Disjunction)的意思是 或(or) ,这与可以把结合(conjunction)理解成 与(and) 相对应。分离最大化查询(Disjunction Max Query)指的是: 将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回

{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

得到我们想要的结果为:

{
  "hits": [
     {
        "_id":      "2",
        "_score":   0.21509302,
        "_source": {
           "title": "Keeping pets healthy",
           "body":  "My quick brown fox eats rabbits on a regular basis."
        }
     },
     {
        "_id":      "1",
        "_score":   0.12713557,
        "_source": {
           "title": "Quick brown rabbits",
           "body":  "Brown rabbits are commonly seen."
        }
     }
  ]
}

相关文章

  • es多字段查询Multi_Field_Search----最佳字

    最佳字段 假设有个网站允许用户搜索博客的内容,以下面两篇博客内容文档为例: 用户输入词组 “Brown fox” ...

  • 数据查询

    ES查询用例 单个index 1、全文检索 多字段查询 2、地图搜索 地图字段查询,依赖数据中包含带有geo_lo...

  • Elasticsearch Search API

    在ES中,text类型的字段,保存时会分词,查询时也会分词后进行查询。而keyword类型字段保存和查询时都不会分...

  • MySQL查询数据

    [toc] 单表查询: 查询条件列表 查询所有字段 查询指定字段: 查询指定记录: 带 in关键字的查询 如果us...

  • MySQL自学day3.1.模糊查询,分页查询

    模糊查询 其中like表示模糊查询,%表示模糊其他字段 如果 去掉后面一个% 则模糊查询的字则为字段末尾字即%乔%...

  • ElasticSearch 7.x 聚合查询

    聚合查询 |ES 的聚合查询和MyQL的聚合查询类型,ES 的聚合查询相比MySQL 要强大的多,ES提供的统计数...

  • ES简单实用DSL查询

    ES版本信息 查看所有索引 查看字段类型 创建索引 删除索引 批量(_bulk)加载数据 查询数据 查询1000条...

  • ElasticSearch查询DLS

    查询和过滤的区别 ES提供基于JSON的完整DSL来定义查询,查询DSL包括两种子句:叶查询子句:在特定的字段上查...

  • kettle 数据库查询

    数据查询:根据一些条件在一张表中查询一些数据 查询所需的关键字 表字段为被查询的表的字段 字段1:数据流中的查询条...

  • 数据库学习笔记-基础查询

    基础查询 查询字段语法 查询单字段SELECT 字段 FROM 表名;查询多字段SELECT 字段1,字段2,字段...

网友评论

      本文标题:es多字段查询Multi_Field_Search----最佳字

      本文链接:https://www.haomeiwen.com/subject/beupwctx.html