带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(13)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(13)

《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(12) https://developer.aliyun.com/article/1229761




为索引设置默认的分词器

 

在不给文本字段或者索引设置分词器的情况下,standard 分词器是 Elasticsearch 默认的分词器。上一个例子中实现了为一个文本字段设置分词器,但如果想要索引中所有的文本字段都是用相同的分词器,那么在每一个文本字段都使用 analyzer 指定就显得太繁琐。这种情况下我们可以为索引属性 analysis.analyzer.default 指定默认的分词器。


PUT test-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        }
      }
    }
  }
}
POST test-000001/_analyze
{
  "explain": true, 
  "text": [
    "Heya, we Are Elastic."
  ]
}

通过 explain: true 输出明细可以看到当前使用的是索引默认的分词器 simple,通过非字母字符分割,单词进行了小写转换。


{
  "detail" : {
    "custom_analyzer" : false,
    "analyzer" : {
      "name" : "default"
      "tokens" : [
        {
          "token" : "heya"
        },
        {
          "token" : "we"
        },
        {
          "token" : "are"
        },
        {
          "token" : "elastic"
        }
      ]
    }
  }
}

搜索时使用指定分词器

 

大多数情况下数据写入阶段和搜索阶段分词器使用的是同一个,这么做的原因是尽可能的让匹配到内容在和写入时保持一致,避免返回不相关的文档,但 Elasticsearch 同时也支持搜索时使用不同的分词器。需要单独为搜索配置分词器的场景多数是因为写入时使用的的分词器将文本拆分粒度比较细,如果搜索阶段也使用同样的分词器,倒排索引中将可能匹配到不是特别相关的文档。

 

搜索指定分词器的使用上更建议你经过周密的测试再投入生产环境,应该尽可能避免搜索使用不同的分词器。实现搜索阶段指定分词器有以下三种不同的方式,优先级依次从高到低进行覆盖:

l 搜索时文本字段指定 analyzer 属性。

l 创建索引时字段指定 search_analyzer 属性。

l 创建索引时指定 analysis.analyzer.default_search 默认搜索分词器,设置 default_search 同时也需要设置索引默认分词器 analysis.analyzer.default_search。

 

在指定分词器时默认情况下当一个字段仅在 analyzer 中指定的话,该字段搜索和写入时都会使用相同的分词器进行处理。如果希望在搜索时使用不同的分词器就需要在 search_analyzer 中单独指定。


PUT test-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "standard"            #1
        },
        "default_search": {
          "type": "whitespace"            #2
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      },
      "title": {
        "type": "text",
        "search_analyzer": "keyword"    #3
      }
    }
  }
}
POST test-000001/_doc                    #4
{
  "content": "Heya, we Are Elastic.",
  "title": "You Know, for Search!"
}

#1 写入时使用 standard 分词器,内容将会被转换为小写。

 

#2 搜索时使用 whitespace,通过空格切分,内容不会进行转换。

 

#3 title 字段在搜索时使用 keyword 分词器,搜索内容会作为一个整体进行匹配。

 

#4 索引中写入一条数据。


GET test-000001/_search
{
  "query": {
    "match": {
      "content": "Elastic"
    }
  } 
}

通过上面索引的设置,content 字段搜索 Elastic 时因为使用 whitespace 分词器没有做小写转换的操作,将会无法匹配到内容。

 

GET test-000001/_search
{
  "query": {
    "match": {
      "title": "You Know"
    }
  } 
}

title 字段搜索时使用 keyword 分词器,这时候会将 You Know 当作一个整体在倒排索引中匹配,而写入时已被拆分为了单个单词,所以这条查询也将无法匹配到内容。在这种情况下想要能够匹配上写入的文档,就需要在搜索时指定和写入时相同的分词器进行查询。


GET test-000001/_search
{
  "query": {
    "match": {
      "title": {
        "query": "You Know",
        "analyzer": "standard"        #1
      }
    }
  }
}

#1 搜索时指定使用 standard 进行分词保持写入一致。



 《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(14) https://developer.aliyun.com/article/1229755

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
存储 自然语言处理 算法
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(10)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(10)
121 0
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(14)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(14)
132 0
|
存储 自然语言处理 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(6)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(6)
118 0
|
存储
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(9)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(9)
|
存储 算法 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(11)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(11)
112 0
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(15)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(15)
112 0
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(12)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(12)
|
存储 自然语言处理
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(5)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(5)
149 0
|
算法
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(8)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(8)
|
自然语言处理 算法 Java
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(4)
带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(4)