技术内幕
分词
分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行分词的一种技术。
Elasticsearch包含各种分词,你甚至可以自己写插件进行自己的分词。通过我们使用的比较多的分词器:
- Standard :就是无脑的一个一个词(汉字)切分,英文通过空格切分,特殊字符 空格,@,切分文本。“,”不切分。
- English : 对英文更加智能,可以识别单数负数,大小写,过滤stopwords(例如“the”这个词)等
- IK:中文分词器。支持各种中文短语分词,不是硬生生按单字分词。
- keyword_chinese_collator:是一个特殊的分词插件,理论上它并不是一个分词器,它主要提供功能是针对中文的自然语言排序。也就是音序排序。
我们通常开发对对于有分词要求的字段通常情况下均是使用Standard分词器。
在Elasticsearch的众多搜索语法中按照分词来划分的话可以分为分词查询和非分词查询
分词查询的字段必须是:分词字段
非分词查询的字段则可是分词字段也可不是分词字段。
上面我们提到的
Name MatchQuery 查询 就是典型的分词字段和分词查询。
Email WildcardQuery 查询 就是典型的非分词字段,它比较特殊的地方是它只支持不分词的字段。
TermQuery 是一个典型的即可用于分词字段查询又可用于非分词查询的语法。
我们在只单独查询一个人 性别为 男 的情况下,只需要根据我们刚刚说过的方法去非分词的Gender字段中查询即可。但是假设有这么一个属性叫 “证书”,一个人可能拥有很多证书,我们在查询的时候可能并不能完全输入他所拥有的全部证书。
Certificate:英语四级,普通话六级,驾驶证。
这个时候我们在搜索的时候可能只会输入英语四级,或者驾驶证。但是我们却很想搜索这个人。这个时候我们就需要将Certificate字段进行分词存储。然后搜索的时候通过类似SQL的IN的方法进行查询。
public void TermQuery()
{
IQuery filtered = new TermsFilter("Certificate", ["英语四级","驾驶证"]);
var result = Helper.Search(filtered);
}