如何将单词的一部分与父单词匹配?例如:我需要将“eese”或“heese”与“cheese”这个词匹配。
实现这一点的最佳方法是使用一个edgeNGram令牌过滤器与两个reverse令牌过滤器相结合。因此,首先您需要定义一个reverse_analyzer在索引设置中调用的自定义分析器,如下所示。然后你可以看到我已经声明了一个字符串字段,它your_field带有一个子字段suffix,它定义了我们的自定义分析器。
PUT your_index
{
"settings": {
"analysis": {
"analyzer": {
"reverse_analyzer": {
"tokenizer": "keyword",
"filter" : ["lowercase", "reverse", "substring", "reverse"]
}
},
"filter": {
"substring": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 10
}
}
}
},
"mappings": {
"your_type": {
"properties": {
"your_field": {
"type": "string",
"fields": {
"suffix": {
"type": "string",
"analyzer": "reverse_analyzer"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以索引一个带有“cheese”的测试文档,如下所示:
PUT your_index/your_type/1
{"your_field": "cheese"}
Run Code Online (Sandbox Code Playgroud)
当此文档被索引时,该your_field.suffix字段将包含以下标记:
eseeseeeseheesecheese索引时发生的情况cheese如下:
keyword标记生成器将记号化的单个令牌,=>cheeselowercase令牌滤波器将把令牌小写=>cheesereverse令牌滤波器将扭转令牌=>eseehcsubstring令牌滤波器将产生长度为1的不同的令牌至10 => ,e,es,ese,,eseeeseeheseehc reverse标记过滤器将再次反转所有标记 => e, se, ese, eese, heese,cheese所以我们最终可以在该子字段中搜索eese(或任何后缀cheese)并找到我们的匹配项
POST your_index/_search
{
"query": {
"match": {
"your_field.suffix": "eese"
}
}
}
Run Code Online (Sandbox Code Playgroud)
=> 生成我们刚刚在上面索引的文档。
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |