zoukankan      html  css  js  c++  java
  • Elastic Search 基础——分析(Analysis)

    分析是将文本,如任何电子邮件的正文转换成附加到反向索引的tokens(标记)或terms(条件)的过程。分析由分析器执行,它可以是内置的分析器,也可以是每个索引定义的自定义分析器。

    索引时分析

    在索引时,内置的english analyzer(英文分析器)将会转换这个句子:

    "The QUICK brown foxes jumped over the lazy dog!"

    这些条件将被添加到反向索引中。

    quickbrownfoxjumpoverlazidog ]

    Elastic Search内置了好几种分析器,我们可以指定字段使用的分析器,在mapping的时候设置analyzer字段即可。

    {
      "mappings": {
        "properties": {
          "title": {
            "type""text",
            "analyzer""standard"
          }
        }
      }
    }

    在索引时,如果没有指定分析器,则会在索引设置中查找名为default的分析器。未找到则默认使用standard analyzer(标准分析器)。

    搜索时分析

    例如,用户可能搜索:

    "a quick fox"

    这将由类似英语分析器分析为以下的条件:

    quickfox ]

    通常在索引时和搜索时应该使用相同的分析器,而像match query(匹配查询)那样的全文检索将使用映射来查找用于每个字段的分析器。

    搜索时字段分析器可以有多种途径指定:

    • 在查询中指定分析器。
    • search_analyzer映射参数。
    • analyzer映射参数。

    搜索的时候会按照上述优先级使用分析器。

    常用分词器

    标准分词器

    在默认情况下,Elasticsearch使用标注分词器进行分词,它根据 Unicode 联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。例如,对于如下文本:

    "Set the shape to semi-transparent by calling set_trans(5)"

    它会产生set, the, shape, to, semi, transparent, by, calling, set_trans, 5这些分词。对于英文语言来说使用还是非常实用的。

    IK分词器

    标准分词器对于英文还是非常方便的,但是对于中文却不行,会将中文拆成一个个的单字,搜索效率和精度都不行,这是就需要用一些第三方中文分词器,常见的是IK分词器。

    使用IK分词器,首先需要安装IK分词器插件:

    $ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip

    需要注意的时,必须选择和ElasticSearch一致的版本。

    然后在映射中指定索引分析器和搜索分析器即可:

    "properties": {
      "user": {
        "type""text",
        "analyzer""ik_max_word",
        "search_analyzer""ik_max_word"
      }
    }

    NGram分词器

    前面的分词器主要应用场景是全文搜索,但对于模糊搜索的场景就不行了,虽然ElasticSearch也提供wildcard查询和正则表达式查询能实现模糊搜索。但是他们的性能是非常低下的,如果对性能有要求基本上可以抛弃他们了。

    一个简单的解决方案是使用ngram分词器,然后使用match_phrase来匹配,

     

    具体原理我就不介绍了,可以参考如下几篇文章:

    自定义分词

    除了标准的分词器外,我们有事还要用到自定义分词器,或者设置分词器的一些参数,这个时候就需要一些高级设置了,一个简单的示例如下:

    {
      "settings": {
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "type""custom",
              "tokenizer""standard",
              "filter": [
                "lowercase"
              ]
            }
          }
        },
        "mappings": {
          "properties": {
            "title": {
              "type""text",
              "analyzer""my_analyzer"
            }
          }
        }
      }
    }

    简单的来讲,就是在setting中设置分词器参数,然后在mapping中使用分词器,具体用法可以参看官方文档:Create a custom analyzer

    测试分词器

    有些时候很难理解分词的过程和实际被存储到索引中的词条,特别是你刚接触Elasticsearch。为了理解发生了什么,你可以使用 analyze API 来看文本是如何被分析的。在消息体里,指定分析器和要分析的文本:

    GET /_analyze
    {
      "analyzer""standard",
      "text""Text to analyze"
    }

    对于索引里面的自定义分词器,可以带上索引名称:

    POST /my_index/_analyze
    {
      "analyzer""my_analyzer",
      "text""2 Quick Foxes."
    }

  • 相关阅读:
    构建之法阅读笔记02
    NOPI2018 货币系统 bool完全背包 bitset优化转移
    P4551 最长异或路径 Trie经典应用 bitset应用
    算法分析与设计实验报告 Project2
    ARC-114 C- Sequence Scores 计数
    P2401 不等数列 简单计数DP
    Gym-102569C Manhattan Distance 曼哈顿距离的转换 二分
    GYM-102893J Straight 模拟 思维
    算法分析与设计实验报告 Project1
    CodeForces Round 705-D GCD of an Array 数论 乱搞 or 线段树 + 质因子分解科技
  • 原文地址:https://www.cnblogs.com/TianFang/p/12945218.html
Copyright © 2011-2022 走看看