Elasticsearch 全文检索 分词检索-Elasticsearch文章四

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

官方文档地址

https://www.elastic.co/guide/en/enterprise-search/current/start.html

refercence文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-match-query.html

全文搜索体系

Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升

Elasticsearch 全文检索 分词检索-Elasticsearch文章四,AI大数据,分布式微服务,全文检索,elasticsearch,分词

很多api都可以查得到,我们只要大概知道有支持哪些功能

Elasticsearch 全文检索 分词检索-Elasticsearch文章四,AI大数据,分布式微服务,全文检索,elasticsearch,分词

match

简单查询

GET visit_log/_search
{
  "query": { "match": {
    "serverHostName": "wei"
  }},
  "sort": [
    { "_id": "asc" }
  ],
  "from": 0,
  "size": 10
}

Elasticsearch 执行上面这个 match 查询的步骤是:
1. 检查字段类型 。
标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。
1. 分析查询字符串 。
将查询的字符串 wei cui传入标准分析器中,输出的结果是单个项 wei。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。
1. 查找匹配文档 。
用 term 查询在倒排索引中查找 wei然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。
1. 为每个文档评分 。
用 term 查询计算每个文档相关度评分 _score ,这是种将词频(term frequency,即词 quick 在相关文档的 title 字段中出现的频率)和反向文档频率(inverse document frequency,即词 quick 在所有文档的 title 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

查询结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        },
        "sort" : [
          "nUL9rokBpGsmR0pP0VSc"
        ]
      }
    ]
  }
}

match 多词/分词

单字段分词

查询字段包含wei cui两个词

GET visit_log/_search
{
  "query": { "match": {
    "serverHostName": "wei cui"
  }},
  "sort": [
    { "_id": "asc" }
  ],
  "from": 0,
  "size": 10
}


结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "TEL9rokBpGsmR0pPXFMo",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 5,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang cui",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        },
        "sort" : [
          "TEL9rokBpGsmR0pPXFMo"
        ]
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        },
        "sort" : [
          "nUL9rokBpGsmR0pP0VSc"
        ]
      }
    ]
  }
}

因为 match 查询必须查找两个词( [“liu”,“wei”] ),它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中,
所以上述查询的结果,和如下语句查询结果是等同的

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "serverHostName": "liu"
          }
        },
        {
          "term": {
            "serverHostName": "cui"
          }
        }
      ]
    }
  }
}

match多个词的逻辑

上面等同于should(任意一个满足),是因为 match还有一个operator参数,默认是or, 所以对应的是should。

GET /visit_log/_search
{
  "query": {
    "match": {
      "serverHostName": {
        "query": "wang cui",
        "operator": "or"
      }
    }
  }
}

多字段分词

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "serverHostName": "cui wei" }},
        { "match": { "msgContent": "add3 add4" }}
      ]
    }
  }
}

控制match的匹配精度

如果用户给定 3 个查询词,想查找至少包含其中 2 个的文档,该如何处理?将 operator 操作符参数设置成 and 或者 or 都是不合适的。
match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

GET /visit_log/_search
{
  "query": {
    "match": {
      "serverHostName": {
        "query": "wang cui wangcui",
        "minimum_should_match": "75%"
      }
    }
  }
}

当然也等同于

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "serverHostName": "wang" }},
        { "match": { "serverHostName": "cui"   }},
        { "match": { "serverHostName": "wangcui"   }}
      ],
      "minimum_should_match": 2 
    }
  }
}

match_pharse_prefix分词前缀方式

那有没有可以查询出quick brown f的方式呢?ELasticSearch在match_phrase基础上提供了一种可以查最后一个词项是前缀的方法,这样就可以查询test es a了

GET /visit_log/_search
{
  "query": {
    "match_phrase_prefix": {
      "msgContent": {
        "query": "test es a"
      }
    }
  }
}


(ps: prefix的意思不是整个text的开始匹配,而是最后一个词项满足term的prefix查询而已)

match_bool_prefix

GET /visit_log/_search
{
  "query": {
    "match_bool_prefix": {
      "msgContent": {
        "query": "es test a"
      }
    }
  }
}

所以这样你就能理解,match_bool_prefix查询中的quick,brown,f是无序的。

multi_match多字段匹配

GET /visit_log/_search
{
  "query": {
    "multi_match" : {
      "query":    "add7 wang",
      "fields": [ "msgContent", "*HostName" ] 
    }
  }
}

结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.7917595,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : 1.7917595,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        }
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "TEL9rokBpGsmR0pPXFMo",
        "_score" : 1.0800905,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 5,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang cui",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        }
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "6UL9rokBpGsmR0pPjVOS",
        "_score" : 1.0800905,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 6,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang ting",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        }
      }
    ]
  }
}

*表示前缀匹配字段。

query string类型

