Elasticsearch:搜索及索引分析器

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

在我之前的文章 “Elasticsearch: analyzer”,我详细介绍了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文档的时候需要使用,同时,它也在搜索时,也需要针对搜索的文字进行分词。在今天的文章中,我们来详细介绍分析器是如何在索引及搜索时使用的。

可以在几个级别指定分析器:索引(index)、字段(field)和查询级别(query level)。 在索引级别声明分析器可为所有文本字段提供索引范围内的默认全能分析器。 但是,如果需要在字段级别进一步定制,也可以在字段级别启用不同的分析器。 除此之外,我们还可以在搜索时提供一个不同于索引时间分析器的分析器。 让我们在本节中一一查看这些选项。

索引分析器

有时我们可能需要为不同的字段设置不同的分析器 —— 例如,一个名称字段可能与一个简单的分析器相关联,而信用卡号字段与一个模式(pattern)分析器相关联。 幸运的是,Elasticsearch 允许我们根据需要在各个字段上设置不同的分析器; 同样,我们也可以为每个索引设置一个默认分析器,以便在映射过程中未与特定分析器显式关联的任何字段都将继承索引级别的分析器。 让我们在本节中检查这两种机制。

字段级分析器

我们可以在创建索引的映射定义时在字段级别指定所需的分析器。 例如,下面的代码显示了我们如何在索引创建期间利用它:

PUT books_with_field_level_analyzers
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text" #A Standard analyzer is being used here
      },
      "about":{
        "type": "text",
        "analyzer": "english" #B Set explicitly with an english analyzer
      },
      "description":{
        "type": "text",
        "fields": {
          "my":{
            "type": "text",
            "analyzer": "fingerprint" #C Fingerprint analyzer on a multi-field
          }
        }
      }
    }
  }
}

如代码所示,about 和 description 字段是用不同的分析器指定的,除了隐式继承标准分析器的 name 字段。

索引级分析器

我们还可以在索引级别设置我们选择的默认分析器,以下代码清单演示了这一点:

使用默认的分析器创建一个索引

PUT books_with_default_analyzer
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{ #A Setting this property sets index’s default analyzer
          "type":"keyword"
        }
      }
    }
  }
}

在此代码清单中,我们实际上将默认的 standard 分析器替换为 keyword 分析器。 你可以通过调用索引上的 _analyse 端点来测试分析器,如下面给出的代码清单所示:

POST books_with_default_analyzer/_analyze
{
  "text":"Elasticsearch books" 
}

上面命令返回:

{
  "tokens": [
    {
      "token": "Elasticsearch books",
      "start_offset": 0,
      "end_offset": 19,
      "type": "word",
      "position": 0
    }
  ]
}

我们可以使用如下的命令来写入一个文档:

PUT books_with_default_analyzer/_doc/1
{
  "name": "Elasticsearch books"
}

如果在没有使用默认分析器的情况下,name 肯定是 text 类型的数据,并且以如下的格式进行展现的:

      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }

注意:在没有定义默认 analyzer 的情况下,默认的 analyzer 是 standard analyzer。

在我们创建 books_with_default_analyzer 索引时,我们指定的默认分析器为 keyword。也就是说在没有指定分析器的情形下,它会自动采用 keyword 作为分析器。如果我们使用如下的命令来进行搜索:

GET books_with_default_analyzer/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}

我们得到 0 个结果。这是因为 title 字段是 keyword 字段,而我们搜索的内容 Elasticsearch 也只是 “Elasticsearch books” 中的一个部分。

如果我们想得到 books_with_default_analyzer 的 mappings,我们可以通过如下的命令来得到:

