Elasticsearch 简明教程
Elasticsearch - Analysis
在搜索操作过程中处理查询时,分析模块会分析任何索引中的内容。该模块由分析器、分词器、分词器过滤器和字符过滤器组成。如果没有定义分析器,则默认情况下,内置的分析器、标记、过滤器和分词器会向分析模块注册。
在以下示例中,我们在未指定其他分析器时使用标准分析器。它将根据语法分析句子,并生成句子中使用的单词。
POST _analyze
{
"analyzer": "standard",
"text": "Today's weather is beautiful"
}
在运行以上代码时,我们得到响应,如下所示:-
{
"tokens" : [
{
"token" : "today's",
"start_offset" : 0,
"end_offset" : 7,
"type" : "",
"position" : 0
},
{
"token" : "weather",
"start_offset" : 8,
"end_offset" : 15,
"type" : "",
"position" : 1
},
{
"token" : "is",
"start_offset" : 16,
"end_offset" : 18,
"type" : "",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 19,
"end_offset" : 28,
"type" : "",
"position" : 3
}
]
}
Configuring the Standard analyzer
我们可以使用各种参数配置标准分析器来满足我们的自定义要求。
在以下示例中,我们配置标准分析器让 max_token_length 为 5。
为此,我们首先使用具有 max_length_token 参数的分析器创建了一个索引。
PUT index_4_analysis
{
"settings": {
"analysis": {
"analyzer": {
"my_english_analyzer": {
"type": "standard",
"max_token_length": 5,
"stopwords": "_english_"
}
}
}
}
}
然后我们使用文本应用分析器,如下所示。请注意标记如何不显示,因为它开头有两个空格,结尾有两个空格。对于单词“is”,它开头有一个空格,结尾有一个空格。考虑所有这些,它成为 4 个带有空格的字母,并且这不会使它成为一个单词。至少在开头或结尾处应该有一个非空格字符,才能使它成为一个单词。
POST index_4_analysis/_analyze
{
"analyzer": "my_english_analyzer",
"text": "Today's weather is beautiful"
}
在运行以上代码时,我们得到响应,如下所示:-
{
"tokens" : [
{
"token" : "today",
"start_offset" : 0,
"end_offset" : 5,
"type" : "",
"position" : 0
},
{
"token" : "s",
"start_offset" : 6,
"end_offset" : 7,
"type" : "",
"position" : 1
},
{
"token" : "weath",
"start_offset" : 8,
"end_offset" : 13,
"type" : "",
"position" : 2
},
{
"token" : "er",
"start_offset" : 13,
"end_offset" : 15,
"type" : "",
"position" : 3
},
{
"token" : "beaut",
"start_offset" : 19,
"end_offset" : 24,
"type" : "",
"position" : 5
},
{
"token" : "iful",
"start_offset" : 24,
"end_offset" : 28,
"type" : "",
"position" : 6
}
]
}
各种分析器及其描述的列表在以下所示的表中给出 −
S.No |
Analyzer & Description |
1 |
Standard analyzer (standard) 为此分析器可以设置停用词和 max_token_length。默认情况下,停用词列表为空,而 max_token_length 为 255。 |
2 |
Simple analyzer (simple) 此分析器由小写标记化程序组成。 |
3 |
Whitespace analyzer (whitespace) 此分析器由空格标记化程序组成。 |
4 |
Stop analyzer (stop) 可以配置 stopwords 和 stopwords_path。默认情况下,stopwords 初始化为英语停用词,stopwords_path 包含包含停用词的文本文件的路径。 |
Tokenizers
标记化程序用于从 Elasticsearch 中的文本生成标记。可以通过考虑空格或其他标点符号将文本分解为标记。Elasticsearch 拥有大量内置标记化程序,可用于自定义分析器。
下面展示了一个标记化程序的示例,该标记化程序在每遇到一个非字母字符时将文本分解为词条,但它也会将所有词条小写 −
POST _analyze
{
"tokenizer": "lowercase",
"text": "It Was a Beautiful Weather 5 Days ago."
}
在运行以上代码时,我们得到响应,如下所示:-
{
"tokens" : [
{
"token" : "it",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
},
{
"token" : "was",
"start_offset" : 3,
"end_offset" : 6,
"type" : "word",
"position" : 1
},
{
"token" : "a",
"start_offset" : 7,
"end_offset" : 8,
"type" : "word",
"position" : 2
},
{
"token" : "beautiful",
"start_offset" : 9,
"end_offset" : 18,
"type" : "word",
"position" : 3
},
{
"token" : "weather",
"start_offset" : 19,
"end_offset" : 26,
"type" : "word",
"position" : 4
},
{
"token" : "days",
"start_offset" : 29,
"end_offset" : 33,
"type" : "word",
"position" : 5
},
{
"token" : "ago",
"start_offset" : 34,
"end_offset" : 37,
"type" : "word",
"position" : 6
}
]
}
下表列出了标记化程序及其说明 −
S.No |
Tokenizer & Description |
1 |
Standard tokenizer (standard) 这构建在基于语法的标记化程序上,可以为此标记化程序配置 max_token_length。 |
2 |
Edge NGram tokenizer (edgeNGram) 可以为此标记化程序设置 min_gram、max_gram、token_chars 等设置。 |
3 |
Keyword tokenizer (keyword) 这将整个输入作为输出生成,并且可以为此设置 buffer_size。 |
4 |
Letter tokenizer (letter) 这捕获整个单词,直到遇到非字母字符为止。 |