Elasticsearch-单字符串多字段查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch-单字符串多字段查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

单字符串查询实例 

bool查询should的算分过程

Disjunction Max Query查询

通过Tie Breaker参数调整

MultiMatch Query查询

三种场景

 MultiMatch Query语法

 使用多数字段匹配解决

跨字段搜索(一个地址信息映射到不同的字段上:街道,城市,国家......)


单字符串查询实例 

PUT /blogs/_bulk
{"index":{"_id":1}}
{"title":"Qucik brown rabbits","body":"Brown rabbits are commonly"}
{"index":{"_id":2}}
{"title":"Keeping pets healthy","body":"My quick brown fox eats rabbits on a regualr basis."}


POST /blogs/_search
{
  "query":{
    "bool": {
      "should": [
        {"match": {
          "title": "Brown fox"
        }},
        {
          "match": {
          "body": "Brown fox"
        }
        }
      ]
    }
  }
}

Elasticsearch-单字符串多字段查询

bool查询should的算分过程

  • 查询should语句中的两个查询
  • 加和两个查询的评分
  • 乘以匹配语句的总数
  • 除以所有语句的总数
  • 文档1的标题和内容都包含了brown,文档2的内容包含了brown fox有更高的相似度,但是在title中算分很低.当两者相加的时候会出现文档1的打分比文档2的打分高

Disjunction Max Query查询

  • 上述中,title和body相互竞争
    • 不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分
  • Disjunction Max Query
    • 将任何与任一查询匹配的文档作为结果返回,采用字段上最匹配的评分最终评分返回

GET /blogs/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {"match": {"title": "brown fox"}},
        {"match": {"body": "brown fox"}}
        ]
    }
  }

Elasticsearch-单字符串多字段查询

通过Tie Breaker参数调整

  • 获得最佳匹配语句的评分_score

  • 将其他匹配的评分与tie_breaker相乘

  • 对以上评分求和并规范化

    • Tie Breaker是一个介于0-1之间的浮点数.0代表使用最佳匹配;1代表所有语句同等重要

  • 布尔查询用should方式进行,它是将各个字段上的评分进行一个简单的加和,当处理特殊的竞争字段的时候返回的算分并不满足我们的期望,通过引入一个复合查询Disjunction Max Query,返回字段当中评分最高的作为整体的算分;需要在Disjunction Max Query的时候引入一些其他算分的影响的时候,我们可以通过Tie Breaker的参数对算分进行一些适当的调整

MultiMatch Query查询

三种场景

  • 最佳字段

    • 当字段之间相互竞争,又相互关联.例如title和body这样的字段.评分来自最匹配字段

  • 多数字段

    • 处理应为内容时:一种常见的手段是,在主字段.抽取词干,加入同义词,以匹配更多的文档.相同的文本,加入子字段,以提供更加准确的匹配.其他字段作为匹配文档提供相关度的信号.匹配字段越多越好

  • 混合字段

    • 对于某些实体,例如人名,地址,图书信息.需要在多个字段中确定信息,单个字段只能作为整体的一部分,希望在任何这些列出的字段中找到尽可能多的词.

 MultiMatch Query语法

Elasticsearch-单字符串多字段查询

 文章来源地址https://www.toymoban.com/news/detail-455088.html

  • Best Fields 是默认类型,可以不指定

  • Minimum should match 等参数可以传递到生成的query中

PUT /titles
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
        , "analyzer": "english"
      }
    }
  }
}

POST titles/_bulk
{"index":{"_id":1}}
{"title":"My dog barks"}
{"index":{"_id":2}}
{"title":"I see a lot of barking dogs on the road"}

Elasticsearch-单字符串多字段查询 

  • 原因分析:我们的title采用英文分词器,会将barking dogs分成两个term,因为文档1更短,所以文档1的算分更高 
    • 英文分词器会对时态做一个词干的提取

  • 对上述文档做优化.为 title增加一个子字段,分词器为standard(不会对词干提取,不会损失一些相关的信息);英文分词器可以提升搜索的record的值;standard控制搜索条件的精度
  • multi_match可以指定一个type.most_fields可以把"title","title.std"的算分做一个叠加,将最匹配的结果显示在第一位

PUT /titles
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
        , "analyzer": "english",
        "fields": {
          "std":{
            "type":"text",
            "analyzer":"standard"
          }
        }
      }
    }
  }
}

