1)分词的概念
分词Search是一个构建于Lucene之上的优秀的分布式全文检索引擎(服务器),它是使用Java开发的,提供基于RESTful风格的Web服务接口。表面上我们只要将一段冗长的要检索的目标数据和一串关键字文本丢给它就完事了,事实上ES却不是直接使用完整的关键字文本在完整的目标数据中查找的,它们都要经过一个步骤:拆分成一个个单词、字或词组。
2)了解ES中的分词器(Analyzer)
ES中文本的拆分或者说分词是通过分词器完成的,ES中的分词器主要有standard
(ES的默认分词器,将单词转成小写形式,去除标点符号,支持中文【单字分割】)、simple
(通过非字母的字符分割文本,将单词转为小写形式,同时去除数字类型的字符)和whitespace
(仅去除空格,不支持中文)。当然ES中的分词器不止这些,这里不再一一列举。
3)使用ES中的分词功能
为了直观的看到ES的分词情况,我们可以使用工具对ES发送一些分词请求,看看ES对不同文本的分词结果。
使用standard分词器
首先使用ES中的standard分词器,它也是ES中默认的分词器。我们可以发送一个URL为localhost:9200/_analyze
的post请求,然后在请求体中填入如下JSON数据:
{
"analyzer": "standard",
"text": "I bought a computer,8761元"
}
解释:analyzer
字段指定需要的分词器,这里我们使用的是standard
分词器(支持中文,简单按字分词),它是支持中文分词的;text
字段指定要拆分的文本,这里是"I bought a computer,8761元";
执行结果如下,可以看到ES分词器为我们拆分成了六个最小词元(逗号被去掉了,同时所有的字母都转为小写),中文包含在内:
{
"tokens": [
{
"token": "i",
"start_offset": 0,
"end_offset": 1,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "bought",
"start_offset": 2,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "a",
"start_offset": 9,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "computer",
"start_offset": 11,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "8761",
"start_offset": 20,
"end_offset": 24,
"type": "<NUM>",
"position": 4
},
{
"token": "元",
"start_offset": 24,
"end_offset": 25,
"type": "<IDEOGRAPHIC>",
"position": 5
}
]
}
使用simple分词器
同样的JSON数据,我们把analzer
改成simple分词器:
{
"analyzer": "simple",
"text": "I bought a computer,8761元"
}
返回结果变成了五个词元,可以看到simple分词器也是支持中文分词的,但是注意标点符号与数字都被去除了,同时所有字母转小写:
{
"tokens": [
{
&