版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
在文档在加入倒排索引之前,会对数据进行一系列的分析。基本分为以下几个步骤。
概述
*字符过滤---使用字符过滤器转变字符。
*文本切分为分词---将文本切分为单个或多个分词。
*分词过滤---使用分词过滤器转变每个分词。
*分词索引---将这些分词存储到索引中。
以上几个步骤可以参考下图:
字符过滤器可以将 特定的的字符序列转变为其他的字符序列,比如将 I love u 2 转换为I love you too.
文本切分为分词,实际上是利用分词器将文本切分为分词,英文可以表示为token,比如 share your experience with NoSql and big data technologies分解为share,your,experience,with,NoSql,and,big,data,technologies.在分词完成后并不是直接对token建立倒排索引,而是将每个分词运用分词过滤器,分词作为输入,输入到分词过滤器中,根据需要进行修改、添加或者是删除,最为常用的分词过滤器小写分词过滤器,这也是为了保证在搜索词条“nosql”的时候可以找回“NoSql”。另外还有其他两种常用的分词过滤器,一种是停用词分词过滤器,可以删除停用词。另一种是同义词分词过滤器,比如讲token"tools"作为“technologies”作为同义词进行添加。
在分词经历了零个或者是多个分词过滤器后,它们被发送到Lucene进行文档的索引。
对这些分析器的设置可以在索引创建时,可以在elasticsearch配置文件中进行配置,还可以在映射中指定某个字段的分析器。
在索引创建时添加分析器
代码语言:javascript复制curl -XPOST 'localhost:9200/index' -d '
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1
},
"mappings":{}
}'
在setting中可以对索引的分析进行设置。
代码语言:javascript复制curl -XPOST 'localhost:9200/index' -d '
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1,
"index": {
"analysis": {
"analyzer": {
"myCustomAnalyzer": {
"type": "custom",
"tokenizer": "myCustomTokenizer",
"filter": ["myCustomFilter1", "myCustomFilter2"],
"char_filter": ["myCustomCharFilter"]
}
},
"tokenizer": {
"myCustomTokenizer": {
"type": "letter"
},
"myCustomNGramTokenizer": {
"type" : "ngram",
"min_gram" : 2,
"max_gram" : 3
}
},
"filter": {
"myCustomFilter1": {
"type": "lowercase"
},
"myCustomFilter2": {
"type": "kstem"
}
},
"char_filter": {
"myCustomCharFilter": {
"type": "mapping",
"mappings": ["ph=>f", " u => you ", "ES=>Elasticsearch"]
}
}
}
}
},
"mappings":{}
}'
在elasticsearch的配置中添加分析器
在索引创建的时候设置分析器,不需要重启ES就可以修改分析器,但是在es的配置中指定分析器,那么需要重启es后才能使得分析器的修改生效,在elasticsearch.yml中设置分析器。
在映射中指定某个的字段的分析器
代码语言:javascript复制{
"mappings" : {
"group" : {
"_source" : {
"enabled" : true
},
"_all" : {
"enabled" : true
},
"properties" : {
"organizer" : { "type" : "string" },
"name" : { "type" : "string","analyzer":"myCustomAnalyzer" },
}
}
}
}