POST titles/_search
{
  "query":{
    "multi_match": {
      "query": "barking dogs",
      "fields": ["title","title.std"],
      "type": "most_fields"
    }
  }

Elasticsearch-单字符串多字段查询

 使用多数字段匹配解决

  • 用广度匹配字段title包括尽可能多的文档--以提升召回率--同时有使用字段title.std作为信号将相关度更高的文档置于结果顶部.

  • 每个字段对于最终评分的贡献可以通过自定义值boost来控制.比如,使title字段更为重要,这样也降低了其他信号字段的作用

  • 在字段filed当中增加一个权重来控制最终结果的一个返回 

Elasticsearch-单字符串多字段查询

跨字段搜索(一个地址信息映射到不同的字段上:街道,城市,国家......)

Elasticsearch-单字符串多字段查询

  •  要求:Poland Street W1V全部出现在fields里面的搜索字段上
    • 可以用copy_to解决,但是需要额外的存储空间

    • 一个详细的地址信息完全映射到不同的字段上,不能通过增加Operator:and来满足这个条

  • 解决办法:cross_fields
    • type为cross_fields且指定operator为"and",query里面的词都必须出现在fields字段当中(不用每个字段都包含query,指定的字段加起来包含query就行)

      • 支持使用Operator

      • 与copy_to相比,其中一个优势就是他可以在搜索时为单个字段提升权重

 

PUT address/_doc/1
{
  "street":"5 Poland Street",
  "city":"London",
  "country":"United Kingdom",
  "postcode":"W1V 3DG"
}

POST address/_search
{
  "query":{
    "multi_match": {
      "query": "Poland Street W1V",
      "fields": ["street","city","country","postcode"]
      , "type": "most_fields"
    }
  }
}

Elasticsearch-单字符串多字段查询 Elasticsearch-单字符串多字段查询Elasticsearch-单字符串多字段查询

 

 

 

到了这里,关于Elasticsearch-单字符串多字段查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用命令替换目录下字符串

    在这里插入代码片 举个例子: sed -i “s/手机/恭喜发财/g” grep 手机 -rl res 这条命令使用了 sed 命令和 grep 命令来搜索并替换文件中的文本。 grep 手机 -rl res :在目录 res 及其子目录中递归搜索包含\\\"手机\\\"的文件,并返回匹配的文件名列表。 sed -i \\\"s/手机/恭喜发财/g\\\" :对

    2024年02月10日
    浏览(40)
  • MySQL 中的字段截取与字符串截取方法详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 MySQL 数据库中,有时我们需要截取字段或字符串的一部分进行查询、展示或处理。本文将介绍 MySQL 中常用的字

    2024年02月12日
    浏览(55)
  • MySQL实战解析底层---怎么给字符串字段加索引

    目录 所谓前缀索引 前缀索引对覆盖索引的影响 其他方式 所谓前缀索引 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是今天要讨论的问题 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的 由于要使用邮箱登录,所以业务

    2023年04月09日
    浏览(71)
  • mysql中的实现字段或字符串拼接的三种方式

    concat函数是将多个字段或字符串拼接为一个字符串;但是字符串之间没有任何分隔。 concat函数官方介绍 执行结果如下: 执行结果如下: 如果拼接的字段中有一个为null,则结果为null。 执行结果如下: concat_ws函数将多个字段或字符串拼接为一个字符串,且字符串直接可以指定

    2024年02月22日
    浏览(98)
  • 字符串查询--Python

    str1 = \\\'hello python\\\'  index 需求:查找p所在的索引位置  格式: 字符串.index(self(不用传值), sub(子字符串), start(起始位置), end(结束位置)) print(str1.index(\\\'p\\\'))  # 6 如果字符串中含有多个子字符串,则会返回指定范围内的从左至右的第一个查找到的子字符串位置索引 print(str1.index(\\\'o\\\'))  #

    2024年02月09日
    浏览(43)
  • Hive字符串数组json类型取某字段再列转行

    acct content 1232313 [{\\\"name\\\":\\\"张三\\\",\\\"code\\\":\\\"上海浦东新区89492jfkdajrn福建的卡\\\"...},{\\\"name\\\":\\\"狂徒\\\",\\\"code\\\":\\\"select * from table where aa=1rn and a=12\\\"...},{...}] ... ...  上述数据表名code_content,把json中code内容全都取出来拼接成一行数据,最终效果: acct new_content 1232313 上海浦东新区89492jfkdajrn福建的

    2024年02月11日
    浏览(49)
  • MySQL中字符串查询效率大比拼

    最近有个同事对字符串加索引,加完后,发现多了个奇奇怪怪的数字 执行的SQL如下: 这个奇怪数字就是191,它很是疑惑,也没指定索引的长度 通过查看MySQL官方文档 InnoDB has a maximum index length of 767 bytes for tables that use COMPACT or REDUNDANT row format, so for utf8mb3 or utf8mb4 columns, you ca

    2024年02月07日
    浏览(86)
  • 在 SQL Server 中,可以使用加号运算符(+)来拼接字符串。但是,如果需要拼接多个字符串或表中的字段,就需要使用内置的拼接函数了

    以下是 SQL Server 中的一些内置拼接函数: 1. CONCAT:将两个或多个字符串拼接在一起。语法为: 示例: 2. CONCAT_WS:与 CONCAT 类似,但可以指定一个分隔符。语法为: 示例: 3. CONCATN:将多个字符串拼接在一起,并在每个字符串之间添加指定的字符。语法为: 示例: 4. REPLAC

    2024年02月07日
    浏览(59)
  • Mysql 查询以逗号(,)分割的字符串,精确查找和模糊查询

    1、测试数据库表结构 2、测试数据 数据库有一个字段ancestors存储着部门父级id,每,用逗号分隔符隔开。比如:ancestors:“0,1,2,3,4,5,6,7,8,11,12,9,10,13\\\"”,我需要查询ancestors字段中包含“2”的信息 结果: 结果: 使用 FIND_IN_SET 函数能够准确查出 ancestors字段中含有 2 这项有哪些

    2024年02月11日
    浏览(44)
  • fastApi笔记04-查询参数和字符串校验

    使用Query可以对查询参数添加校验 default:默认值 max_length:最大长度 min_length:最小长度 pattern:正则表达式 当使用Query声明一个查询参数为必须参数时,只用不声明默认值就行,也就是default不传 声明None是个有效类型,这样将强制客户端传一个值。即使这个值是None 使用Query显

    2024年02月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包