ES的数字类型的text默认的分词器是StandardAnalyzer,该分词器会将"123456789"(比如手机号)分词成"123456789",所以如果查询"123","345"的时候,会找不到文档,但是ES的StandardAnalyzer 支持配置max_token_length,将该值改为1,可以实现单字分词的效果,如下分析文本有示例。可以应用于如根据手机号的一部分搜索文档的功能,但是每次配置比较繁琐,所以创建了onecharstandard的插件。下面演示正常配置过程:
PUT yourindex
{
"mappings": {
"properties": {
"mobile": {
"type": "text",
"analyzer": "custom_onecharstandard",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"custom_onecharstandard": {
"type": "standard",
"max_token_length": 1
}
}
}
}
}
//分词成1,2,3,4,5,6,7,8
POST _analyze
{
"tokenizer": {
"type": "standard",
"max_token_length": 1
},
"text": "12345678"
}
//分词成12345678整体
POST _analyze
{
"analyzer": "standard",
"text": "12345678"
}
//doc1
POST yourindex/_doc
{
"mobile": "1"
}
//doc2
POST yourindex/_doc
{
"mobile": "2"
}
//doc3
POST yourindex/_doc
{
"mobile": "12"
}
//doc4
POST yourindex/_doc
{
"mobile": "21"
}
//doc5
POST yourindex/_doc
{
"mobile": "123"
}
-
可以使用手机号中的一部分(如一般常用为后四位)搜索文档。注意必须是match_phrase(slop默认是0)短语搜索,不能是match搜索。因为match搜索(operator默认是OR)会查出不在mobile里面的内容。
term docId 1 1,2,3,5 2 2,3,4,5 3 5 //match查询会查询全部,doc1到doc5。因为operator默认是OR的关系。 GET yourindex/_search { "query": { "match": { "mobile": "12" } } } //match_phrase查出只包含12的文档。分词效果是1,2,必须同时包括1,2的文档,且保证顺序不变。此时只有一个,查出doc3 GET yourindex/_search { "query": { "match_phrase": { "mobile": "12" } } } //该效果和match_phrase类似,operator配置成and GET yourindex/_search { "query": { "match": { "mobile": { "operator": "and", "query":"12" } } } } //查不到,因为没有这个分词文档 GET yourindex/_search { "query": { "term": { "mobile": { "value": "12" } } } } //查不到,因为没有这个分词文档 GET yourindex/_search { "query": { "term": { "mobile": { "value": "12" } } } } //只查到12文档doc3 GET yourindex/_search { "query": { "term": { "mobile.keyword": { "value": "12" } } } }
-
因为配置了多字段fields:keyword,也可以用term做精确值查询。
GET yourindex/_search
{
"query": {
"term": {
"mobile.keyword": "123"
}
}
}
但是这种方式需要在创建索引的时候在mapping和settings中配置analyzer,比较不方便,因此该插件提供了一个新的Analyzer:onecharstandard
//创建索引时可以直接配置,无需在settings里再构造自定义analyzer
PUT yourindex
{
"mappings": {
"properties": {
"mobile": {
"type": "text",
"analyzer": "onecharstandard",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
https://www.elastic.co/guide/en/elasticsearch/plugins/current/intro.html
-
执行 zip task。
-
把elasticsearch-plugins-0.0.1.jar包移动到ESPlugin-es7.15.1-0.0.1.zip文件中。
-
安装:elasticsearch-plugin.bat install file:///D:/ELK/ESPlugin-es7.15.1-0.0.1.zip
-
重启
elasticsearch-plugin.bat list
elasticsearch-plugin.bat remove ESPlugin
官方文档 Analysis Standard Analyzer
Character Filter | Tokenizer | Token Filter |
---|---|---|
无 | Standard Tokenizer | Lower Case Token Filter |
Stop Token Filter |
Standard Analyzer由Standard Tokenizer和两个Token Filter组成。
Standard Tokenizer基于Unicode Text Segmentation算法,lowercase token filter是把大写转小写,stop token filter是移除停用词,类似的效果如下:
//会分为2 quick brown foxes jumped over lazy dog bone,其中大写转小写,并且the停用词被移除。
POST _analyze
{
"tokenizer": "standard",
"filter" : ["lowercase","stop"],
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}