ngram
, 类似一个向右移动的游标窗口, 把窗口中看到的部分内容进行索引. token_chars
默认包含所有字符, 如果设置为 letter
, 则对每个词分别执行(不会出现跨词的窗口). 要求 max_gram
比 min_gram
最多长一位.
edge_ngram
只从每个分段的边缘开始(不会出现词中的窗口). max_gram
可以比 min_gram
长任意位.
例如, 当 min_gram =2, max_gram=3
, "中华人民"
在两个 tokenizer 的分词情况如下:
ngram: 中华
, 中华人
, 华人
, 华人民
edge_ngram: 中华
, 中华人
DELETE /demo
PUT /demo
{
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"type": "custom",
"tokenizer": "my_ngram"
},
"my_edge_ngram_analyzer": {
"type": "custom",
"tokenizer": "my_edge_ngram"
}
},
"tokenizer": {
"my_ngram": {
"type": "ngram",
"min_gram": 2,
"max_gram": 3,
"token_chars": [
"letter"
]
},
"my_edge_ngram": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 5,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"properties": {
"s1": {
"type": "text",
"analyzer": "my_ngram_analyzer"
},
"s2": {
"type": "text",
"analyzer": "my_edge_ngram_analyzer"
}
}
}
}
POST /demo/_doc/1
{
"s1": "中华人民共和国 劳动法第一章第一节"
}
GET /demo/_analyze
{
"field": "s1",
"text": "中华人民共和国 劳动法第一章第一节"
}
POST /demo/_doc/2
{
"s2": "中华人民共和国 劳动法第一章第一节"
}
GET /demo/_analyze
{
"field": "s2",
"text": "中华人民共和国 劳动法第一章第一节"
}
# only s1
GET /demo/_search
{
"query": {
"multi_match": {
"query": "共和国",
"fields": ["s1", "s2"]
}
}
}
# s1 and s2
GET /demo/_search
{
"query": {
"multi_match": {
"query": "劳动法",
"fields": ["s1", "s2"]
}
}
}