首先把一个文本块分析成一个个单独的词(term),为了后面的倒排索引做准备。然后标准化这些词为标准形式,提高它们的“可搜索性”,这些工作是分析器(analyzers)完成的。一个分析器(analyzers)是一个组合,实现以下三个功能:
- 字符过滤器:字符串经过字符过滤器(character filter)处理,他们的工作是在标记化之前处理字符串。字符过滤器能够去除HTML标记,或者转换
&
为and
- 分词器:分词器(tokenizer)被标记化成独立的词,一个简单的分词器(tokenizer)可以根据空格或逗号将单词分开。
- 词元过滤器:每个词都通过所有标记过滤(token filters)处理,他可以修改词(例如将
Quick
转为小写),去掉词(例如像a
、and
、the
等),或者增加词(例如同义词像jump
和leap
)。
Elasticsearch提供了很多内置的字符过滤器,分词器和标记过滤器。这些可以组合来创建自定义过滤器以应对不同的需求。
分析器
POST _analyze
{
"analyzer": "standard",
"text": "this is a test"
}
使用standard分析器,该结果返回this is a test
,在这个分词器下,将会分析成this
,is
,a
,test
四个词。
使用自定义分词器
POST _analyze
{
"tokenizer": "keyword",
"filter": ["lowercase"],
"char_filter": ["html_strip"],
"text": "this is a <b>Test</b>"
}
结果返回:
{
"tokens": [
{
"token": "this",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "is",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "a",
"start_offset": 8,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "test",
"start_offset": 10,
"end_offset": 14,
"type": "<ALPHANUM>",
"position": 3
}
]
}
使用keyword
分词器、lowercase
词元过滤器、html_strip
字符过滤器,这三个部分组成一个分词器。
上面的结果返回:
{
"tokens": [
{
"token": "this is a test",
"start_offset": 0,
"end_offset": 21,
"type": "word",
"position": 0
}
]
}