《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