{
  "books_with_default_analyzer": {
    "mappings": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

从上面的结果中我们可以看出来,tilte 字断是一个 multi-field 字段。由于我们使用的默认 analyzer 是 keyword,那么基本针对 type 为 text 的字段来说,它也使用 keyword 分析器来分析该字段。那么最终的结果是 title 及 title.keyword 两个字段都是 keyword 类型的字段,也即它们都不被分词。

搜索分析器

Elasticsearch 允许我们在查询期间指定不同的分析器,而不是在索引期间使用相同的分析器。 它还允许我们在索引中设置默认分析器 —— 这可以在索引创建期间设置。 让我们看看下面的这两种方法,以及 Elasticsearch 在选择不同级别定义的分析器时遵循的一些规则。

在查询中的分词器

我们还没有完成搜索部分,所以如果下面的代码让你有些困惑,请不要担心:

GET books_index_for_search_analyzer/_search
{
  "query": {
    "match": { #A
      "author_name": {
        "query": "M Konda",
        "analyzer": "simple" #B
      }
    }
  }
}

如上面的代码所示,我们在搜索作者时明确指定了分析器(很可能 author_name 字段会使用不同类型的分析器进行索引!)。

在字段级别设置分析器

设置搜索特定分析器的第二种机制是在字段级别。 正如我们为索引目的在字段上设置分析器一样,我们可以在字段上添加一个名为 search_analzyer 的附加属性来指定搜索分析器。 下面的代码演示了这种方法:

PUT books_index_with_both_analyzers_field_level
{
  "mappings": {
    "properties": {
      "author_name":{
        "type": "text",
        "analyzer": "stop",
        "search_analyzer": "simple"
      }
    }
  }
}

如上面的代码所示,author_name 设置了一个用于索引的停止分析器和一个用于搜索时间的 simple 分析器。

索引级别的默认分析器

我们也可以为搜索查询设置一个默认分析器,就像我们为索引时间所做的那样,通过在索引创建时在索引上设置所需的分析器。 以下代码清单演示了该设置:

PUT books_index_with_default_analyzer
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default_search":{ #A
          "type":"simple"
        },
        "default":{ #B
          "type":"standard"
        }
      }
    }
  }
}

在上面的代码清单中,除了搜索之外,我们还同时设置了索引的默认分析器。 您可能想知道我们是否可以在索引期间而不是在查询期间的运行时在字段级别设置搜索分析器? 下面的代码恰好演示了这一点 —— 在创建索引期间为字段级别的索引和搜索设置不同的分析器:

PUT books_index_with_both_analyzers_field_level
{
  "mappings": {
    "properties": {
      "author_name":{
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "simple"
      }
    }
  }
}

从上面的代码可以看出,author_name 将使用标准分析器进行索引,而在搜索过程中使用简单分析器。

优先顺序

当引擎在不同级别找到分析器时,引擎会拾取分析器,这是有顺序的。 以下是引擎选择正确分析器的优先顺序:文章来源地址https://www.toymoban.com/news/detail-451798.html

  • 在查询级别定义的分析器具有最高优先级。
  • 在定义索引映射时通过在字段上设置 search_analyzer 属性来定义的分析器。
  • 在索引级别定义的分析器。
  • 如果以上都没有设置,Elasticsearch 引擎会选择在字段或索引上设置的索引分析器。

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

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

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

相关文章

  • ElasticSearch 基础(七)之分析器

    就 ES 基础部分来说这暂时就是最后一篇的文章,写完之后就会学习 MQ 了。本篇内容简单了解 ES 的分析器,最重要的还是根据自己需求去定制自定义分析器,自定义分析器自行了解,这里只是基础。其他比较重要的就是中文分词器了,只需要知道常用的几种中文分词器就可以

    2024年02月09日
    浏览(41)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(124)
  • Elasticsearch 分词器切词器分析器

    normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理,过滤无用字符 HTML Strip Character Filter :html_strip 参数:escaped_tags 需要保留的html标签 Map

    2024年02月12日
    浏览(37)
  • ElasticSearch系列 - SpringBoot整合ES:分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2024年02月06日
    浏览(59)
  • Elasticsearch:Standard Text Analyzer - 标准文本分析器

    Elasticsearch 提供了超过很多开箱即用的分析器,我们可以在文本分析阶段使用它们。 这些分析器很可能足以满足基本情况,但如果需要创建自定义分析器,可以通过使用构成该模块的所需组件实例化一个新的分析器模块来实现。 下表列出了 Elasticsearch 为我们提供的分析器:

    2023年04月26日
    浏览(99)
  • 词法分析器(c++)

    个人觉得单纯是用来完成实验报告的话还行,但仅做参考,因为本人的编程水平有限,怕误人子弟。 本次代码支持以下操作: 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持: 部分(可手动在程序外部---reference.txt文件添加,),

    2024年02月04日
    浏览(48)
  • 编译原理———词法分析器

    设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中,  syn为单词种别码。  Token为存放的单词自身字符串。  Sum为整型常量。 具体实现时,可以将单词的二

    2024年02月08日
    浏览(61)
  • 分析器:常见问题

    源生成器(增量生成器)由于它特殊的定位,关于它的调试十分困难。在这里分享一些调试它的经验。 另外经常有写类库,然后提供可以生成代码的Attribute给用户的需求,此时需要用到传递引用的知识点。 源生成器项目和普通的项目不同。 普通的会在你按下运行或调试后才

    2024年02月01日
    浏览(67)
  • 词法分析器的设计与实现

    1.1、实验目的         加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求         1)对单词的构词规则有明确的定义;      

    2024年02月13日
    浏览(52)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包