此查询使用语法根据运算符(例如AND或)来解析和拆分提供的查询字符串NOT。然后查询在返回匹配的文档之前独立分析每个拆分的文本。
可以使用该query_string查询创建一个复杂的搜索,其中包括通配符,跨多个字段的搜索等等。尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。
例如:


GET /visit_log/_search
{
  "query": {
    "query_string": {
      "query": "(wangcui) OR (add6)",
      "fields": [ "msgContent", "*HostName" ] 
    }
  }
}

Interval类型

Intervals是时间间隔的意思,本质上将多个规则按照顺序匹配。


GET /visit_log/_search
{
  "query": {
    "intervals" : {
      "msgContent" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "liu",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "es" } },
                  { "match" : { "query" : "add6" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

因为interval之间是可以组合的,所以它可以表现的很复杂

DSL查询之Term详解

自行查官方文档,有可能后边会出详解文章来源地址https://www.toymoban.com/news/detail-628732.html

聚合查询之Bucket聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Metric聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Pipline聚合详解

自行查官方文档,有可能后边会出详解

其他

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

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

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

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

相关文章

  • 【迅搜03】全文检索、文档、倒排索引与分词

    今天还是概念性的内容,但是这些概念却是整个搜索引擎中最重要的概念。可以说,所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的,所以不要以为标题上有四个名词就感觉好像内容很多一样,其实它们都是联系紧密的,一环套

    2024年02月03日
    浏览(41)
  • docker安装的mysql更改全文检索分词配置

    这里使用的是mysql8.0+,默认使用ngram分词 这里是已经将文件从容器中挂载出来了,没挂载出来要去容器内部更改my.cnf文件并重启mysql容器 一、查看mysql的分词大小 ngram_token_size这里默认是2我已经改为1了 这个值代表分词大小 比如abc会分成ab和bc两个词,会导致检索单个词a、b、

    2024年02月16日
    浏览(45)
  • MySQL全文索引:中文语义分词检索(相似度匹配)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 通常情况下,全文检索引擎我们一般会用ES组件(传送门:SpringBoot系列——ElasticSearch),但不是所有业务都有那么大的数据量、那么大的并发要求,MySQL5.7之后内置

    2023年04月09日
    浏览(43)
  • 全文检索-Elasticsearch-进阶检索

    本文记录谷粒商城高级篇的 Elasticsearch 进阶检索部分,续上之前记录的 Elasticsearch入门篇。 ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数(uri + 检索参数) 另一个是通过使用 REST request body 来发送它们(uri + 请求体) 请求体中写查询条件,语法: 示例

    2024年02月03日
    浏览(89)
  • 一个线上全文索引BUG的排查:关于类阿拉件数字的分词与检索

    说到全文检索的分词,多半讲到的是中(日韩)文分词,少有英文等拉丁文系语言,因为英语单词天然就是分词的。 但更少讲到阿拉伯数字。比如金额,手机号码,座机号码等等。 以下不是传统的从0开始针对mysql全文索引前世今生讲起。 我更喜欢从一个小问题入手,见缝插针

    2024年02月05日
    浏览(68)
  • elasticsearch全文检索

    传送门 best_fields 传送门 most_fields 当查询多字段包含相同文本以不同方式分词的时候此参数最有用, 传送门 cross_fields phrase和phrase_prefix 传送门 传送门

    2024年02月07日
    浏览(48)
  • ElasticSearch-全文检索

    https://www.elastic.co/cn/what-is/elasticsearch 全文搜索属于最常见的需求,开源的Elasticsearch是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。 维基百科、StackOverflow、Github都采用它。 Elastic的底层是开源库Lucene。但是,你没法直接用Lucene,必须自己写代码去调用

    2024年04月17日
    浏览(39)
  • ElasticSearch 实战:ElasticSearch文档全文检索

    Elasticsearch 实战:Elasticsearch 文档全文检索 全文检索是 Elasticsearch 的核心功能之一,它允许用户对文本内容进行高效的模糊搜索、词组匹配、同义词处理、停用词过滤等操作。以下是如何进行文档全文检索的详细步骤: **1. **全文匹配查询(Match Query) 最基础的全文检索查询是

    2024年04月11日
    浏览(52)
  • ES(Elasticsearch 全文检索)

    数据量大的时候 索引失效 =查询性能低 功能比较弱 对文档的内容进行分词,对词条创建索引,记录词条所在的文档信息根据词条查询到文档的id 从而查到文档 文档:每一条数据就是一条文档 词条:文档按照语义分成的词语 正向索引 根据文档的id创建索引 查询词条必须先找

    2024年02月05日
    浏览(59)
  • ElasticSearch全文检索原理及过程

            ElasticSearch的搜索引擎中,每个 文档都有一个对应的文档 ID ,文档内容被表示为一系列的集合。例如文档 1 经过分词,提取了 20 个, 每个都会记录它在文档中出现的次数和出现位置 。那么,倒排索引就是 到文档   ID 的映射 ,每个关键

    2023年04月17日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包