分析是待全文索引的文本(比如像email的内容)转换为能添加到倒排索引里面供搜索的词条或者词语的过程。通过分析器来执行分析的过程,分析器要么使用ES内置的分析器要么为每个索引定制一个分析器。
"The QUICK brown foxes jumped over the lazy dog!"
拿上面这段话来举个例子,在索引时,内置的English分析器首先将其转换为没有重复的词条。然后将每个词条转换为小写字母、去掉常见的停词(the)、将词语转换为它们的词干(foxes → fox, jumped → jump, lazy → lazi)。最终下面的词语被添加到倒排索引里面:
[ quick, brown, fox, jump, over, lazi, dog ]
每一个映射的类型为text的字段都可以设置它自己的分析器:
- PUT my_index
- {
- "mappings": {
- "_doc": {
- "properties": {
- "title": {
- "type": "text",
- "analyzer": "standard"
- }
- }
- }
- }
- }
在索引时,如果字段没有设置任何分析器,ES将会查找索引设置的名字为default的分析器,如果也没有找到在,则使用默认的standard 分析器。
相同的分析过程被用在全文索引查询时的查询字符串,比如match query将会把查询字符串转换为相同格式的词语,就像它们存储在倒排索引时一样。
举个例子,比如用户可能搜索下面这句话:
"a quick fox"
当使用English分析器分析之后会得到如下的词语:
[ quick, fox ]
即使查询字符串中使用的原始单词没有出现在原始文本中(quick vs QUICK, fox vs foxes),因为我们使用了相同的分词器作用于索引和搜索,查询字符串的词语精确的匹配了索引文本在存储在倒排索引中的词语,也意味着这次查询将会匹配我们的样例文档。
通常情况下,相同的分析器会用在索引时和搜索时,全文索引查询比如match query将会使用映射中字段定义的分析器。
通过以下步骤来确定搜索时字段具体使用的分析器: