关键词:term, token, index, mapping
index,mapping是理解ela原理的两个关键概念。
index
首先,我们可以在kibana或curl命令行方式任意输入关键字进行全文检索是基于ela内部对信息存储的方式。一种称为倒排索引的方式(网上很多介绍这个概念,一看就懂)。了解了它又自然而然明白了文本的词、句在被索引前需要经过合适方式的处理。
elasticsearch对词句的分析(三个过程组合而成)
character filter(字符过滤:去除无用标记html)
tokenizer(分词器:根据分隔符断词)
token filter(表征过滤:转换小写,去词,增加词)
内建分析器:
标准分析器
简单分析器
空格分析器
语言分析器
当我们索引一个文档时,全文字段会被分析为单独的词用以创建倒排索引。当我们在全文字段搜索时,也要让查询字符串经过同样的分析流程处理,确保这些词在索引中存在。
就是说,原文经过分析后以合适的语法语言形式(比如大写变小写,复数变单数)保存。而我们进行查询时的输入也需要经过这样的转换才能匹配。
为了保证document的每个字段field都能以正确的格式存储索引,这就需要在创建索引时通过mapping定义,来规定不同字段的格式类型,如何被索引等。
Mapping映射
当Elasticsearch 在你的文档中探测到一个新的字符串字段,它将自动设置它为全文string字段并用standard分析器分析。
也许我们想要一个更适合这个数据的语言分析器。或者不做任何分析,只存储确切值。为了达到这种效果,必须通过mapping人工设置这些字段。
创建索引时配置映射
“index参数控制字符串以何种方式被索引
analyzed: 分析并索引,会导致分词,大小写等变化
not_analyzed: 索引,但不分析,内容和指定值完全一致
no:不索引, 不会被搜索到
类型说明
根据官方文档
PUT /gb
{
"mappings": {
"tweet": { # <-- tweet对应 type
"properties": {
"tweet": { # <-- 对应具体的字段名(下面包含三个参数名type, index, analyzer)
"type": "string", ## string类型默认index值为analyzed
"analyzer": "english" ## 指明使用英语分析器
},
"date": {
"type": "date"
},
"name": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
}
}
原有mapping增加
PUT /gb/_mapping/tweet
{
"properties": {
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
}
测试映射
GET /gb/_analyze?field=name
{
"text": "Black-cats"
}
输出结果:
{
"tokens": [
{
"token": "black",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "cats",
"start_offset": 6,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}