Elasticsearch自定义分析器

关于分析器

ES中默认使用的是标准分析器(standard analyzer)。如果需要对某个字段使用其他分析器,可以在映射中该字段下说明。例如:

PUT /my_index
{
  "mappings": {
    "blog": {
      "properties": {
        "title": { 
          "type": "string",
          "fields": {
            "english": { 
              "type":     "string",
              "analyzer": "english"
            }
          }
        }
      }
    }
  }
}

在上面:

title 字段使用 `standard`(标准)分析器。

title.english 子字段使用 `english`(英语)分析器。

关于自定义分析器

自定义分析器基于标准分析器(或其他ES已有的分析器),通过搭配字符过滤器、分词器和词单元过滤器,添加特定的配置,达到提高查询效果的作用。

1 字符过滤器

 很多时候,我们需要处理的文本会是除了干净文本之外的任何文本。例如HTML文本直接进行分词会得到糟糕的效果。因此在分词之前整理文本会提升输出结果的质量。

HTML分词

业务不涉及,略

整理标点符号

可能也不需要。

2 分词器

standard 分词器使用 Unicode 文本分割算法。它是大多数语言分词的一个合理的起点,特别是西方语言。

3 词汇单元过滤器

值得注意的是,当使用多个过滤器,过滤器的先后顺序是有考究的。每一个语汇单元过滤器都可以处理来自上一个语汇单元过滤器输出的单词流。

3.1 归一化词元可以用的过滤器

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "folding": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "asciifolding" ]
        }
      }
    }
  }
}

上面代码中为自定义分析器folding配置了两个过滤器lowercase过滤器和asciifolding过滤器。它们的具体功能,以及其他归一化词元过滤器将在下面一一介绍。

类似的,若需要配置其他过滤器,只需要在filter字段的列表中添加其他过滤器的名称。

lowercase过滤器

将接收的词元归一化为小写。

acciifolding过滤器

它不仅仅能去掉变音符号。如果文本是纯英语,不包含法语、德语啥的,也可以不考虑这个过滤器

3.2 词干提取器

3.2.1 基于算法的英文词干提取器

提供了一系列规则用于将一个词提取为它的词根形式,例如剥离复数词末尾的 ses 。提取单词词干时并不需要知道该词的任何信息。

词干弱提取 就是无法将同样意思的单词缩减为同一个词根。例如, jumpedjumps 可能被提取为 jump , 但是 jumping 可能被提取为 jumpi 。弱词干提取会导致搜索时无法返回相关文档。

词干过度提取 就是无法将不同含义的单词分开。例如, generalgenerate 可能都被提取为 gener 。 词干过度提取会降低精准度:不相干的文档会在不需要他们返回的时候返回。

DEMO:

# English分析器配置文件,配置文件展示如下:
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_"
        },
        "english_keywords": {
          "type":       "keyword_marker", 
          "keywords":   []
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english" 
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english" 
        }
      },
      "analyzer": {
        "english": {
          "tokenizer":  "standard",
          "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_keywords",
            "english_stemmer"
          ]
        }
      }
    }
  }
}

# keyword_marker 分词过滤器列出那些不用被词干提取的单词。这个过滤器默认情况下是一个空的列表。 
# english 分析器使用了两个词干提取器: possessive_english 词干提取器和 english 词干提取器。 
# 所有格词干提取器会在任何词传递到 english_stop 、 english_keywords 和 english_stemmer 之前去除 's 。 

常见的基于算法的词干提取器

3.2.2 基于字典的英文词干提取器

只是简单地在字典里查找词。理论上可以给出比算法化词干提取器更好的结果,但,实践中一个好的算法词干提取器一般优于一个字典词干提取器。

3.3 停用词过滤器

停用词是什么

停用词是可以将日常使用频率较高而没有辨识度的词,例如:I, and, it等等。

过滤掉停用词的好处

过滤掉停用词的最主要好处是提高性能。如果我们不过滤掉停用词,当我们的检索词中包括停用词"the",如:“the oil field”,由于几乎所有文档都会包含“the”这个词,ES会为几乎所有文章进行评分,然后倒序排列,取Top N返回。相反,当我们使用停用词过滤器,“the”会被过滤,ES只会对匹配“oil”和“field”的文档进行评分、排序等。

如何在自定义分析器中启用停用词过滤器

标准分析器是不启用停用词过滤器的。我们可以自定义一个分析器my_analyzer,搭配使用标准分析器和停用词过滤器。

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": { 
          "type": "standard", 
          "stopwords": [ "and", "the" ] 
        }
      }
    }
  }
}

上面“stopwords”属性的值是一个包含两个停用词(“and”和“the”)的停用词列表。这个列表也可以替换成“_某语言_”的形式,来指定使用该语言在ES中默认的停用词表。如:

"stopwords":"_english_" 

我们也可以使用自定义停用词表。将自定义的停用词以一行一个单词的格式保存在文件中,此文件必须在集群的所有节点上,并且通过 stopwords_path 参数设置路径:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english": {
          "type":           "english",
          "stopwords_path": "stopwords/english.txt"   # 停用词文件的路径,该路径相对于 Elasticsearch 的 config 目录
        }
      }
    }
  }
}

  

转载于:https://www.cnblogs.com/DianeSoHungry/p/8616957.html

### 回答1: 在 Elasticsearch 中,禁用不必要的分析器可以通过以下两种方式实现: 1. 在索引映射中指定字段的分析器为 "keyword" 或 "whitespace",这将禁用分析器并将字段视为一个整体进行索引和搜索。 示例映射: ``` { "mappings": { "properties": { "title": { "type": "text", "analyzer": "keyword" }, "description": { "type": "text", "analyzer": "whitespace" } } } } ``` 2. 在查询中使用 "term" 或 "match_phrase" 查询,这将禁用查询字符串的分析器,并将查询字符串视为一个整体进行搜索。 示例查询: ``` { "query": { "term": { "title": "Elasticsearch" } } } ``` ### 回答2: 在 Elasticsearch 中,禁用不必要的分析器是为了提高搜索性能和减少资源占用。以下是一些禁用不必要分析器的方法: 1. 禁用默认分析器Elasticsearch 会默认使用一个名为"standard"的分析器,可以通过指定一个空的分析器来禁用它。例如,在创建索引时,可以将字段的分析器设置为空字符串: ``` PUT /my_index { "settings": { "analysis": { "analyzer": { "default": { "type": "custom", "tokenizer": "standard", "filter": [] } } } }, "mappings": { "properties": { "my_text_field": { "type": "text", "analyzer": "" } } } } ``` 2. 禁用特定分析器:如果你只想禁用特定分析器而不是默认分析器,可以使用空字符串或指定一个无效的分析器名称。例如: ``` PUT /my_index/_settings { "analysis": { "analyzer": { "my_analyzer": "none" } } } ``` 3. 禁用搜索时的分析器:在进行搜索时,默认情况下 Elasticsearch 会使用相同的分析器对搜索查询进行分词。如果你的查询涉及到一个不需要分词的字段,你可以使用`match_phrase`等查询类型来禁用搜索时的分析器。例如: ``` GET /my_index/_search { "query": { "match_phrase": { "my_non_analyzed_field": { "query": "Some text", "analyzer": "keyword" } } } } ``` 通过以上方法,可以禁用不必要的分析器,从而提高 Elasticsearch 的搜索性能和减少资源占用。 ### 回答3: 在Elasticsearch中,我们可以通过禁用不必要的分析器来优化索引和搜索性能。 首先,分析器在索引和搜索过程中负责将文本转换为标记(tokens),并执行各种文本处理任务,例如分词、小写转换、去除停用词等。但是,并不是所有的字段都需要进行分析,尤其是那些已经是标记化或已经处理好的字段。 要禁用不必要的分析器,我们可以通过定义一个自定义分析器并将其配置为"standard"分析器的别名来实现。例如,如果我们有一个名为"raw"的字段,它已经是标记化或已经进行了所需的文本处理,我们可以将其配置为别名为"keyword"的"standard"分析器。配置示例如下: PUT my_index { "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase"] } } } }, "mappings": { "properties": { "raw": { "type": "text", "analyzer": "my_custom_analyzer", "search_analyzer": "keyword" } } } } 在上面的示例中,我们使用了自定义分析器"my_custom_analyzer",它只包含了一个"standard"分词器和一个"lowercase"过滤器。然后,我们将"raw"字段映射为"text"类型,并将其指定为"my_custom_analyzer"分析器,同时将搜索分析器设置为"keyword",这样就禁用了不必要的分析器。 通过禁用不必要的分析器,我们可以减少不必要的计算和内存开销,提高Elasticsearch的索引和搜索性能,并节省存储空间。但是需要注意的是,禁用分析器可能会影响搜索的精确性和效果,因此在禁用之前应先评估其对搜索结果的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值